Skip to content

clemlb31/Compilateur-C

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •