Skip to content

Latest commit

 

History

129 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Compilateur C

Un compilateur C complet qui transforme du code source C en code assembleur RISC-V.

Description

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 :

  1. Analyse lexicale : Tokenisation du code source
  2. Analyse syntaxique : Construction de l'arbre de syntaxe abstraite (AST)
  3. Analyse sémantique : Vérification des types et gestion de la table des symboles
  4. Génération de code intermédiaire : Transformation en représentation CIMPLE
  5. Génération de code assembleur : Production de code RISC-V

Prérequis

  • clang ou gcc (compilateur C)
  • bison (générateur de parseur)
  • flex (générateur d'analyseur lexical)
  • make (outil de build)

Installation sur macOS

brew install bison flex

Installation sur Linux (Debian/Ubuntu)

sudo apt-get install bison flex build-essential

Compilation

Pour compiler le projet :

make

Cela génère l'exécutable main qui est le compilateur.

Options de compilation

  • make clean : Supprime tous les fichiers générés
  • make format : Formate le code source avec clang-format
  • make help : Affiche l'aide

Utilisation

Syntaxe de base

./main -o <fichier_sortie.s> <fichier_entree.c>

Options disponibles

  • -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

Exemples

Compiler un fichier C simple :

./main -o output.s input.c

Afficher l'AST pendant la compilation :

./main -a -o output.s input.c

Afficher la table des symboles :

./main -tos -o output.s input.c

Fonctionnalités supportées

Types de données

  • int : Entiers
  • float : Nombres flottants
  • char : Caractères
  • void : Type vide
  • Tableaux multi-dimensionnels
  • Pointeurs

Opérateurs

  • Arithmétiques : +, -, *, /, %
  • Relationnels : <, >, <=, >=, ==, !=
  • Logiques : &&, ||, !
  • Binaires : &, |, ^, ~, <<, >>
  • Affectation : =, +=, -=, *=, /=, etc.
  • Incrémentation/Décrémentation : ++, --

Structures de contrôle

  • if / if-else : Conditions
  • while : Boucles conditionnelles
  • for : Boucles itératives
  • do-while : Boucles avec condition en fin
  • return : Retour de fonction
  • break / continue : Contrôle de boucle

Fonctions

  • Définition de fonctions
  • Appels de fonctions
  • Paramètres multiples
  • Récursivité
  • Retour de valeurs

Fonctions d'E/S

  • printf() : Affichage de chaînes
  • printint() : Affichage d'entiers
  • printfloat() : Affichage de flottants

Limitations connues

  • 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

Architecture du compilateur

Composants principaux

  1. Lexer (lexer.l) : Analyse lexicale, tokenisation du code source
  2. Parser (parser.y) : Analyse syntaxique selon la grammaire C, construction de l'AST
  3. Tree (tree.c/h) : Structure de données pour l'AST, fonctions de construction et manipulation
  4. Cimplify (cimplify.c/h) : Transformation de l'AST en représentation intermédiaire CIMPLE
  5. Cimple (cimple.c/h) : Représentation intermédiaire simplifiée
  6. Cimple RISC-V (cimple_riskV.c/h) : Génération de code assembleur RISC-V à partir de CIMPLE

Tests

Le projet inclut une suite de tests dans le répertoire test/.

Exécuter les tests

cd test
./test.sh

Les tests compilent plusieurs fichiers C de test et génèrent les fichiers assembleur correspondants dans test/out/.

Fichiers de test

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

Exemple de code compilable

int main() {
    int a, b, c;
    a = 10;
    b = 5;
    c = a + b;
    
    printf("Result: ");
    printint(c);
    printf("\n");
    
    return 0;
}

Auteurs

  • MILON Ethan
  • LE BERRE Clément

Licence

Ce projet est un projet éducatif de compilation.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages