diff options
Diffstat (limited to 'src/java_cup/simple_calc/parser.cup')
| -rw-r--r-- | src/java_cup/simple_calc/parser.cup | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/java_cup/simple_calc/parser.cup b/src/java_cup/simple_calc/parser.cup new file mode 100644 index 0000000..a88d900 --- /dev/null +++ b/src/java_cup/simple_calc/parser.cup @@ -0,0 +1,55 @@ +// JavaCup specification for a simple expression evaluator (w/ actions) + +package java_cup.simple_calc; + +import java_cup.runtime.*; + +/* Terminals (tokens returned by the scanner). */ +terminal SEMI, PLUS, MINUS, TIMES, DIVIDE, MOD; +terminal UMINUS, LPAREN, RPAREN; +terminal Integer NUMBER; + +/* Non terminals */ +non terminal Object expr_list, expr_part; +non terminal Integer expr; + +/* Precedences */ +precedence left PLUS, MINUS; +precedence left TIMES, DIVIDE, MOD; +precedence left UMINUS, LPAREN; + +/* The grammar */ +expr_list ::= expr_list expr_part + | + expr_part; + +expr_part ::= expr:e + {: System.out.println("= " + e); :} + SEMI + ; + +expr ::= expr:e1 PLUS expr:e2 + {: RESULT = new Integer(e1.intValue() + e2.intValue()); :} + | + expr:e1 MINUS expr:e2 + {: RESULT = new Integer(e1.intValue() - e2.intValue()); :} + | + expr:e1 TIMES expr:e2 + {: RESULT = new Integer(e1.intValue() * e2.intValue()); :} + | + expr:e1 DIVIDE expr:e2 + {: RESULT = new Integer(e1.intValue() / e2.intValue()); :} + | + expr:e1 MOD expr:e2 + {: RESULT = new Integer(e1.intValue() % e2.intValue()); :} + | + NUMBER:n + {: RESULT = n; :} + | + MINUS expr:e + {: RESULT = new Integer(0 - e.intValue()); :} + %prec UMINUS + | + LPAREN expr:e RPAREN + {: RESULT = e; :} + ; |
