void ok() { if (tok.nature != Token.int) error("entier", tok) ; step() ; while (tok != Token.EOF) { switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: step() ; break ; default: error("opérateur", tok) ; } if (tok.nature != Token.int) error("entier", tok) ; step() ; } } |
while
s'exprime aisément par une
récursion terminale :
void ok() { expression() ; if (tok.nature != Token.EOF) error("EOF", tok) ; } void expression() { if (tok.nature != Token.INT) error("entier", tok) ; step() ; switch (tok.nature) { case Token.ADD: case Token.SUB: case Token.MUL: case Token.DIV: step() ; return expression() ; default: return ; } } |
Token.EOF
. Dans les autres cas, il faudrait signaler
une erreur. Mais comme ce lexème sera finalement vérifié (par la
méthode ok), on peut s'abstenir.