Projet CompilmasterACAD
Projet CompilmasterACAD
Projet CompilmasterACAD
1. Introduction :
Le but de ce projet est de réaliser un mini-compilateur en effectuant les différentes phases de la compilation
à savoir l'analyse lexicale en utilisant l'outil FLEX et l'analyse syntaxico-sémantique en utilisant l'outil BISON,
du langage « MiniLang». Les traitements parallèles concernant la gestion de la table des symboles ainsi que le
traitement des différentes erreurs doivent être également réalisés lors des différentes phases d'analyse du
processus de compilation.
La structure générale d’un programme écrit en langage MiniLang se décompose de trois divisions qui contiennent
plusieurs sections et qui elles-mêmes sont formées de plusieurs instructions. La structure générale est présentée
dans la figure suivante :
Division
Section 1
Instruction 1
Instruction N
Section n
Instruction 1
Instruction N
1. Les divisions
1.1 En-tête d’un programme : La première division représente d’entête d’un programme écrit
en langage MiniLang. Elle permet d’identifier le programme. Chaque programme
commence par les deux lignes suivantes :
IDENTIFICATION DIVISION.
PROGRAM-ID. Nom_programme.
p. 1
1.2 La partie déclaration : La partie déclaration permet de stocker toutes les variables et les
constantes utilisé par le programme.
DATA DIVISION.
WORKING-STORAGE SECTION.
Déclaration de la première variable
…
Déclaration de la Nième variable
1.3 La partie instruction : La troisième division est réservée à stocker l’ensemble des
instructions du programme.
PROCEDURE DIVISION.
Instruction 1
…
Instruction_n
PROGRAM-ID nom_du_programme
DATA DIVISION.
WORKING-STORAGE SECTION.
/* déclaration des variables */
PROCEDURE DIVISION.
/* liste des instruction */
STOP RUN
2. Les commentaires
p. 2
3. Déclarations des variables
Les déclarations de nos variables se font dans DATA DIVISION, et plus précisément dans WORKING
STORAGE SECTION. Le bloc déclaration comporte des variables et des constantes.
INTEGER : Une constante entière est une suite de chiffres. Elle peut être signée
ou non signée tel que sa valeur est entre -32768 et 32767. Si la constante entière
est signée, elle doit être mise entre parenthèses.
FLOAT : Une constante réelle est une suite de chiffres contenant le point
décimal. Elle peut être signée ou non signée. Si la constante réelle est signée, elle
doit être mise entre parenthèses.
CHAR : Une variable de type CHAR représente un caractère.
STRING : Une variable de type STRING représente une chaîne de caractères.
3.4 Déclaration des Constantes :
p. 3
CONST nom_constante TYPE.
CONST : une constante peut prendre une valeur unique correspondant à un des
types cités précédemment et qui resté inchangée tout au long du programme.
Exemple
INTEGER a INTEGER.
FLOAT a FLOAT.
a STRING.
STR
Valeurs de a possible: "chaine de caractères"
CONST a =valeur.
CONST
Valeurs de a possible: "chaine de caractères", ‘c’,5, (-6), 5,6
3.5 Identificateur
Un identificateur est une suite alpha numérique qui commence par une lettre majuscule suivie d’une
suite de chiffres et lettres minuscules. Un IDF ne doit pas contenir plus de 8 caractères.
Les noms du programme principal et des variables et des constantes sont des identificateurs.
a) Opérateurs arithmétique : +, - , * , /
b) Opérateurs logique
(expression1. AND. expression2) : le et logique.
(expression1. OR . expression2) : le ou logique.
(NOT expression) : la négation.
c) Opérateurs de comparaison
p. 4
d) Les conditions : Une condition est une expression qui renvoie une valeur booléenne. Elle peut
prendre la forme d’une expression logique, de comparaison ou une valeur booléenne.
3.7 Instructions
Affectation
Description Exemple
A=(X+7+B)/ (5,3-(-2)).
COMPUTE Idf = expression . A= ‘c’.
A="hello".
Entrées / Sorties
Description Exemple
Entrée : ACCEPT (“$”:@ idf_entier ).
ACCEPT (“ signe de formatage”: @ idf) . ACCEPT (“%”:@ idf_float ).
ACCEPT (“#”:@ idf_string ).
ACCEPT (“&”:@ idf_char ).
IF(condition):
instruction 1 IF (Aa.GE.Bb)
instruction2
Cc=E+2,6 .
ELSE :
ELSE:
instruction 3
instruction4 DISPLAY (“la valeur de A est $”: A).
END END.
Note :
Le premier bloc est exécuté ssi la condition est vérifiée.
Sinon le bloc « ELSE » sera exécuté s’il existe.
On peut avoir des conditions imbriquées.
p. 5
MOVE const TO const
instruction 1
instruction2
END
Remarque :
1- Toute instruction doit terminer par un point.
2- On ne peut lire qu’une seule variable à la fois.
3- L’instruction « READ » ne peut contenir que le format de la variable à lire.
4- Une chaine de caractère est une suite de caractères situés entre deux guillemets.
5- Un idf de type CHAR est un seul caractère situé entre deux apostrophes.
Son but est d’associer à chaque mot du programme source la catégorie lexicale à laquelle il
appartient. Pour cela, il est demandé de définir les différentes entités lexicales à l’aide d’expressions
régulières et de générer le programme FLEX correspondant.
p. 6
6. Gestion de la table de symboles :
La table de symboles doit être créée lors de la phase de l’analyse lexicale. Elle doit regrouper
l’ensemble des variables et constantes définies par le programmeur avec toutes les informations
nécessaires pour le processus de compilation. Cette table sera mises à jour au fur et à mesure de
l’avancement de la compilation. Il est demandé de prévoir des procédures pour permettre de rechercher
et d’insérer des éléments dans la table des symboles (table de hachage). Les variables structurées de
type tableau doivent aussi figurer dans la table de symboles.
Il est demandé d’afficher les messages d’erreurs adéquats à chaque étape du processus de
compilation. Ainsi, lorsqu’une erreur lexicale ou syntaxique est détectée par votre compilateur, elle doit
être signalée le plus précisément possible, par sa nature et sa localisation dans le fichier source. On
adoptera le format suivant pour cette signalisation :
Type_ de_ l’erreur, line 4, colonne 56: entité qui a générée l’erreur.
p. 7