/* Terminals (tokens returned by the scanner). */ terminal String ID, LPAREN, RPAREN, EQUAL, SEMI, PLUS, MULTI; terminal Integer NUMBER; /* Non terminals */ non terminal Expr expr; non terminal Statement statement; non terminal Program program; non terminal Assignment assignment; /* Precedences */ precedence left PLUS; precedence left MULTI; /* The grammar */ program ::= statement:e {: RESULT = new Program(e); :} | statement:e1 program:e2 {: RESULT=new Program(e1, e2); :} ; statement ::= assignment:e SEMI {: RESULT = e; :} ; assignment ::= ID:e1 EQUAL expr:e2 {: RESULT = new Assignment(e1, e2); :} ; expr ::= expr:e1 PLUS:e expr:e2 {: RESULT = new Expr(e1, e2, e); :} |expr:e1 MULTI:e expr:e2 {: RESULT = new Expr(e1, e2, e); :} | LPAREN expr:e RPAREN {: RESULT = e; :} | NUMBER:e {: RESULT= new Expr(e); :} | ID:e {: RESULT = new Expr(e); :} ;