Mini Compilateur Calculatrice
Presentation
Objectif principal : Un mini compilateur qui prend des expressions mathematiques en texte et genere du code assembleur ou les execute directement. Premier pas vers la comprehension des compilateurs.
Technologies utilisees : C avec Flex (Lex) pour l'analyse lexicale et Bison (Yacc) pour l'analyse syntaxique. Le code genere est pour une machine a pile virtuelle simple.
Fonctionnalites cles : Operations +, -, *, /, parentheses, variables, fonctions mathematiques basiques (sin, cos, sqrt). Gestion des priorites operateurs. Messages d'erreur explicites.
Livrables attendus : Un executable qui lit des expressions et sort le resultat ou le code assembleur. Fichiers .l et .y pour Flex/Bison.
Calendrier previsionnel : Trois semaines. Comprendre Flex/Bison ca prend du temps, la syntaxe est pas intuitive au debut.
Parties prenantes & criteres de succes : TP de compilation. Le prof voulait qu'on comprenne les etapes lexer -> parser -> AST -> code gen.
Le Defi
La grammaire pour gerer les priorites. Multiplication avant addition, parentheses qui changent tout... Faut ecrire la grammaire BNF correctement sinon y'a des conflits shift/reduce et Bison refuse de compiler.
La Solution
J'ai utilise une grammaire a plusieurs niveaux : expr pour + et -, term pour * et /, factor pour les nombres et parentheses. Comme ca les priorites sont gerees par la structure de la grammaire elle-meme.
Architecture Technique
Fichier calc.l pour le lexer : reconnait nombres, operateurs, noms de variables. Fichier calc.y pour le parser : construit un AST (arbre syntaxique). Module codegen.c qui parcourt l'AST et genere du code pour une machine a pile (PUSH, ADD, MUL, etc.).
Points Cles
- Lexer/Parser avec Flex/Bison
- Gestion des priorites operateurs
- Generation de code assembleur
Apercu
Resultats & Apprentissages
Le compilateur marche bien, il gere meme les erreurs proprement. J'ai vraiment compris comment un compilateur fonctionne : lexer qui decoupe en tokens, parser qui construit l'arbre, code gen qui produit le binaire. C'est demystifie.
Evolutions Futures
Ajouter des structures de controle (if, while). Variables avec types. Generer du vrai assembleur x86 au lieu d'une machine virtuelle. Peut-etre faire un petit langage de programmation complet.