// 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.boucle(); } } 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 // boucle → (expression )* // ( est défini ci-dessus, est reconnu automatiquement) void boucle(): { double a; } { ( a=expression() { System.out.println(a); } )* } // Expression (axiome de la grammaire de la calculatrice) // expression → terme ( "+" terme | "-" terme )* double expression(): { double a,b; } { a=terme() ( "+" b=terme() { a += b; } | "-" b=terme() { a -= b; } )* { return a; } } // Terme d'une somme ou différence // terme → unaire ( "*" unaire | "/" unaire )* double terme(): { double a,b; } { a=unaire() ( "*" b=unaire() { a *= b; } | "/" b=unaire() { a /= b; } )* { return a; } } // Gestion du "+" et "−" unaires // unaire → puissance | "+" puissance | "-" puissance double unaire(): { double a; } { a=puissance() { return a; } | "+" a=puissance() { return a; } | "-" a=puissance() { return -a; } } // Opération puissance (associative à droite) // puissance → element ( "^" unaire )? double puissance(): { double a,b; } { a=element() ( "^" b=unaire() { 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; } }