EnstCalc
Ce TP est destiné aux étudiants de la brique ??? de l'ENST. Son but est la découverte des outils flex et bison par l'implementation d'un parseur et d'un scanner simple.
Spécifications
EnstCalc est une calculatrice infixe implémentant les entiers
int du Main.C. Elle doit fournir au moins les opérations suivantes, par ordre croissant de priorité :
- = et <> non associatifs
- <, <=, >, >= non associatifs
- + et - binaires, associatifs à gauche
- * et / associatifs à gauche
-
** (puissance) associative à droite
- + et - unaires
Elle lit sur son entrée standard, et produit sur la sortie le résultat. Les commentaires sont ignorés ; ils sont introduits par
# et se termine à la fin de la ligne. Les blancs sont également ignorés. Une ligne peut-être soit vide (après suppression des blans et des commentaires), soit contenir un unique calcul.
Elle ne doit pas s'arrêter sur la première erreur de syntaxe : elle doit reporter l'erreur, ignorer le reste de la ligne, et se tenir prête pour les calculs suivants. La reprise sur erreur se fera simplement en utilisant le symbole
error de Bison.
Elle doit être capable de signaler l'emplacement d'une erreur dans une ligne de commande.
L'entrée se termine par
EOF.
Exemples
On doit pouvoir lancer les appels suivants:
$ echo "1 + 2 * 3" | ./enstcalc
7
$ echo "(((1) + 2) * 3)" | ./enstcalc
9
$ echo "# Vrai est représenté par 1, faux par 0.
-1**2 = 1" | ./enstcalc
1
$ echo "1 < 2 < 3
6 * 7" | ./enstcalc
parse error
42
Flex et bison
Flex et Bison sont disponibles sur mon compte: ~fouquier/usr/bin Vous pouvez ajouter ce répertoire dans le PATH.
La compilation s'effectue en trois étape:
- compilation du parseur (fichier .y) avec bison
- compilation du scanner (fichier .l) avec flex
- compilation des fichiers C et génération de l'exécutable.
Attention:
- les dépendances dans le Makefile doivent être faites sur les fichiers .y et .l
- Il vaut mieux compiler bison avant flex, car le fichier .l va inclure un .h généré par bison.
Pour corriger sa grammaire, utiliser le mode debug de bison et regardez le fichier .output
Conseils
Procéder par étape, ne vous occupez pas de la gestion d'erreur tout de suite. Commencez par savoir calculer.
--
GeoffroyFouquier - 13 Mar 2003
to top