From c598a4810da9e79398c5fd97666cd3ba328081a0 Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Mon, 23 Jan 2017 14:15:12 +0100 Subject: Copy practice handout on JavaCC from last year. --- tp2-files/Calculatrice-final.jj | 90 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tp2-files/Calculatrice-final.jj (limited to 'tp2-files/Calculatrice-final.jj') diff --git a/tp2-files/Calculatrice-final.jj b/tp2-files/Calculatrice-final.jj new file mode 100644 index 0000000..9a03f39 --- /dev/null +++ b/tp2-files/Calculatrice-final.jj @@ -0,0 +1,90 @@ +// 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; } +} -- cgit v1.2.3