Pour pouvoir compiler le projet sur votre ordinateur| il vous faut installer les librairies flex et bison.
-
Sur linux (ubuntu) cela se fait par la commande :
sudo apt-get install flex bison
(ou équivalent sur d'autres distributions)
-
Sur mac ces librairies sont installées en standard. Si ce n'est pas le cas pour vous| cela peut s'installer via homebrew (cf https://brew.sh/index_fr)
brew install flex bison
-
sur windows
Utilisez une WSL.
Lors de cette apnée j'ai réalisé une grammaire et son analyseur syntaxique ainsi qu'un interpretreur de calcul.
La particularité de cette apnée est que je devais calculer la puissance et le nombre de combinaison k parmis n.
Sa difficulté résidait dans le fait que la puissance soit associative à droite et non à gauche comme la majorité des opérations de calcul et le calcul de la combinaison qui n'est pas trivial comme les autres.
Dans un 1er temps j'ai d'abord trouvé une grammaire, principalement par tatonnement. J'identifiais un besoin de la grammaire (par exemple: chaque ligne fini par un ;) puis j'essayais de l'integrer à la grammaire, et cela pour chaque étape.
Ensuite la programmation de l'analyseur syntaxique était plutot simple car quasiment automatique à partir de la table LL. La grammaire étant LL2 et non LL1, nous avions à disposition une fonction pour regarder en avant dans le flux de lexème.
Pour finir l'interpreteur de calcul, j'ai décidé de tout calculer à la volée et de ne pas m'encombrer d'un AST qui aurait été bien plus long à réaliser. Egalement j'ai fait le choix de créer une fonction erreur qui s'occupe d'afficher le token qui pose problème et d'arreter le programme
voici la table LL1 (en CSV dans le ficher 1er.csv)
| LL(1) | ; |
+ |
- |
/ |
* |
= |
^ |
( |
) |
a |
var |
_ |
C |
$ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
On peut voir qu'il y a plusieurs conflits notament à G et E que l'on résout en regardant le lexeme suivant
Les principales difficultés rencontrées pendant cette apnée était principalement lié à la construction de la grammaire.Beacoup de tatonnement pour arriver au final à une grammaire qui fonctionne correctement. Entre chaque grammaire la reconstruction de la table LL1 prenait beacoup de temps et je ne voyais pas forcement directement que la grammaire avait une erreur.
Par exemple dans une itération de ma grammaire
R0 valait S
De même pour le - unaire
Egalement un oubli bête dans la grammaire (le C de la combinaison) m'a fait reprendre une bonne partie de la grammaire.
Enfin la lutte contre les segfault en cas de ; manquant à la fin a été pour moi une assez grande frustration et la solution que j'ai trouvé actuellement ne me satisfait pas vraimant. Le fait de simplement lookup(2) == NULL au debut permet d'empêcher efficacement les segfaults mais sans grand lien avec la grammaire.