Skip to content

Commit 5044fa2

Browse files
change nom dev doc anglais et fr et ajoute noms du groupe dans readme
1 parent 56dd415 commit 5044fa2

File tree

4 files changed

+216
-207
lines changed

4 files changed

+216
-207
lines changed

devdoc.md

-40
This file was deleted.

readme.md

+9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44

55
The IFCC compiler is a compiler for a subset of the C programming language. It handles x86_64 and WebAssembly (WASM) architectures. It uses our own IR (Intermediate Representation) to help handle the compilation process with the different architectures and optimizations.
66

7+
## Group
8+
9+
- PALISSER Eugénie
10+
- GOUINEAUD Romane
11+
- MUHULET Mathias
12+
- SAMAIN Luc
13+
- JOUSSOT-DUBIEN Gabin
14+
- PERRIGAULT Simon
15+
716
## Build
817

918
To build the IFCC compiler, go to the `compiler` directory and use the following command:

readme_dev.md

+30-167
Original file line numberDiff line numberDiff line change
@@ -1,177 +1,40 @@
1-
# Documentation du Compilateur IFCC
1+
# Execution
2+
The roles of the visitors are described in the next sections
23

3-
## Vue d'ensemble
4+
1. Parse the arguments
5+
2. Tokenize and parse the input program
6+
3. ContinueBreakVisitor
7+
4. SymbolTableVisitor
8+
5. TypeCheckVisitor
9+
6. IRGenVisitor
10+
7. Generate the backend code
411

5-
Le compilateur IFCC est un compilateur pour un sous-ensemble du langage C, développé comme projet pédagogique. Il utilise une approche basée sur la génération de code intermédiaire (IR) puis la traduction en code assembleur x86 et WebAssembly (WAT).
12+
## Parse the arguments
13+
We have a simple command line argument parser. It takes the following arguments:
14+
- `-o <output_file>`: Specify the output file name
15+
- `-v`: Enable verbose mode, which print the symbol table in the output
16+
- `-h`: Show help message
17+
- `-w`: Generate WebAssembly code instead of x86_64
18+
- `<source_file.c>`: The input C source file to be compiled
619

7-
## Flux d'exécution
20+
## Tokenize and parse the input program
21+
The input program is tokenized and parsed using ANTLR4. The parser generates a parse tree according to our grammar written in `ifcc.g4`, which is then traversed by the visitors to perform various tasks.
822

9-
Le compilateur suit les étapes suivantes :
23+
## ContinueBreakVisitor
24+
The `ContinueBreakVisitor` is responsible for checking the usage of `continue` and `break` statements in loops. It ensures that these statements are only used inside loops. If a `continue` or `break` statement is found outside of its valid context, an error is reported.
1025

11-
1. Parse des arguments de la ligne de commande
12-
2. Tokenisation et analyse syntaxique du programme d'entrée
13-
3. Vérification des instructions `break` et `continue` avec ContinueBreakVisitor
14-
4. Construction de la table des symboles avec SymbolTableVisitor
15-
5. Vérification des types avec TypeCheckVisitor
16-
6. Génération de la représentation intermédiaire avec IRGenVisitor
17-
7. Génération du code cible (x86_64 ou WebAssembly)
26+
## SymbolTableVisitor
27+
The `SymbolTableVisitor` is responsible for creating the symbol table. It traverses the parse tree and collects information about variables, functions, and their types. It computes the adresses of the variables and also handles the scoping rules, ensuring that variables are declared and used in the correct scope. Finally, it checks that the function calls are valid and that the arguments passed to the functions match their definitions.
1828

19-
![image](pictures/schema_execution.png)
29+
## TypeCheckVisitor
30+
The `TypeCheckVisitor` is responsible for checking the types of expressions and statements in the program. It ensures that the types are compatible and that operations are performed on the correct types. It also checks for type errors, such as assigning a value of one type to a variable of another incompatible type. It writes errors if the types are incompatible and warnings if an implicit conversion is done.
2031

