*** empty log message ***
[IRC.git] / Robust / cup / java_cup / simple_calc / parser.cup
1 // JavaCup specification for a simple expression evaluator (w/ actions)
2
3 package java_cup.simple_calc;
4
5 import java_cup.runtime.*;
6
7 /* Terminals (tokens returned by the scanner). */
8 terminal           SEMI, PLUS, MINUS, TIMES, DIVIDE, MOD;
9 terminal           UMINUS, LPAREN, RPAREN;
10 terminal Integer   NUMBER;
11
12 /* Non terminals */
13 non terminal Object     expr_list, expr_part;
14 non terminal Integer    expr;
15
16 /* Precedences */
17 precedence left PLUS, MINUS;
18 precedence left TIMES, DIVIDE, MOD;
19 precedence left UMINUS, LPAREN;
20
21 /* The grammar */
22 expr_list ::= expr_list expr_part 
23               | 
24               expr_part;
25
26 expr_part ::= expr:e 
27               {: System.out.println("= " + e); :} 
28               SEMI              
29               ;
30
31 expr      ::= expr:e1 PLUS expr:e2    
32               {: RESULT = new Integer(e1.intValue() + e2.intValue()); :} 
33               | 
34               expr:e1 MINUS expr:e2    
35               {: RESULT = new Integer(e1.intValue() - e2.intValue()); :} 
36               | 
37               expr:e1 TIMES expr:e2 
38               {: RESULT = new Integer(e1.intValue() * e2.intValue()); :} 
39               | 
40               expr:e1 DIVIDE expr:e2 
41               {: RESULT = new Integer(e1.intValue() / e2.intValue()); :} 
42               | 
43               expr:e1 MOD expr:e2 
44               {: RESULT = new Integer(e1.intValue() % e2.intValue()); :} 
45               | 
46               NUMBER:n                 
47               {: RESULT = n; :} 
48               | 
49               MINUS expr:e             
50               {: RESULT = new Integer(0 - e.intValue()); :} 
51               %prec UMINUS
52               | 
53               LPAREN expr:e RPAREN     
54               {: RESULT = e; :} 
55               ;