Académique Documents
Professionnel Documents
Culture Documents
But de TP
Le but de ce TP consiste à étudier les générateurs d’analyseur lexical en
utilisant l’outil « Flex ».
Flex (Fast Lexer) (version gnu de la commande lex) construit un analyseur
lexical à partir d’un ensemble de règles/actions décrites par des expressions
régulières.
1
AU : 2022-2023 TLC
Etude théorique :
La structure d'un programme flex est découpée en 3 zones séparées par les
balises %{ , %}, %%, %%.
Structure de fichier spécification (f)lex :
%{
Déclaration des variables (en C) constantes…
%}
Déclaration des définitions régulières
%%
Règles de traduction
%%
Bloc principal et fonctions auxiliaires
1. Déclaration des définitions :
Une définition régulière permet d’associer un nom à une Expressions
Régulières (ER) (f)lex et de se référer par la suite (dans la section des règles) à
ce nom plutôt qu’à ER.
2. Règles de traduction :
Sont des suites d’instructions de la forme :
Exp1 action1
Exp2 action2
Les Expi sont des ER (f)lex et doivent commencer en colonne 0. Les actions
sont des blocs d’instructions en C, qui doivent commencer sur la même ligne
que l’ER correspondante.
2
AU : 2022-2023 TLC
3. Bloc principale :
Si aucune fonction auxiliaire n’est déclarée, Lex considère que c’est juste :
main ( )
{
yylex () ;
}
3
AU : 2022-2023 TLC
Les motifs :
x dénote le singleton {x}
. dénote n’importe quel caractère, sauf le caractère '\n'
[xyz] dénote {x, y, z}
[abj-oZ] dénote {a, b, j, k, l, m, n, o,Z}
[^A-Z] dénote n’importe quel caractère sauf les lettres majuscules
r* zéro, une ou plusieurs occurrences de r (r étant une expression
régulière valide)
r+ une ou plusieurs occurrences de r
r? zéro ou une occurrence de r
r{2, 5} 2, 3, 4 ou 5 occurrences de r
r{2,} 2 ou plusieurs occurrences de r
r{4} exactement 4 occurrences de r
{nom} expansion de la définition « nom »
\x dénote les caractères ASCII comme \a, \t
\0 dénote le caractère de code ASCII 0 (NULL)
\123 dénote le caractère de code ASCII123
\x2a dénote le caractère de code ASCII hexadécimal 2a
(r) une seule occurrence de r, les parenthèses sont utilisées pour
fixer la priorité
r|s une seule occurrence de r ou de s
rs une seule occurrence de r, suivie d’une seule occurrence de s
(concaténation)
r/s une seule occurrence de r, et seulement si cette occurrence est
suivie immédiatement par une seule occurrence de s
^r une seule occurrence de r, mais uniquement si cette occurrence
se trouve au début d’une ligne
r$ une seule occurrence de r, mais uniquement si cette occurrence
se trouve à la fin d’une ligne
<< EOF >> dénote le caractère de fin de fichier
4
AU : 2022-2023 TLC
Exercice N° 1
1-
a. Ecrire le code ci-dessous en utilisant : gedit ex1_1.l
b. Compiler le code avec Flex en tapant : flex ex1_1.l
c. Compiler avec le compilateur C en tapant : cc lex.yy.c -lfl
d. Exécuter en tapant : ./a.out
%%
0|1 {
printf("un nombre binaire [%s]\n", yytext);
}
%%
5
AU : 2022-2023 TLC
3-
a. Ecrire le code ci-dessous en utilisant : gedit ex1_3.l. Compiler
puis exécuter.
%%
(0|1)+ {
printf("un nombre binaire [%s]\n", yytext); }
. //taper un espace pour séparer le motif de l'action
%%
%%
[a-zA-Z][a-zA-Z0-9]* printf("<%s> ", yytext );
%%
Exercice N° 3
Exercice N° 4