Le but de ce projet est de construire un compilateur pour des fichiers sources contenant une liste d’algorithmes au format ALgo et se terminant par un appel à un des algorithmes de cette liste. Seul le dernier CALL affichera le résultat final sur la sortie standard. Dans ce projet, toutes les variables et constantes sont de type entier ou booléen. Les expressions arithmétiques et booléennes seront écrites au moyen des opérateurs classiques.
Pour compiler le compilateur il vous faudra installer meson, ninja, gcc, bison, flex et criterion pour les test puis:
meson setup builddir
cd builddir
meson compile
dans ce même dossier vous pourrez utiliser notre executable ./algo. Pour plus d'information sur l'utilisation de celui-ci ./algo -h (nous avons eu utilisé getopt pour parser les options sur la ligne de commande).
Nous avons pris le parti d'utiliser un AST pour compléter la table des symboles. Avec le recul nous aurions certainement du réaliser la totalité de la création de la table des symboles lors de ce parcours de l'ast, mais par manque de temps nous sommes rester sur cette version fonctionnelle.
- Algorithmes simples
- Algorithmes appelant d'autres algorithmes
- Algorithmes récursifs
- Support total du sous ensemble d'instructions demandé soit :
- \SET; \IF (avec ou sans \ELSE); \DOWHILE; \DOFORI; \CALL; \RETURN
L'utilisation d'une fonction est soumise à une déclaration antérieure de la dite fonction (comme en C).
Pour résoudre ce problème, une idée serait de intégrer dans le langage le support des en-têtes de fonctions.
Lorsqu'une opération arithmétique ou booléenne ne contient que des constantes, le compilateur réduit l'expression en sa valeur calculée.
Après avoir réduit les expressions ne contenant que des constantes, on peut vérifier les conditions des blocs conditionnels lorsque la condition vaut une constante booléenne:
- soit elle vaut faux et dans ce cas, on utilise l'alternative au blocs à la place du bloc conditionnel.
- soit elle vaut vrai, on replace le bloc conditionnel par son corps et on supprime l'alternative.
Nous avions avant la création de l'AST commencer à implémenter la gestion des scopes pour les variables, nous avons laisser ce code cependant il n'est pas fonctionnel avec la version actuelle du au changement d'implémentation (passage de l'utilisation d'une pile à celle d'un vecteur), par manque de temps.