Rapport
Rapport
Rapport
SYNTAXIQUE FLEX
*******
SOMMAIRE
INTRODUCTION................................................................................................................................3
A. Partie de l’initialisation à l’analyseur syntaxique flex...........................................................4
1. Premiers Pas : Analyse lexicale pour un langage informatique............................................5
Reconnaissance d'identificateurs.............................................................................................5
Analyse lexicale.........................................................................................................................8
Modifications et complétions de la spécification pour reconnaître plusieurs unités
lexicales..................................................................................................................................8
Complétion de l'analyseur avec de nouvelles fonctionnalités............................................9
2. Deuxième Pas : Commentaires en C....................................................................................11
Traitement d'un commentaire sur une ou plusieurs lignes.................................................11
Gestion de commentaires successifs......................................................................................15
Première stratégie : Utilisation d'une expression régulière complexe............................15
Deuxième stratégie : Utilisation d'une variable de comptage pour gérer l'imbrication
des commentaires................................................................................................................16
Troisième stratégie : Utilisation des "start-conditions" avec un super état
COMMENTAIRE..............................................................................................................18
Gestion de commentaires imbriqués (avancé)......................................................................20
CONCLUSION...................................................................................................................................22
INTRODUCTION
L’analyse lexicale est une étape fondamentale dans le processus de compilation des langages
de programmation. Cette étape consiste à transformer un texte source brut en une série
d’unités lexicales, ou tokens, qui seront ensuite utilisées par les phases ultérieures du
compilateur, notamment l’analyse syntaxique. Pour accomplir cette tâche, des outils
spécialisés, tels que Flex, sont largement utilisés.
Flex (Fast Lexical Analyzer) est un générateur d’analyseurs lexicaux qui permet de décrire
des motifs à l’aide d’expressions régulières et de les associer à des actions spécifiques. Il se
distingue par sa simplicité d’utilisation et son efficacité dans la génération de code C, qui
implémente l’analyseur lexical basé sur les règles définies par l’utilisateur.
Cette partie se concentre sur les premières étapes pour débuter avec Flex : depuis la mise en
place de l’environnement de travail et la création d’un projet structuré, jusqu’au
développement d’un analyseur lexical fonctionnel. Les concepts théoriques sont illustrés par
des cas pratiques, comme la reconnaissance d’identificateurs ou la gestion des commentaires
dans un code source. Ces exemples permettent de comprendre les bases de Flex et d’explorer
ses fonctionnalités avancées, tout en posant les fondations pour des développements plus
complexes.
L'initialisation d'un analyseur syntaxique avec Flex marque le début d'un voyage fascinant
dans le monde du traitement lexical, où chaque ligne de code devient une opportunité de
transformer des séquences de caractères en unités de sens significatifs, ouvrant ainsi la voie à
une compréhension plus profonde et structurée des langages de programmation.
Pour donner vie à notre analyseur syntaxique et transformer nos idées en code opérationnel,
la première étape cruciale consiste à installer et configurer l'outil Flex de manière méthodique
et précise, en s'assurant que chaque composant nécessaire est correctement mis en place.
Installation de fex
L’installation de flex peut se faire sur plusieurs systèmes d’exploitation à savoir sur
Windows, MacOs et Linux. Voici les étapes à suivre :
Sur Windows
Téléchargez et installez Flex via Cygwin ou une distribution Windows de GNU
Tools.
Ajoutez le chemin de Flex à la variable d'environnement PATH.
Sur macOS :
Après l’installation de flex vous pouvez vérifier s’il est bel et bien installé en tapant la
commande suivante sur le terminal :
flex --version
L’utilisation en fonction de son système d’exploitation pourra avoir flex sur sa machine.Mais
dans notre travail nous nous focaliserons sur le système linux. Et pour ce faire nous allons
organiser notre travail comme de la façon suivante :
Nous avons créé un dossier principal pour le projet portant comme nom
"TiemtoreAnderson "
À l'intérieur de ce dossier, nous avons créé les sous-dossiers suivants :
"exercices" : pour les différents exercices dans lequel se trouve les sous-
dossiers suivants :
o "comments"
o "first00"
o "first01"
o "first02"
"data" : pour les fichiers de données de test
"common" : pour les fichiers communs comme les prototypes et le Makefile
Reconnaissance d'identificateurs
Dans cette partie l'analyseur a pour objectif de reconnaître des mots qui commencent par une
lettre et peuvent être suivis de plusieurs lettres ou chiffres. Pour cela nous avons créé un
fichier first00.flex dans le sous-dossier flex00 du sous-dossier exercice.
Dans cette partie nous avons créé le fichier first.data dans le sous-dossier data.
Contenu du fichier de test first.data
Pour tester l’analyseur, nous utilisons le fichier suivant, qui contient différents éléments de
code :
for( i=0; i < 10; i++ ) {
truc[i] = 0;
machin = 12.3;
bidule = .0;
}
Etape à suivre :
flex first00.flex
Le fichier exécutable produit (a.out) est utilisé pour analyser un fichier d'entrée
(first.data) avec la commande suivante :
Résultats
Lors de l'exécution de la commande ci-dessus, l'analyseur lexical traite le fichier first.data et
identifie les mots qui répondent aux critères spécifiés.
Cette figure ci-dessous illustre les différentes étapes de la compilation, l’exécution jusqu’au
résultat.
Nous remarquons que tous les mots commençant par une lettre, sont mis en crochets et le
reste ignoré.
Dans cette partie, pour intégrer la spécification "first00.flex" avec un Makefile générique,
nous allons tirer parti des fichiers prototypes fournis, tels que Makefile, proto-color.h,
et proto0.flex en renommant "first00.flex" par "first01.flex". Ces fichiers nous permettront de
structurer notre projet de manière organisée et d'automatiser le processus de compilation.
Voici les fichiers utilisés :
Dans cette partie nous avons créé le fichier first01.flex dans le sous-dossier flex01 du sous-
dossier exercice.
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Génération de l’analyseur lexical à partir de la spécification Flex :
make first01
La commande make first01 a été utilisée pour compiler le fichier first01.flex à l'aide
de Flex et GCC. Elle génère un exécutable appelé first01.
Exécution de l’analyseur avec le fichier de test :
./first01 < ../../data/first.data
Les résultats affichés représentent l'analyse ligne par ligne du fichier d'entrée. Les différents
tokens identifiés par l'analyseur sont classés dans plusieurs catégories.
[VALIDE:] : Ce préfixe semble indiquer que le token reconnu correspond à un
identificateur ou un mot valide selon les règles définies dans le fichier .flex.
[INCONNU:] : Les éléments classés comme "inconnus" ne correspondent à aucune
règle spécifique dans le fichier .flex. Cela pourrait inclure des caractères spéciaux ou
des combinaisons inattendues.
[WHITESPACE:] : Cette catégorie identifie les espaces blancs (espaces, tabulations,
retours à la ligne).
\n : Le retour à la ligne est explicitement indiqué, montrant la fin de chaque ligne
d'entrée.
Analyse lexicale
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Copie des fichiers Makefile et proto-color.h
cp ../../common/Makefile .
cp ../../common/proto-color.h
make first02
La commande make first02 a été utilisée pour compiler le fichier first02.flex à l'aide
de Flex et GCC. Elle génère un exécutable appelé first02.
L'analyseur lexical compilé est exécuté sur un fichier de données d'entrée first.data.
Le fichier de données est traité selon les règles définies dans le fichier .flex.
L'analyseur lexical a décodé les informations dans les données en identifiant les types de
tokens selon les règles spécifiées dans le fichier .flex.
Étapes à suivre :
Dans cette partie nous avons créé le fichier comment1.flex et les fichiers comment1.data et
comment2.data dans le sous dossier data.
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Génération du fichier C à partir de la spécification Flex :
flex comment1.flex
La commande flex comment1.flex génère le fichier lex.yy.c à partir du fichier
comment1.flex, qui contient les règles lexicales pour analyser des commentaires.
Compilation du fichier généré :
gcc lex.yy.c –o comment1 –lfl
Vous compilez le fichier généré avec gcc en créant un exécutable nommé comment1.
Le drapeau -lfl est utilisé pour lier la bibliothèque Flex qui fournit des fonctions
comme yylex().
Exécution de l’analyseur avec les fichiers de test :
./comment1 < coment1.data1
Vous exécutez ensuite l'analyseur lexical comment1 sur un autre fichier de données
comment.data2. Le programme scanne ce fichier en cherchant les motifs définis dans
comment1.flex.
Les figures suivantes montre les résultats de nos tests pour l’affichage des commentaires:
Le texte "Contenu du commentaire : ici je dois écrire le corps de ma fonction mais pour
l’instant elle est vide " est affiché, ce qui semble être le résultat de l'analyse du fichier
comment.data2. Cela indique que l'analyseur a probablement reconnu un commentaire ou une
chaîne de texte spécifique correspondant à une règle dans le fichier .flex.
Dans cette partie nous avons créé le fichier comment2.flex dans le sous dossier data.
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Génération du fichier C à partir de la spécification Flex :
flex comment2.flex
La commande flex comment1.flex génère le fichier lex.yy.c à partir du fichier
comment2.flex, qui contient les règles lexicales pour analyser des commentaires.
Compilation du fichier généré :
gcc lex.yy.c –o comment2 –lfl
Vous compilez le fichier généré avec gcc en créant un exécutable nommé comment1.
Le drapeau -lfl est utilisé pour lier la bibliothèque Flex qui fournit des fonctions
comme yylex().
Exécution de l’analyseur avec le fichier de test :
Vous exécutez ensuite l'analyseur lexical comment2 sur un autre fichier de données
comment.data2. Le programme scanne ce fichier en cherchant les motifs définis dans
comment2.flex.
Les figures suivantes montre les résultats de nos tests pour la suppression des commentaires :
Nous remarquons que le résultat obtenu est uniquement la fonction void mafonction () {}.
Cette section décrit les exigences pour l'élaboration d'un analyseur lexical capable de traiter
plusieurs commentaires successifs dans un fichier source. L'objectif est d'éviter que l'effet
"glouton" de Flex n'agrège ces commentaires en un seul bloc. Trois stratégies différentes sont
proposées pour y parvenir :
La première consiste à utiliser une expression régulière plus élaborée pour s'assurer que
chaque commentaire est traité stratégiquement, même s'ils sont consécutifs. L'effet "glouton"
de Flex pourrait amener l'analyseur à consommer tout ce qui se trouve entre le premier /*et le
dernier */d'un bloc de commentaires successifs, ce qui regrouperait ces commentaires.
Dans cette partie nous avons créé le fichier comment_analyzer1.flex dans le dossier
comments du sous dossier exercice et le fichier comment3.data dans le sous dossier data.
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Génération du fichier C à partir de la spécification Flex :
flex comment_analyzer1.flex
Flex est un générateur d'analyseurs lexicaux, qui crée un programme C
capable de lire et d'analyser du texte selon les règles définies dans un
fichier .flex.
Le fichier comment_analyzer1.flex contient des spécifications (règles
lexicographiques) qui définissent les types de tokens ou motifs (comme des
commentaires dans du code, des mots-clés, etc.) à reconnaître dans le texte
d'entrée.
Cette commande génère un fichier C nommé par défaut lex.yy.c. Ce fichier
contient le code source de l'analyseur lexical, basé sur vos spécifications Flex.
Compilation du fichier généré :
gcc lex.yy.c –o comment_analyzer1 -lfl
Ici, nous utilisons gcc (GNU Compiler Collection) pour compiler le fichier C
généré (lex.yy.c) afin de créer un exécutable nommé comment_analyzer1.
L'option -o comment_analyzer1 indique à GCC de nommer l'exécutable
produit sous ce nom.
L'option -lfl est utilisée pour lier la bibliothèque Flex (libfl.a), qui contient les
fonctions nécessaires pour le fonctionnement de l'analyseur lexical généré
(comme yylex()).
Exécution de l’analyseur avec le fichier de test :
Résultat attendu :
Cette méthode consiste à gérer l'imbrication des commentaires en utilisant une variable qui
convient aux niveaux d'ouverture et de fermeture des commentaires. Cela est particulièrement
utile dans le cas où des commentaires sont imbriqués (bien que les commentaires imbriqués
ne soient pas autorisés en standard C, cela pourrait arriver dans d'autres langages).
Approche :
Chaque fois qu'un /*est rencontré, la variable d'imbrication est incrémentée.
flex comment_analyzer2.flex
Cette commande utilise Flex pour générer un analyseur lexical basé sur le fichier de
spécifications comment_analyzer2.flex. Flex produit un fichier C nommé par défaut
lex.yy.c, contenant le code source de l’analyseur lexical. Le fichier Flex (.flex)
contient les règles pour analyser les tokens dans le texte d'entrée. Flex traduit ces
règles en un programme C.
Description :
Résultat attendu :
Mots simples (ANY) : Tous les mots composés de lettres minuscules (comme i, au,
nombre, etc.) sont reconnus comme ANY.
Jetons inconnus (UNK) : Les opérateurs (=, ;), chiffres (5, 6), lettres isolées (d) ou
avec apostrophes ('o) et symboles spécifiques sont marqués comme UNK.
Commentaires (Commentaire) :
Leur contenu interne (initialisation, (*), etc.) est traité comme UNK.
Structure cohérente : Le programme suit les règles définies mais ne reconnaît pas les
éléments hors des séquences prévues (par exemple, contenu des commentaires ou
chiffres).
Flex permet de définir des "start-conditions" pour passer d'un état à un autre dans l'automate,
ce qui est utile pour des analyses plus complexes comme la gestion des commentaires. Dans
cette méthode, nous définissons un état spécifique, nommé COMMENT, qui sera activé dès
qu'un commentaire est détecté.
Approche :
Nous définissons un état COMMENT dans lequel l'analyseur entre lorsqu'il rencontre un /*.
Pendant que l'analyseur est dans cet état, tout le contenu du commentaire est ignoré.
L'analyseur retourne à l'état initial lorsqu'il rencontre */, ce qui indique la fin du
commentaire.
Dans cette partie nous avons créé le fichier comment_analyzer3.flex dans le dossier
comments du sous dossier exercice.
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Génération du fichier C à partir de la spécification Flex :
flex comment_analyzer3.flex
Cette commande utilise Flex pour générer un analyseur lexical basé sur le fichier de
spécifications comment_analyzer3.flex. Flex produit un fichier C nommé par défaut
lex.yy.c, contenant le code source de l’analyseur lexical. Le fichier Flex (.flex)
contient les règles pour analyser les tokens dans le texte d'entrée. Flex traduit ces
règles en un programme C.
Description :
Résultat attendu :
Le résultat obtenu montre que seules les parties non commentées du fichier d'entrée sont
affichées dans la sortie. Cela suggère que les règles définies dans comment_analyzer3.flex
ne gèrent pas ou n'affichent pas correctement les commentaires.
Dans cette section, il est demandé d'écrire un analyseur lexical capable de gérer les
commentaires imbriqués, ce qui n'est pas conforme à la syntaxe du langage C.
Théoriquement, les commentaires imbriqués constituent un langage algébrique non régulier,
appelé "langage de Dyck", qui ne peut pas être reconnu par des expressions régulières
simples.
Objectif :
L'objectif est de développer un analyseur qui non seulement reconnaît ces imbrications, mais
qui suit également le niveau d'imbrication des commentaires à l'aide d'une "start-condition"
appelée COMMENT et d'une variable level pour compter les niveaux.
Réalisation :
La réalisation va consister à :
La gestion de l'imbrication : Une variable level est utilisée pour suivre la profondeur
des commentaires imbriqués. À chaque nouvelle ouverture de commentaire ( /*), la
variable est incrémentée, et à chaque nouvelle ouverture de commentaire ( */), elle
fermeture est décrémentée. Cela permet de gérer correctement les différents niveaux
d'imbrication.
La start-conditionCOMMENT : L'utilisation d'une start-condition dans Flex permet
de traiter les commentaires imbriqués modifiant le reste du code. Dès qu'un
Dans cette partie nous avons créé le fichier comment_imbrique.flex dans le dossier comments
du sous dossier exercice et le fichier comment.data4 dans le sous dossier data.
Compilation et Exécution :
Pour compiler et exécuter l'analyseur lexical, les étapes suivantes ont été suivies :
Exécution de l’analyseur avec le fichier de test :
Description :
Résultat attendu :
Nous remarquons que ce programme traite les commentaires imbriqués de type /* ... */ et
modifie la couleur de sortie en fonction du niveau d'imbrication.
CONCLUSION
En conclusion, notre travail pratique sur la mise en œuvre d'un analyseur lexical à l'aide de
l'outil Flex a été une expérience enrichissante qui nous a permis d'approfondir notre
compréhension des principes fondamentaux de l'analyse lexicale et de la compilation des
langages de programmation. En intégrant des fonctionnalités pour la reconnaissance des
commentaires, y compris des cas complexes tels que les commentaires multi-lignes et
imbriqués, nous avons été confrontés à des défis techniques qui nous ont poussés à
développer des solutions innovantes. Ce projet a non seulement renforcé nos compétences en
matière de programmation, mais il a également illustré l'importance d'une conception
méthodique et rigoureuse pour garantir que des éléments non pertinents, tels que les
commentaires, soient correctement exclus du processus d'analyse syntaxique. En synthèse, ce
rapport documente non seulement les étapes pratiques de notre développement, mais il
témoigne aussi d'une immersion concrète dans le domaine des langages informatiques et des
outils de compilation, préparant ainsi le terrain pour de futures applications et
approfondissements dans ce domaine.