// 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 → term ( "+" term | "-" term )* double expression(): { double a,b; } { a=term() ( "+" b=term() { a += b; } | "-" b=term() { a -= b; } )* { return a; } } // Terme d'une somme ou différence // term → factor ( "*" factor | "/" factor )* double term(): { double a,b; } { a=factor() ( "*" b=factor() { a *= b; } | "/" b=factor() { a /= b; } )* { return a; } } // Gestion du "+" et "−" unaires // factor → power | "+" power | "-" power double factor(): { double a; } { a=power() { return a; } | "+" a=power() { return a; } | "-" a=power() { return -a; } } // Opération puissance (associative à droite) // power → element ( "^" factor )? double power(): { double a,b; } { a=element() ( "^" b=factor() { a = Math.pow(a,b); } )? { return a; } } // Élément d'un calcul (nombre ou expression parenthésée) double element(): { Token t; double a; } { t= { return Double.parseDouble(t.toString()); } | "(" a=expression() ")" { return a; } }