/** Parses: * ::= { } | | {( )} * ::= | | * @param token first token in input stream to be parsed; remainder in Lexer named in. */ private AST parseTerm(Token token) { if (token instanceof Op) { Op op = (Op) token; if (! op.isUnOp()) error(op,"unary operator"); return new UnOpApp(op, parseTerm(in.readToken())); } if (token instanceof Constant) return (Constant) token; AST factor = parseFactor(token); Token next = in.peek(); if (next == LeftParen.ONLY) { in.readToken(); // remove next from input stream AST[] exps = parseArgs(); // including closing paren return new App(factor,exps); } return factor; }