String readInt() { if (tok.nature != Token.INT) error("entier", tok) ; String r = Integer.toString(tok.asInt) ; step() ; return r ; } String echo(String i1, Token tok, String i2) { switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: return "(" + i1 + tok + i2 + ")" ; } error("Impossible !!!", tok) ; return "" ; } |
String samir() { String i1 = readInt() ; switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: Token op = tok ; step() ; return echo(i1, op, samir()) ; case Token.EOF : return i1 ; default: error("opérateur", tok) ; return "" ; // Not Reached } } |
String doOscar(String dejavu) { switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: Token op = tok ; step() ; int i2 = readInt() ; return doOscar(echo(dejavu, op, i2)) case Token.EOF : return r ; default: error("opérateur", tok) ; return "" ; // Not Reached } } String oscar() { return doOscar(readInt()) ; } |
S → int E eof
E → op int E
E → ε |
while
.
String oscar() { String r = readInt() ; while (tok.nature != Token.EOF) { switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: Token op = tok ; step() ; String i = readInt() ; r = echo(r, op, i) ; break; default: error("opérateur", tok) ; } } return r ; } |
private String parseF() { return readInt() ; } private String parseP() { String r = parseF() ; while (tok.nature == Token.MUL || tok.nature == Token.DIV) { Token op = tok ; step() ; String f = parseF() ; r = echo(r,op,f) ; } return r ; } private String parseE() { String r = parseP() ; while (tok.nature == Token.ADD || tok.nature == Token.SUB) { Token op = tok ; step() ; String p = parseP() ; r = echo(r,op,p) ; } return r ; } String instit() { String r = parseE() ; if (tok.nature != Token.EOF) error("EOF", tok) ; return r ; } |
int calc(int i1, Token tok, int i2) { switch (tok.nature) { case Token.ADD: return i1+i2 ; case Token.SUB: return i1-i2 ; case Token.MUL: return i1*i2 ; case Token.DIV: return i1/i2 ; } error("Impossible !!!", tok) ; return 0 ; } |
String pretty = new Translate(lexer).instit() ; int r = new Translate(new Lexer (new StringReader (pretty))).universel() ; |
int doUniversel() { if (tok.nature == Token.OPAR) { step() ; int i1 = doUniversel() ; Token op = null ; switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: op = tok ; break ; default: error("opérateur", tok) ; } step() ; int i2 = doUniversel() ; if (tok.nature != Token.CPAR) error("parenthèse fermante", tok) ; step() ; return calc(i1, op, i2) ; } else if (tok.nature == Token.INT) { int i = tok.asInt ; step() ; return i ; } else { error("entier ou parenthèse ouvrante", tok) ; return 0 ; // Not Reached } } int universel () { int r = doUniversel() ; if (tok.nature != Token.EOF) error("EOF", tok) ; return r ; } |
S → E eof
E → int
E → ( E op E ) |