init with {: System.out.println("Calculatrice avec évaluation sur AST (et location)"); prompt(); :} parser code {: static void prompt() { System.out.print("> "); } // Table de symboles (static et classe parser pour visibilité) public static java.util.Map symTab = new java.util.HashMap<>() ; // Gestion des variables non initialisées public static Integer symTabGet(String v) { Integer val = symTab.get(v); if (val!=null) return val ; System.out.println("Warning : " + v + " non initialisé"); symTab.put(v,0); // initialisation implicite return 0; } :} terminal NL, LPAR, RPAR, COMMA, FMIN, FMAX; terminal PLUS, MOINS, MULT, DIV, MOD; terminal AFFECT, CLEAR; terminal Integer ENTIER; terminal String VAR; terminal WHILE, FOR; nonterminal lignes, ligne, inst; nonterminal Exp expr; nonterminal AstList args; precedence left PLUS,MOINS; precedence left MULT,DIV,MOD; lignes ::= /* vide */ {: :} | lignes ligne {: prompt(); :} NL ; ligne ::= expr:e {: System.out.println("AST Eval=" + e.eval()); System.out.println(e.toPrint()); :} | inst {: :} | error {: /* msg ? */ :} ; inst ::= CLEAR {: symTab.clear(); :} | CLEAR VAR:v {: symTab.remove(v); :} | /* vide */ {: :} ; expr ::= ENTIER:e {: RESULT = new ExpEntier(e); RESULT.addPosition(exleft, exright); :} | LPAR:aa expr:e RPAR:zz {: RESULT = e ; RESULT.addPosition(aaxleft,zzxright); :} | expr:e1 PLUS expr:e2 {: RESULT = new ExpOpBin(e1 , '+', e2); RESULT.addPosition(e1xleft, e2xright); :} | expr:e1 MOINS expr:e2 {: RESULT = new ExpOpBin(e1 , '-', e2); RESULT.addPosition(e1xleft, e2xright); :} | expr:e1 MULT expr:e2 {: RESULT = new ExpOpBin(e1, '*', e2); RESULT.addPosition(e1xleft, e2xright); :} | expr:e1 DIV expr:e2 {: RESULT = new ExpOpBin(e1 , '/', e2); RESULT.addPosition(e1xleft, e2xright); :} | expr:e1 MOD expr:e2 {: RESULT = new ExpOpBin(e1, '%', e2); RESULT.addPosition(e1xleft, e2xright); :} | FMIN:aa LPAR expr:e1 COMMA expr:e2 RPAR:zz {: RESULT = new ExpFmin(e1,e2); RESULT.addPosition(aaxleft, zzxright); :} | FMAX:aa LPAR args:l RPAR:zz {: RESULT = new ExpFmax(l); RESULT.addPosition(aaxleft, zzxright); :} | VAR:v AFFECT expr:e {: RESULT = new ExpAff(new ExpVar(v), e); RESULT.addPosition(vxleft, exright); :} | VAR:v {: RESULT = new ExpVar(v); RESULT.addPosition(vxleft, vxright); :} | WHILE:aa expr:e1 expr:e2 {: RESULT = new ExpWhile(e1, e2); RESULT.addPosition(aaxleft, e2xright); :} | FOR:aa VAR:v ENTIER:n expr:e {: RESULT=new ExpFor(new ExpVar(v), new ExpEntier(n),e); RESULT.addPosition(aaxleft, exright); :} ; args ::= expr:e {: RESULT = new AstList(); RESULT.add(e); RESULT.addPosition(exleft, exright); :} | args:e1 COMMA expr:e2 {: RESULT = e1; RESULT.add(e2); RESULT.addPosition(e1xleft, e2xright); :} ;