Pipeline du Compilateur
Scanner
Tokenisation avec Re/Flex
Parser
Grammaire GLR avec Bison
AST
Représentation et visitors
Binding
Portées et identifiants
Typage
Vérification sémantique
Desugaring
Simplification de l'AST
Escapes
Variables capturées
LLVM IR
Traduction intermédiaire
Chronologie du Projet
Présentation de Tiger
Découverte du langage, du compilateur et de son architecture
Scanner, Parser et AST
Analyse lexicale, grammaire et construction de l'arbre syntaxique
Bindings
Scoped map, gestion des portées et résolution des identifiants
Type Checking
Vérification des expressions, déclarations, records et tableaux
Traduction LLVM
Transformation de l'AST typé en représentation intermédiaire LLVM
Extensions et Finalisation
Garbage collector, debugger et consolidation de la suite de tests
Architecture en Couches
// Grammaire Bison et construction de l'AST
%glr-parser
exp:
INT { $$ = make_IntExp(@$, $1); }
| exp "+" exp { $$ = make_OpExp(@$, $1, ast::OpExp::Oper::add, $3); }
;
// Visitors pour l'analyse sémantique
class Binder : public ast::DefaultVisitor {
void operator()(ast::SimpleVar& e) override;
};
class TypeChecker : public ast::DefaultVisitor {
const Type* type(ast::Typable& e);
};
// Traduction de l'AST vers LLVM IR
class Translator : public ast::DefaultConstVisitor {
llvm::Value* translate(const ast::Ast& node);
llvm::IRBuilder<> builder_;
};
Défis Techniques
Portées et Identifiants
Mise en place d'un scoped map et d'un binder pour relier chaque utilisation à sa déclaration, tout en respectant les différents espaces de noms du langage.
Système de Types
Vérification des expressions, fonctions, records, tableaux et valeurs nil. Les erreurs sémantiques sont collectées et rattachées aux emplacements du code source.
Mémoire et Closures
Analyse d'échappement des variables capturées et gestion des liens statiques lors de la traduction LLVM, complétées par l'intégration d'un garbage collector.
Tests et Débogage
Développement en équipe d'une suite de tests dédiée, ajout d'un debugger et utilisation des représentations textuelles de l'AST et de LLVM IR pour diagnostiquer les erreurs.
Synthèse du Projet
Travail réalisé
À partir d'une base pédagogique constituée de code à compléter, l'équipe a développé les différentes étapes du compilateur : analyse lexicale et syntaxique, construction de l'AST, résolution des identifiants, vérification des types, analyse d'échappement et traduction vers LLVM IR. Le travail a également inclus l'écriture des tests, ainsi que l'intégration d'un garbage collector et d'un debugger.
Ce que le projet m'a apporté
Ce projet m'a permis de comprendre concrètement le fonctionnement d'une chaîne de compilation et les interactions entre ses différentes étapes. Il m'a aussi appris à évoluer dans une base de code C++ conséquente, à appliquer des design patterns comme Visitor, Factory et Singleton, à diagnostiquer des erreurs sur plusieurs couches et à travailler en équipe.