diff options
| author | David A. Madore <david+git@madore.org> | 2017-01-23 14:15:12 +0100 | 
|---|---|---|
| committer | David A. Madore <david+git@madore.org> | 2017-01-23 14:20:51 +0100 | 
| commit | c598a4810da9e79398c5fd97666cd3ba328081a0 (patch) | |
| tree | 472360049d70b5687ba994f7b02a3ef0adf10164 /tp2-files | |
| parent | 698d956eda9997834e6473034bf2f77926c2a86f (diff) | |
| download | inf105-c598a4810da9e79398c5fd97666cd3ba328081a0.tar.gz inf105-c598a4810da9e79398c5fd97666cd3ba328081a0.tar.bz2 inf105-c598a4810da9e79398c5fd97666cd3ba328081a0.zip  | |
Copy practice handout on JavaCC from last year.
Diffstat (limited to 'tp2-files')
| -rw-r--r-- | tp2-files/Calculatrice-final.jj | 90 | ||||
| -rw-r--r-- | tp2-files/Calculatrice.jj | 58 | 
2 files changed, 148 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; } +} 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()); } +}  | 
