Académique Documents
Professionnel Documents
Culture Documents
Thème :
PROJET DE COMPILATION
Rapport finale
Réalisé par :
-ARAB Bilal
-BELHADEF Anis
-BOUKHIMA Lilia
-BENABBES Ilyes
Promotion 2023-2024
Table des matières
1 Introduction 2
2 Analyse lexicale 2
2.1 Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 Table de symboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Analyse syntaxique 5
3.1 BISON (YACC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 Méthode de travail sur BISON . . . . . . . . . . . . . . . . . . . . . 5
4 Analyse sémantique 7
4.1 Quadruplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.2 Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.3 Les instructions réalisés . . . . . . . . . . . . . . . . . . . . . . . . . 8
5 Conclusion 11
1
1 Introduction
2 Analyse lexicale
2.1 Flex
Il existe plusieurs outils tels que Flex qui facilitent l’analyse lexicale. La struc-
ture de Flex est la suivante : du côté gauche, une expression régulière définit
comment le jeton est apparié ; du côté droit, l’action à effectuer. Les expressions
régulières du côté gauche sont appliquées de manière répétée, dans l’ordre, à la
portion suivante de la chaîne de code en entrée. Lorsqu’une correspondance est
trouvée, l’action du côté droit est exécutée. La valeur du jeton est stockée dans
yylval et le type de jeton est renvoyé (String, Identificateur, Mot clé )
yyval : yyval est une structure utilisée pour stocker la valeur associée à un
token. Par exemple, yyval.int_val pour un entier, yyval.real_val pour un
nombre à virgule flottante, et yyval.string_val pour une chaîne de caractères.
2
strcpy() : La fonction strcpy est utilisée pour copier une chaîne de caractères
dans une autre. Utilisez pour copier le texte du token (yytext) dans la structure
yyval.string.
atoi() : La fonction atoi convertit une chaîne de caractères représentant un
entier en une valeur entière.
atof() : La fonction atof convertit une chaîne de caractères représentant un
nombre à virgule flottante en une valeur réelle.
yytext : yytext est une variable dans Flex qui contient le texte correspondant
au dernier token trouvé.
yyleng : Variable qui contient la longueur du dernier token trouvé. Utiliser
pour mettre à jour la position de la colonne.
yywrap() : Fonction appelée lorsqu’il n’y a plus d’entrée à traiter. (Renvoyer
1, indiquant la fin de l’analyse lexicale).
La table des symboles est utilisée par le compilateur pour enregistrer les iden-
tificateurs et leurs attributs, ces attributs peuvent être des informations d’empla-
cement, de type de valeur ..., Notre table de symbole est mise sous forme d’un
tableau dont la structure est ainsi :
3
Table 1 – Exemples de tokens reconnus par Flex
Token Description
INTEGER Nombre entier
FLOAT Nombre flottant
IDENTIFIER Identificateur
KEYWORD_IF Mot-clé if
OPERATOR_PLUS Opérateur d’addition
SEMICOLON Point-virgule
STRING Chaîne de caractères
4
3 Analyse syntaxique
Bison est une version moderne de Yacc, le parseur le plus largement utilisé.
Yacc signifie Yet Another Compiler Compiler, car il compile la grammaire vers un
compilateur de tokens.il est le plus souvent utilisé avec Lex, il a été porté vers plu-
sieurs langages cibles. Comme Lex, Yacc compile une grammaire en un analyseur
syntaxique. Voici comment une règle de grammaire Yacc est définie : À gauche,
on définit comment la règle peut être appariée en utilisant des types de tokens
et d’autres règles. À droite, entre crochets, se trouve l’action à exécuter lorsque
la règle est appariée. Dans ce bloc, nous pouvons faire référence aux valeurs de
token appariées en utilisant 1,2, etc. Enfin, nous stockons le résultat dans
• On a inclus le fichier Flex (fl.l) dans notre fichier Bison (fl.y). De plus,
dans Flex, nous avons inclus le fichier généré après la compilation de notre
fichier fl.y (fl.tab.h), ainsi que la table des symboles (symtable.c).
• Autres fonctions prédéfinies dans Bison nous aidant dans cette analyse in-
cluent la fonction yyerror, utilisée pour traiter les erreurs de syntaxe.
• Nous devons indiquer au parseur quels tokens s’attendre. Ainsi, chaque type
de token produit par notre analyseur lexical doit être déclaré ici.
5
• Nous avons défini les différentes priorités des opérateurs, cela indique au par-
seur dans quel ordre analyser les expressions contenant des opérateurs.
6
Figure 3 – Extrait de fichier Bison
4 Analyse sémantique
• Recueille les informations sur les types des identificateurs et met à jour la
table des symboles.
4.1 Quadruplets
Les quadruplets sont utilisés comme une forme intermédiaire entre l’analyse syn-
taxique et la génération de code final. Ils permettent de simplifier la représentation
du code tout en conservant l’essence des opérations à effectuer.
Un quadruplet est composé de quatre éléments :
7
Figure 4 – Quadruplet
4.2 Routine
8
Figure 5 – Routine declaration
Affectation
Dans la routine d’affectation, nous commençons par vérifier si le type de la
valeur associée à l’identifiant auquel nous affectons correspond bien à son
type déclaré que nous avons déjà stocké dans la table de symboles lors de la
déclaration. Si c’est le cas, nous insérons la valeur affectée. Sinon, une erreur
sémantique.
DIVIDE
Ici aussi, on vérifie les différents cas possibles que les expressions peut avoir
sur le type. De plus, nous gérons le cas où l’utilisateur essaie de diviser par
zéro, ce qui est également considéré comme une erreur
9
Figure 8 – Routine arithmetique -DIVIDE
Input - Output
10
Figure 11 – Routine Input Output
5 Conclusion
11