Utilisation des outils Lex et Yacc
Le répertoire Bool contient un programme de
"calculette booléenne" : l'utilisateur entre au clavier une
séquence de caractères représentant une expression
booléenne, le programme vérifie que la syntaxe de
cette séquences est
correcte, puis calcule et affiche sa valeur ("true" ou "false").
Ce
programme a été écrit avec les outils Lex et Yacc.
Effectuez les opérations décrites dans la suite et
répondez par écrit aux questions sur la fiche de compte-rendu ...
Partie 1
- Copiez l'ensemble des fichiers du répertoire Bool dans un répertoire de votre choix
- Examinez les fichiers suivants :
- Bool.l : quels sont les
lexèmes autorisés (les symboles terminaux de la
grammaire) ?
- Bool.y : quelles sont les
règles de la grammaire qui définissent une expression
booléenne ? Dans
cette grammaire l'opérateur '+' est-il plus ou moins prioritaire
que
l'opérateur '*' ?
- main.c : programme principal
- Compilez en exécutant la commande make
- Examinez les fichiers produits, notamment :
- y.output :
fichier de trace, décrit les tables de l'analyseur LALR(1)
construit par Yacc.
- Bool.c :
l'analyseur LALR(1) construit par Yacc (en C, pas très lisible
...)
- Exécutez le programme Bool en essayant différentes
expressions booléennes (correctes ou non).
Partie 2
- Modifiez les fichiers Bool.l et Bool.y pour ajouter à la
grammaire un opérateur "not" (négation). Cet
opérateur devra
être plus prioritaire que tous les autres.
- Compilez et testez le nouveau programme obtenu.
Partie 3
- Modifiez les fichiers Bool.l et Bool.y pour ajouter à la
grammaire un opérateur "IF e1 THEN e2 ELSE e3". Cet
opérateur prend
en argument 3 expressions booléennes, renvoie une expression
booléenne (e2 lorsque e1 est vraie, e3 sinon), et est moins
prioritaire que tous les autres.
- Compilez et testez le nouveau programme obtenu.
Partie 4
- Ajoutez maintenant un opérateur "IF e1 THEN e2" qui prend
en argument 2 expressions booléennes et renvoie une expression
booléenne (e2 lorsque e1 est vraie, faux sinon).
- Compilez. Que se passe t'il ? D'où vient le
problème ?
- Corrigez le problème en modifiant la syntaxe des
opérateurs "IF e1 THEN e2 ELSE e3" et "IF e1 THEN e2".