REPUBLIQUE DU CAMEROUN REPUBLIC OF CAMEROON
Paix- Travail-Patrie Peace –Work-Fatherland
Université de Douala The University of Douala
Faculté des Sciences Faculty of science
TPE INF 325 : RAPPORT DE PROJET
Thème :
CREATION D’UN COMPILATEUR
Réalisé par Groupe 21
Sous la direction de Mr Fonkoua Kevin
1
Année Académique 2023-2025
NOMS ET PRENOMS MATRICULE
NZOYEM SILATCHOM GILLEAUX HANNS
19S35899
YOUBISSIE SIEWE ACHILLE RONIC
TCHAMBA TCHAKOUNTE EDWIN
KENMEUGNE MODJO ANTHELME 18S10642
NJIBATCHIE DE WANDJI YANNICK CLOÉE 21S57104
NGOUEZE MEFOWOUA ZOANNY HULDA 21S57083
DJONMAILA PYTHAGORE 22S74013
DZEGA NAOMI ERICA 22S76785
Membre du Groupe 21
groupe :
2
SOMMAIRE
I. INTRODUCTION
II. CONCEPTION DU COMPILATEUR
III. PROBLÈMES RENCONTRÉS ET SOLUTIONS
IV. RÉSULTATS ET TESTS
V. CONCLUSION ET PERSPECTIVES
3
I. INTRODUCTION
Durant ce projet, nous avons travaillé sur la conception d'un compilateur, qui transforme
le code d'un langage nomme inventé Cecil pour l'occasion, en code C. en utilisant le générateur
d'analyseur lexical LEX et le générateur d'analyseur syntaxique YACC (Yet Another Compiler
Compiler ).
II. CONCEPTION DU COMPILATEUR
La première partie a consisté en l'écriture d'une grammaire au format d'Antlr, qui respecte
l'ensemble des contraintes. Elle ne permet pas encore de supporter tout ce qui était imposé dans le
sujet, mais nous avons fait de notre mieux pour obtenir le plus de fonctionnalités supportées.
La grammaire est la suivante
Grammaire
::= veut dire « se derive en »
programme ::= déclaration, fonction
déclaration ::= type, identifiant [ = <expression> ]
type ::= int, float, string, booleen,
identifiant ::= [a-zA-Z_][a-zA-Z0-9_]*
expression ::= terme [ { + | - } terme ]*
terme ::= facteur [ { * | / | % } facteur ]*
facteur ::= identifiant | littéral | ( expression )
littéral ::= [0-9]+ | [0-9]+\.[0-9]+, ’caractère’, "chaine", true, false
fonction ::= type identifiant ( [ paramètres ] ) { déclaration, instruction }
<paramètres> ::= type identifiant [ , paramètres ]
instruction ::= affectation, appel_fonction, si, tantque, pour, stop, contunue, bloc
affectation ::= identifiant = expression
appel_fonction ::= identifiant ( [ arguments ] )
arguments ::= expression [ , arguments ]
si ::= si ( condition ) instruction [ sinon instruction ]
condition ::= expression
tantque ::= tantque ( condition ) instruction
pour ::= for ( initialisation ; condition ; incrémentation ) instruction
initialisation ::= affectation
incrémentation ::= affectation
bloc ::= { instruction }
4
Un compilateur est constitué de plusieurs composants interconnectés :
Dans un premier temps nous avons réaliser l’analyseur lexical qui détecte les mots
typés (tokens) spécifiques à notre langage (tel que décrit au-dessus) et affiche à l’écran un
message qui indique le mot typé (token) lu. Une fois l’analyseur lexicographique correctement
développé, on va modifier la spécification lexicale afin de passer ces mots typés à YACC.
Dans un deuxième temps on va réaliser l’analyseur syntaxique qui analyse notre langage
de type C et produit comme sortie le code assembleur correspondant.
Analyse lexicale : Segmente le code source en tokens
compréhensibles par le compilateur.
LEX est un outil qui, à partir de la description de la lexicographie d'un langage (données
d'entrée) génère un analyseur lexicographique associé. Cet analyseur généré est un programme C.
Analyseur
Chaîne d'entrée lexicographique Chaîne de sortie
du langage
(exécutable )
Les spécifications de l'utilisateur fournies comme données de LEX sont converties dans un
programme qui reconnaît une série de terminaux (tokens) et exécute, en plus, des fragments de
code (actions) fournis aussi par l'utilisateur.
Spécifications Analyseur
lexicographique
lexicales du
LEX du langage
langage
(programme C )
Actions en C
Fig.1 Générateur de l'analyseur lexical.
L'analyseur lexicographique doit ensuite être compilé pour être utilisé.
Fig.2 Utilisation de l'analyseur lexical.
5
Analyse syntaxique : Vérifie que le code respecte la
grammaire du langage.
YACC : générateur d'analyseurs syntaxiques
YACC - Yet Another Compiler Compiler
Le flux de données d'entrée utilisé par différents programmes présente une structure bien
définie. En fait, tout programme peut être vu comme un analyseur syntaxique qui accepte un
certain "langage d'entrée". Un "langage d'entrée" peut être aussi compliqué qu’un langage de
programmation ou aussi simple qu’une chaîne de numéros.
YACC est un instrument qui, à partir de la description de la syntaxe du "langage d'entrée"
génère l’analyseur syntaxique associé. Les utilisateurs spécifient la structure du langage d’entrée
et des fragments de code en C qui doivent être exécutés chaque fois qu’une structure est
reconnue. Si le « langage d’entrée » est un langage informatique, le code C effectue généralement
une traduction de la structure du langage source (d’entrée) en des instructions assembleur de la
machine d’exécution.
- Analyse sémantique : Valide les significations et les relations entre les éléments du code.
- Génération de code : Traduit le code intermédiaire en instructions machines.
- Optimisation : Améliore l'efficacité du code généré.
Technologies utilisées : Yacc et lex detaillee expliciter plus haut3. Développement
Pour développer le compilateur, une approche modulaire a été adoptée :
- Étape 1 : Développement de l'analyseur lexical à l'aide de LEX
- Étape 2 : Implémentation de l'analyse syntaxique avec YACC
- Étape 3 : Analyse sémantique et détection d'erreurs logiques.
- Étape 4 : Génération et optimisation du code final.
Chaque étape a été testée individuellement pour garantir son bon fonctionnement.
III. 4. PROBLÈMES RENCONTRÉS ET SOLUTIONS
Le projet a présenté plusieurs défis, notamment :
- Gestion des erreurs syntaxiques complexes : Résolu grâce à une meilleure gestion des
exceptions dans l'analyseur syntaxique.
- Optimisation inefficace du code généré : Améliorée par l'utilisation d'algorithmes avancés
d'optimisation.
6
- Complexité croissante avec l'ajout de nouvelles fonctionnalités : Réduite grâce à une
architecture modulaire et scalable.
IV. 5. RÉSULTATS ET TESTS
Le compilateur développé a permis de traduire avec succès des programmes écrits en Cecil en un
format exécutable. Les tests effectués incluent :
- Tests unitaires pour chaque composant.
- Tests d'intégration pour valider l'interopérabilité des composants.
- Tests de performance pour évaluer l'efficacité du compilateur.
Les résultats obtenus montrent une précision de compilation de [XX]% et des performances
optimisées.
V. 6. CONCLUSION ET PERSPECTIVES
Ce projet a permis de construire un compilateur fonctionnel pour le langage Cecil, tout en
explorant les différentes étapes nécessaires à la compilation. Les résultats obtenus sont
encourageants, bien que certaines optimisations et fonctionnalités supplémentaires soient encore
envisageables. Les perspectives futures incluent :
- Ajout de fonctionnalités avancées au langage Cecil.
- Amélioration de l'optimisation du code généré.
- Développement d'un environnement de développement intégré (IDE) pour Cecil.