public boolean parse (String usage) {
        Debug.trace(usage);
        boolean status = true;
        source = new TokenString(usage, delimiters);
        argList = new ArgList();
        
        // First token. Usage is optional.
        String token = source.next();
        if (token.equalsIgnoreCase("usage")) {
            token = source.next();
        }
        if (token.equals(":")) {
            token = source.next();
        }
        programName = token;
        
        // Each time program name occurs is another use spec.
        while (token.equals(programName)) {
            operand = new ArgOperand().literal();
            operand.setName(programName);
            argList.goHome();
            argList.endSouth();
            argList.addSouth(operand);
            token = parseUseSpec();
        }
        if ("options".equalsIgnoreCase(token)) {
            if (! parseOptionsSection()) {
                return false;
            }
        }
        if ("error".equals(token)) {
            return false;
        }
        for (ArgOperand operand : varList) {
            Debug.trace("np var operand: " + operand);
        }
        for (ArgOperand operand : litList) {
            Debug.trace("np lit operand: " + operand);
        }
        for (ArgOption option : optionList) {
            Debug.trace("np     option:  " + option);
        }
        Debug.trace(argList.toString());
        String u = argList.buildUsage();
        Debug.trace(u);
        return status;
    }