// Options pour JavaCC options { LOOKAHEAD=1; FORCE_LA_CHECK=true; } // Fonction principale PARSER_BEGIN(Calculatrice) public class Calculatrice { public static void main(String args[]) throws ParseException { Calculatrice parser = new Calculatrice(System.in); parser.mainloop(); } } PARSER_END(Calculatrice) // Caractères à ignorer (espaces) SKIP: { " " | "\r" | "\t" } // Définitions pour le lexeur TOKEN: { < NUMBER: ()+ ("." ()*)? > // Un nombre en décimal | < DIGIT: ["0"-"9"] > // Un chiffre | < EOL: "\n" > // Fin de ligne } // Boucle principale: lire des expressions sur une ligne jusqu'à fin de fichier // mainloop → (expression )* // ( est défini ci-dessus, est reconnu automatiquement) void mainloop(): { double a; } { ( a=expression() { System.out.println(a); } )* } // Expression (axiome de la grammaire de la calculatrice) // expression → element ( "+" element | "-" element | "*" element | "/" element )* double expression(): { double a,b; } { a=element() ( "+" b=element() { a += b; } | "-" b=element() { a -= b; } | "*" b=element() { a *= b; } | "/" b=element() { a /= b; } )* { return a; } } // Élément d'un calcul double element(): { Token t; } { t= { return Double.parseDouble(t.toString()); } }