options { LOOKAHEAD=1; } PARSER_BEGIN(Parser) public class Parser {} PARSER_END(Parser) SKIP : { " " | "\r" | "\t" } TOKEN : { < EOL: "\n" > | < PLUS: "+" > | < MULTIPLY: "*" > | < LPAR: "(" > | < RPAR: ")" > | < CONSTANT: ( )+ > | < #DIGIT: ["0" - "9"] > } IASTNode Start() : { IASTNode t;} { t = exp() { return t; } } IASTNode exp() : { IASTNode l,r; Token x; } { l = term() [ r = exp() { l = new ASTAdd(l,r);}] { return l; } } IASTNode term() : { IASTNode l,r; Token x; } { l = factor() [ r = term() { l = new ASTMul(l,r);} ] { return l; } } IASTNode factor() : { IASTNode e; } { { e = new ASTNum(Integer.parseInt(token.image)); return e;} | e = exp() { return e; } }