summaryrefslogtreecommitdiffstats
path: root/tp2-files/Calculatrice-final.jj
diff options
context:
space:
mode:
authorDavid A. Madore <david+git@madore.org>2017-01-23 13:15:12 (GMT)
committerDavid A. Madore <david+git@madore.org>2017-01-23 13:20:51 (GMT)
commitc598a4810da9e79398c5fd97666cd3ba328081a0 (patch)
tree472360049d70b5687ba994f7b02a3ef0adf10164 /tp2-files/Calculatrice-final.jj
parent698d956eda9997834e6473034bf2f77926c2a86f (diff)
downloadinf105-c598a4810da9e79398c5fd97666cd3ba328081a0.zip
inf105-c598a4810da9e79398c5fd97666cd3ba328081a0.tar.gz
inf105-c598a4810da9e79398c5fd97666cd3ba328081a0.tar.bz2
Copy practice handout on JavaCC from last year.
Diffstat (limited to 'tp2-files/Calculatrice-final.jj')
-rw-r--r--tp2-files/Calculatrice-final.jj90
1 files changed, 90 insertions, 0 deletions
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: (<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 → 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=<NUMBER> { return Double.parseDouble(t.toString()); }
+| "(" a=expression() ")" { return a; }
+}