21-
## Architecture du Compilateur
32+
## IRGenVisitor
33+
The `IRGenVisitor` is responsible for generating the intermediate representation (IR) of the program. It traverses the parse tree and generates IR instructions for each statement and expression. The IR is a representation of the program that is easier to optimize and translate to machine code. The IR is generated in a form that is independent of the target architecture, allowing for easier optimization and code generation. Our IR uses CFG (Control Flow Graph) to represent the flow of control in the program.
2234

23-
L'architecture du compilateur est structurée selon les phases classiques de compilation:
35+
## Generate the backend code
36+
The backend code is generated using the CFGs created by the `IRGenVisitor`. The backend code is generated for the target architecture (x86_64 or WebAssembly) and is optimized for performance. The backend code generation is done using a set of rules that translate the IR instructions into the target architecture's assembly language.
2437

25-
1. **Analyse lexicale et syntaxique** : Utilisation d'ANTLR4 pour générer un parseur à partir de la grammaire définie dans `ifcc.g4`.
26-
2. **Analyse sémantique** : Plusieurs visiteurs parcourent l'AST pour effectuer des vérifications et construire des tables.
27-
3. **Génération de code intermédiaire** : Transformation de l'AST en représentation intermédiaire.
28-
4. **Génération de code cible** : Traduction de la représentation intermédiaire en assembleur x86 et WebAssembly.
38+
# Summary
2939

