|
1 |
| -# Documentation du Compilateur IFCC |
| 1 | +# Execution |
| 2 | +The roles of the visitors are described in the next sections |
2 | 3 |
|
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 |
4 | 11 |
|
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 |
6 | 19 |
|
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. |
8 | 22 |
|
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. |
10 | 25 |
|
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. |
18 | 28 |
|
19 |
| - |
| 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. |
20 | 31 |
|
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. |
22 | 34 |
|
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. |
24 | 37 |
|
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 |
29 | 39 |
|
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 | + |
0 commit comments