Travaux dirigés de traduction : 8. Prise en main de Bison
Objectif
Le but de ce TD est réaliser des manipulations simples à
l'aide de Bison.
La documentation
officielle de Bison (en anglais) est disponible pour vous aider.
On met à votre disposition les fichiers suivants :
- Makefile : pour
compiler plus facilement votre production. Ne pas hésiter
à regarder de près ce fichier.
- calcu.lex : pour
construire l'analyseur lexical
- calcu.y : c'est le
fichier qui est utilisé par Bison pour créer l'analyseur
syntaxique. Notez les actions sémantiques présentes dans
ce fichier.
- Que fait le programme calcu ainsi obtenu ?
- A quoi sert l'option -d de bison ? Si on
ajoute l'option -v, on obtient un fichier
supplémentaire. Que contient-il ?
- Que fait la
déclaration %union { int entier; float
reel; } dans le fichier calcu.y ?
- Modifiez le code bison pour qu'on puisse
utiliser les opérateurs - (binaire et unaire) et
/, ainsi que les parenthèses. L'analyse devra respecter
les priorités et associativités habituelles.
- On souhaite pouvoir utiliser dans la calculette 26 variables, désignées par les
lettres majuscules. Modifiez le code flex de façon à ce que, quand on
lit un nom de variable, l'analyseur lexical renvoie un
token IDENT, et stocke dans yylval
le nom de la variable.
- Modifiez le code bison pour qu'on puisse
affecter à une variable la valeur d'une
expression. Exemple : A=1.2+(0.7*6) Ajoutez dans une fonction
auxiliaire du code C pour exécuter ces affectations à
l'aide d'un tableau déclaré comme variable globale.
- Modifiez le code bison pour qu'on puisse utiliser
les variables dans les expressions. Exemple :
1.2+(A*6)
- Ajoutez la possibilité d'utiliser dans les expressions les
fonctions mathématiques log, exp,
sin, cos, tan, sqrt et pow.
- Ajoutez la possibilité d'utiliser le symbole $ dont la valeur est le résultat de la
ligne précédente.
Écrire un programme Bison qui détermine si son
entrée est un palindrome, c'est-à-dire une suite de lettres
identique qu'on la lise de gauche à droite ou de droite à gauche,
comme radar.