30-
## Grammaire Supportée
31-
32-
La grammaire définie dans `ifcc.g4` supporte:
33-
34-
- Déclarations et définitions de fonctions
35-
- Variables et types de base (int, char, double)
36-
- Expressions arithmétiques et logiques
37-
- Structures de contrôle (if-else, while)
38-
- Instructions de saut (break, continue)
39-
40-
## Visiteurs et Analyses
41-
42-
### ContinueBreakCheckVisitor
43-
- Validation de l'utilisation des instructions `break` et `continue` dans des contextes appropriés
44-
- Vérifie que ces instructions sont uniquement utilisées à l'intérieur des boucles
45-
- Signale une erreur si elles sont trouvées en dehors de leur contexte valide
46-
47-
### SymbolTableGenVisitor
48-
- Construction de la table des symboles
49-
- Enregistrement des variables avec leur type, offset et portée
50-
- Enregistrement des fonctions avec leur type et paramètres
51-
- Vérification des déclarations/utilisations
52-
- Calcul des adresses des variables en mémoire
53-
- Gestion des règles de portée (scope)
54-
- Vérification de la validité des appels de fonction et de la correspondance des arguments
55-
56-
### TypeCheckVisitor
57-
- Vérification de la cohérence des types dans les expressions
58-
- Validation des types de retour des fonctions
59-
- Vérification de compatibilité lors des affectations
60-
- Signalement d'erreurs si les types sont incompatibles
61-
- Génération d'avertissements si une conversion implicite est effectuée
62-
63-
### IRGenVisitor
64-
- Génération d'un code IR indépendant de l'architecture cible
65-
- Traitement des expressions et conversion en instructions IR
66-
- Gestion des structures de contrôle (if, while)
67-
- Construction des blocs de base et du CFG (Control Flow Graph)
68-
69-
## Représentation Intermédiaire
70-
71-
### Structure de l'IR
72-
- **CFG (Control Flow Graph)** : Représentation du flux de contrôle d'une fonction
73-
- **BasicBlock** : Suite d'instructions linéaires avec éventuellement un saut à la fin
74-
- **IRInstr** : Instructions de la représentation intermédiaire
75-
76-
### Types d'Instructions IR
77-
- Instructions arithmétiques : `Add`, `Sub`, `Mul`, `Div`, `Mod`, `UnaryMinus`
78-
- Instructions logiques : `And`, `Or`, `Not`
79-
- Instructions de comparaison : `CompareInt`
80-
- Instructions de manipulation mémoire : `Rmem`, `Wmem`
81-
- Instructions de contrôle : `Prologue`, `Epilogue`, `Call`
82-
- Instructions de chargement : `LdConstInt`, `Copy`
83-
- Instructions de manipulation des doubles : `DAdd`, `DSub`, `DMul`, `DDiv`, `DUnaryMinus`, `CompareDouble`, `LdConstDouble`, `DRmem`, `DWmem`, `DCopy`, `IntToDouble`, `DoubleToInt`
84-
85-
## Génération de Code
86-
87-
### Code x86-64
88-
- Génération d'instructions assembleur x86-64 pour Linux
89-
- Gestion de la pile et des registres
90-
- Utilisation des conventions d'appel System V AMD64 ABI
91-
92-
### Code WebAssembly
93-
- Génération de fichiers WAT (WebAssembly Text Format)
94-
- Support des opérations arithmétiques et logiques
95-
- Gestion des variables locales et mémoire
96-
- Implémentation des contrôles de flux équivalents à ceux de x86
97-
98-
## Types Supportés
99-
100-
- `int` (INT32_T)
101-
- `char` (traité comme INT32_T)
102-
- `double` (FLOAT64_T)
103-
104-
## Fonctionnalités Avancées
105-
106-
- **Optimisation des constantes** : Évaluation des expressions constantes à la compilation
107-
- **Gestion des registres virtuels** : Abstraction des registres physiques
108-
- **Multi-cibles** : Génération de code pour différentes architectures (x86, WebAssembly)
109-
- **Vérification des erreurs** : Détection d'erreurs sémantiques et rapport
110-
- **Incréments/décréments** : Support des opérateurs `++` et `--` (préfixés et postfixés)
111-
- **Opérateurs d'affectation composés** : Support de `+=`, `-=`, `*=`, `/=`, `%=`
112-
113-
## Limitations Connues
114-
115-
- Pas de support pour les structures et unions
116-
- Pas de support pour les pointeurs
117-
- Pas de support pour les tableaux
118-
- Pas d'optimisation avancée
119-
120-
## Options de Ligne de Commande
121-
122-
Le compilateur accepte les options suivantes :
123-
- `-o <output_file>` : Spécifie le nom du fichier de sortie
124-
- `-v` : Active le mode verbeux, qui affiche la table des symboles dans la sortie
125-
- `-h` : Affiche le message d'aide
126-
- `-w` : Génère du code WebAssembly au lieu de x86_64
127-
- `<source_file.c>` : Le fichier source C d'entrée à compiler
128-
129-
## Comment Compiler et Exécuter
130-
131-
Pour compiler le projet:
132-
```bash
133-
cd compiler
134-
make
135-
```
136-
137-
Pour exécuter le compilateur sur un fichier source:
138-
```bash
139-
./ifcc input.c -o output.s
140-
```
141-
142-
Pour générer du WebAssembly:
143-
```bash
144-
./ifcc input.c -w -o output.wat
145-
```
146-
147-
## Tests
148-
149-
Des tests unitaires et d'intégration sont disponibles dans le répertoire `../tests/testfiles/`. Pour exécuter les tests:
150-
151-
```bash
152-
cd compiler
153-
make test
154-
```
155-
156-
Cette commande lance le script Python `../ifcc-test.py` qui exécute tous les tests dans le répertoire `../tests/testfiles/`. Le script vérifie la sortie du compilateur par rapport aux résultats attendus.
157-
158-
Pour lancer les tests en WebAssembly:
159-
```bash
160-
make test-wat
161-
```
162-
163-
Cette commande lance le script Python `../ifcc-wat-test.py` qui exécute les tests dans le répertoire `../tests/testfiles/`. Notez que tous les tests ne passent pas en WebAssembly car c'est une version béta qui ne prend pas en charge toutes les fonctionnalités de la version x86.
164-
165-
Pour lancer des tests en particulier, il est aussi possible de faire la commande :
166-
167-
```bash
168-
python3 ifcc-test.py tests/testfiles/01_BasicStructure
169-
```
170-
171-
Pour lancer l'ensemble des tests sur les structures de bases, par exemple.
172-
173-
Commande standard :
174-
175-
```bash
176-
python3 ifcc-test.py <dossier_ou_fichier_de_test>
177-
```
40+
![image](pictures/schema_execution.png)

0 commit comments

Comments
 (0)