Architecture du Compilateur Galois¶
Vue d'Ensemble¶
┌─────────────────────────────────────────────────────────────────────┐
│ Source (.gal) │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Lexer (Scanner) │
│ • Analyse lexicale │
│ • Tokenisation │
│ • Détection des erreurs lexicales │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Parser │
│ • Analyse syntaxique │
│ • Construction de l'AST │
│ • Détection des erreurs syntaxiques │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Vérificateur │
│ • Analyse sémantique │
│ • Vérification des types │
│ • Construction de la table des symboles │
│ • Génération des warnings │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Générateur IR │
│ • Conversion AST → IR │
│ • Optimisations simples │
│ • Génération des fonctions │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Générateur LLVM │
│ • Conversion IR → LLVM IR │
│ • Déclaration des fonctions externes │
│ • Génération des structures │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Compilateur Natif │
│ • Appel à clang/gcc │
│ • Linkage avec runtime │
│ • Génération de l'exécutable │
└─────────────────────────────────────────────────────────────────────┘
Structure des Modules¶
src/
├── main.rs # Point d'entrée CLI
├── lib.rs # Déclaration des modules publics
│
├── error/ # Gestion des erreurs
│ └── mod.rs # Erreur, Warning, Diagnostics, Snippet
│
├── lexer/ # Analyse lexicale
│ ├── mod.rs # Exports publics
│ ├── scanner.rs # Tokenisation
│ └── token.rs # Définition des tokens
│
├── parser/ # Analyse syntaxique
│ ├── mod.rs # Exports publics
│ ├── parser.rs # Construction AST
│ └── ast.rs # Définition de l'AST
│
├── semantic/ # Analyse sémantique
│ ├── mod.rs # Exports publics
│ ├── checker.rs # Vérification des types
│ ├── types.rs # Système de types
│ └── symbols.rs # Table des symboles
│
├── ir/ # Représentation intermédiaire
│ ├── mod.rs # IRModule, IRInstruction, IRValeur
│ └── generator.rs # Génération IR depuis AST
│
├── codegen/ # Génération de code
│ └── llvm.rs # Génération LLVM IR
│
├── compiler/ # Compilation native
│ └── native.rs # Appel clang/gcc, linkage
│
├── runtime/ # Runtime
│ ├── gc.rs # Ramasse-miettes
│ ├── collections/ # Collections runtime
│ └── galois_runtime.c # Runtime C
│
├── debugger/ # Support debug
│ ├── debugger.rs # Interface débogueur
│ └── dwarf.rs # Génération DWARF
│
├── doc/ # Génération documentation
│ └── generateur.rs # Génération HTML
│
├── package/ # Gestion des paquets
│ ├── gestionnaire.rs # Gestion projets
│ └── manifeste.rs # galois.toml
│
└── pipeline/ # Pipeline de compilation
├── mod.rs # Pipeline principal
└── etapes.rs # Étapes configurables
Structures de Données Principales¶
Token (Lexer)¶
pub enum Token {
// Littéraux
Entier, Décimal, Texte, Booléen, Nul,
// Mots-clés
Si, Alors, Sinon, Fin, TantQue, Pour, ...
// Opérateurs
Plus, Moins, Étoile, Slash, ...
// Types
EntierType, DécimalType, TexteType, ...
// Délimiteurs
ParenthèseOuvrante, ParenthèseFermante, ...
}
pub struct TokenAvecPosition {
pub token: Token,
pub position: Position,
}
AST (Parser)¶
pub enum ExprAST {
LittéralEntier(i64, Position),
LittéralDécimal(f64, Position),
LittéralTexte(String, Position),
Identifiant(String, Position),
Binaire { op: OpBinaire, gauche: Box<ExprAST>, droite: Box<ExprAST>, position: Position },
AppelFonction { appelé: Box<ExprAST>, arguments: Vec<ExprAST>, position: Position },
AccèsMembre { objet: Box<ExprAST>, membre: String, position: Position },
Lambda { paramètres: Vec<ParamètreAST>, corps: BlocAST, position: Position },
// ...
}
pub enum InstrAST {
Déclaration { mutable: bool, nom: String, type_ann: Option<TypeAST>, valeur: Option<ExprAST>, position: Position },
Affectation { cible: Box<ExprAST>, valeur: Box<ExprAST>, position: Position },
Si { condition: Box<ExprAST>, bloc_alors: BlocAST, branches_sinonsi: Vec<(ExprAST, BlocAST)>, bloc_sinon: Option<BlocAST>, position: Position },
// ...
}
Types (Sémantique)¶
pub enum Type {
// Primitifs
Entier, Décimal, Texte, Booléen, Nul, Rien,
// Collections
Tableau(Box<Type>, Option<usize>),
Liste(Box<Type>),
Dictionnaire(Box<Type>, Box<Type>),
Ensemble(Box<Type>),
Tuple(Vec<Type>),
// Spéciaux
Fonction(Vec<Type>, Box<Type>),
Classe(String, Option<String>),
Interface(String),
Inconnu,
Variable(u64),
// FFI
CInt, CLong, CDouble, CChar,
Pointeur(Box<Type>),
PointeurVide,
}
Table des Symboles¶
pub enum GenreSymbole {
Variable { type_sym: Type, mutable: bool },
Fonction { paramètres: Vec<(String, Type)>, type_retour: Type, est_async: bool },
Classe { parent: Option<String>, interfaces: Vec<String>, champs: HashMap<String, Type>, méthodes: HashMap<String, MéthodeClasseSymbole>, constructeur: Option<MéthodeClasseSymbole>, est_abstraite: bool },
Interface { méthodes: HashMap<String, MéthodeClasseSymbole> },
Module { symboles: HashMap<String, GenreSymbole> },
}
pub struct TableSymboles {
portées: Vec<HashMap<String, Symbole>>,
}
IR (Représentation Intermédiaire)¶
pub enum IRInstruction {
Allocation { variable: String, type_var: IRType },
Affecter { variable: String, valeur: IRValeur },
Retourner { valeur: Option<IRValeur> },
BranchementConditionnel { condition: IRValeur, alors: String, sinon: String },
Saut { cible: String },
AppelFonction { fonction: String, arguments: Vec<IRValeur>, destinataire: Option<String> },
// ...
}
pub enum IRValeur {
Entier(i64),
Décimal(f64),
Texte(String),
Variable(String),
Opération(IROp, Box<IRValeur>, Option<Box<IRValeur>>),
Appel(String, Vec<IRValeur>),
// ...
}
pub struct IRFonction {
pub nom: String,
pub paramètres: Vec<(String, IRType)>,
pub type_retour: IRType,
pub blocs: Vec<IRBloc>,
}
Système de Diagnostics¶
Erreurs¶
pub struct Erreur {
pub genre: GenreErreur,
pub position: Position,
pub message: String,
pub snippet: Option<Snippet>,
pub suggestion: Option<String>,
pub code: Option<&'static str>,
}
pub enum GenreErreur {
Lexicale(String),
Syntaxique(String),
Sémantique(String),
Type(String),
Runtime(String),
}
Warnings¶
pub struct Warning {
pub genre: GenreWarning,
pub position: Position,
pub message: String,
pub snippet: Option<Snippet>,
pub suggestion: Option<String>,
}
pub enum GenreWarning {
VariableNonUtilisée,
ParamètreNonUtilisé,
CodeMort,
ConversionImplicite,
Shadowing,
ImportInutilisé,
}
Diagnostics (Multi-erreurs)¶
Module Pipeline¶
Architecture¶
pub struct Pipeline {
source: String,
fichier: String,
}
impl Pipeline {
pub fn depuis_fichier(chemin: &str) -> Resultat<Self>;
pub fn lexer(&self) -> Resultat<RésultatPipeline<Vec<TokenAvecPosition>>>;
pub fn parser(&self) -> Resultat<RésultatPipeline<ProgrammeAST>>;
pub fn vérifier(&self) -> Resultat<RésultatPipeline<()>>;
pub fn ir(&self) -> Resultat<RésultatPipeline<IRModule>>;
pub fn llvm(&self) -> Resultat<RésultatPipeline<Vec<u8>>>;
}
Étapes Configurables¶
pub trait Étape {
type Sortie;
fn exécuter(&mut self, source: &str, fichier: &str) -> Resultat<Self::Sortie>;
}
pub struct ÉtapeLexer { ... }
pub struct ÉtapeParser { ... }
pub struct ÉtapeVérification { ... }
pub struct ÉtapeIR { ... }
pub struct ÉtapeLLVM { ... }
Runtime C¶
Le fichier galois_runtime.c fournit:
- Fonctions d'affichage (
gal_afficher_*) - Allocation mémoire (
malloc,free) - Gestion du ramasse-miettes
- Fonctions utilitaires pour les collections
Points d'Extension¶
Ajouter un Nouveau Type¶
- Ajouter le token dans
lexer/token.rs - Ajouter le type dans
semantic/types.rs - Mettre à jour le parser dans
parser/parser.rs - Ajouter la vérification dans
semantic/checker.rs - Ajouter la génération IR dans
ir/generator.rs - Ajouter la génération LLVM dans
codegen/llvm.rs
Ajouter une Nouvelle Instruction¶
- Ajouter le/les tokens dans
lexer/token.rs - Ajouter la construction AST dans
parser/ast.rs - Implémenter le parsing dans
parser/parser.rs - Ajouter la vérification dans
semantic/checker.rs - Ajouter la génération IR dans
ir/generator.rs - Ajouter la génération LLVM dans
codegen/llvm.rs
Ajouter un Backend Alternatif¶
- Créer un nouveau module dans
src/backend/ - Implémenter la conversion depuis l'IR
- Ajouter l'option dans le CLI
Dépendances¶
Le projet utilise un minimum de dépendances externes:
- Aucune dépendance externe pour le cœur du compilateur
- Optionnel:
inkwellpour une interface LLVM plus robuste
Tests¶
Les tests sont situés dans tests/integration.rs et couvrent:
- Lexer: tokens, mots-clés, opérateurs
- Parser: déclarations, fonctions, classes
- Vérificateur: types, POO, polymorphisme
- IR: génération
- Packages: manifeste, gestionnaire