Un compilateur C complet qui transforme du code source C en code assembleur RISC-V.
Ce projet est un compilateur C qui implémente un sous-ensemble significatif du langage C (basé sur C89). Il effectue une compilation complète en plusieurs étapes :
- Analyse lexicale : Tokenisation du code source
- Analyse syntaxique : Construction de l'arbre de syntaxe abstraite (AST)
- Analyse sémantique : Vérification des types et gestion de la table des symboles
- Génération de code intermédiaire : Transformation en représentation CIMPLE
- Génération de code assembleur : Production de code RISC-V
- clang ou gcc (compilateur C)
- bison (générateur de parseur)
- flex (générateur d'analyseur lexical)
- make (outil de build)
brew install bison flexsudo apt-get install bison flex build-essentialPour compiler le projet :
makeCela génère l'exécutable main qui est le compilateur.
make clean: Supprime tous les fichiers générésmake format: Formate le code source avec clang-formatmake help: Affiche l'aide
./main -o <fichier_sortie.s> <fichier_entree.c>-o <fichier>: Spécifie le fichier de sortie (assembleur RISC-V)-a: Affiche l'arbre de syntaxe abstraite (AST)-tos: Affiche la table des symboles-c: Affiche le code CIMPLE (représentation intermédiaire)-h: Affiche l'aide-version: Affiche la version
Compiler un fichier C simple :
./main -o output.s input.cAfficher l'AST pendant la compilation :
./main -a -o output.s input.cAfficher la table des symboles :
./main -tos -o output.s input.cint: Entiersfloat: Nombres flottantschar: Caractèresvoid: Type vide- Tableaux multi-dimensionnels
- Pointeurs
- Arithmétiques :
+,-,*,/,% - Relationnels :
<,>,<=,>=,==,!= - Logiques :
&&,||,! - Binaires :
&,|,^,~,<<,>> - Affectation :
=,+=,-=,*=,/=, etc. - Incrémentation/Décrémentation :
++,--
if/if-else: Conditionswhile: Boucles conditionnellesfor: Boucles itérativesdo-while: Boucles avec condition en finreturn: Retour de fonctionbreak/continue: Contrôle de boucle
- Définition de fonctions
- Appels de fonctions
- Paramètres multiples
- Récursivité
- Retour de valeurs
printf(): Affichage de chaînesprintint(): Affichage d'entiersprintfloat(): Affichage de flottants
- Pas de support des commentaires
/* */(à implémenter dans le lexer) - Pas de support des structures (
struct) - Pas de support des unions (
union) - Pas de support des énumérations (
enum) - Pas de support des
typedef - Pas de support des macros préprocesseur
- Lexer (
lexer.l) : Analyse lexicale, tokenisation du code source - Parser (
parser.y) : Analyse syntaxique selon la grammaire C, construction de l'AST - Tree (
tree.c/h) : Structure de données pour l'AST, fonctions de construction et manipulation - Cimplify (
cimplify.c/h) : Transformation de l'AST en représentation intermédiaire CIMPLE - Cimple (
cimple.c/h) : Représentation intermédiaire simplifiée - Cimple RISC-V (
cimple_riskV.c/h) : Génération de code assembleur RISC-V à partir de CIMPLE
Le projet inclut une suite de tests dans le répertoire test/.
cd test
./test.shLes tests compilent plusieurs fichiers C de test et génèrent les fichiers assembleur correspondants dans test/out/.
Les tests couvrent :
- Opérations arithmétiques (entiers et flottants)
- Structures de contrôle (if, while, for)
- Tableaux multi-dimensionnels
- Fonctions et récursivité
- Opérations logiques et relationnelles
int main() {
int a, b, c;
a = 10;
b = 5;
c = a + b;
printf("Result: ");
printint(c);
printf("\n");
return 0;
}- MILON Ethan
- LE BERRE Clément
Ce projet est un projet éducatif de compilation.