diff options
Diffstat (limited to 'tp2-files/Calculatrice.jj')
-rw-r--r-- | tp2-files/Calculatrice.jj | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tp2-files/Calculatrice.jj b/tp2-files/Calculatrice.jj new file mode 100644 index 0000000..965aeb3 --- /dev/null +++ b/tp2-files/Calculatrice.jj @@ -0,0 +1,58 @@ +// 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: (<DIGIT>)+ ("." (<DIGIT>)*)? > // 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 <EOL>)* <EOF> +// (<EOL> est défini ci-dessus, <EOF> est reconnu automatiquement) +void boucle(): +{ double a; } +{ + ( + a=expression() <EOL> { System.out.println(a); } + )* + <EOF> +} + +// 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=<NUMBER> { return Double.parseDouble(t.toString()); } +} |