// File di specifica JavaCup per un valutatore di espressioni /* In questa versione sono introdotti identificatori */ import java_cup.runtime.*; action code {: SymbolTable tabVariabili = new SymbolTable(); /* Questo codice viene inserito nella classe action interna al parser generato. In questo caso e' utilizzato per definire la symbol table */ :}; /* Simboli terminali (token restituiti dallo scanner). */ terminal PIU, MENO, PER, DIVISO; terminal UNARIO, TONDA_APERTA, TONDA_CHIUSA; terminal Integer NUMERO; terminal String IDENT; /* Non terminali */ non terminal ExprConTab expr1; non terminal Expr expr; /* Precedenze e associatività */ precedence left PIU, MENO; precedence left PER, DIVISO; precedence left UNARIO; /* Simbolo iniziale */ start with expr1; /* Produzioni */ /* La variabile expr1, con la produzione expr1 ::= expr, e' stata introdotta per svolgere un'azione quando viene completato il riconoscimento dell'intera espressione. L'azione consiste nel costruire l'oggetto di tipo ExprConTab che contiene al suo interno l'albero sintattico dell'espressione riconosciuta e la symbol table degli identificatori presenti. */ expr1 ::= expr:e {: RESULT = new ExprConTab(e, tabVariabili); :} ; expr ::= expr:e1 PIU expr:e2 {: RESULT = new PiuExpr(e1, e2); :} | expr:e1 MENO expr:e2 {: RESULT = new MenoExpr(e1, e2); :} | expr:e1 PER expr:e2 {: RESULT = new PerExpr(e1, e2); :} | expr:e1 DIVISO expr:e2 {: RESULT = new DivisoExpr(e1, e2); :} | NUMERO:n {: RESULT = new NumExpr(n); :} | IDENT:id {: RESULT = new IdExpr(id, tabVariabili); :} | MENO expr:e {: RESULT = new UnMenoExpr(e); :} %prec UNARIO | PIU expr:e {: RESULT = new UnPiuExpr(e); :} %prec UNARIO | TONDA_APERTA expr:e TONDA_CHIUSA {: RESULT = e; :} ;