Chapitre3 Compilation PDF
Chapitre3 Compilation PDF
Chapitre3 Compilation PDF
L’outil (f)lex
1 Présentation générale
Présentation générale
L’outil (f)Lex
(f)lex est un outil destiné à construire des AL à partir de notations
spécifiques basées sur des expressions régulières.
accepte en entrée des modèles sous forme de définitions
régulières.
produit un programme écrit dans un langage de haut niveau
(langage C) : Analyseur Lexical.
Une fois compilé, l’AL reconnaı̂t les unités lexicales entrées.
Présentation générale
L’outil (f)Lex
(f)lex est un outil destiné à construire des AL à partir de notations
spécifiques basées sur des expressions régulières.
accepte en entrée des modèles sous forme de définitions
régulières.
produit un programme écrit dans un langage de haut niveau
(langage C) : Analyseur Lexical.
Une fois compilé, l’AL reconnaı̂t les unités lexicales entrées.
Code source a := b + c + d
Analyseur Outil
modèles
Lexical Lex
Définitions
Unités Régulières
id1 := id2 + id3 + id4
lexicales
Présentation générale
L’outil (f)Lex
(f)lex est un outil destiné à construire des AL à partir de notations
spécifiques basées sur des expressions régulières.
accepte en entrée des modèles sous forme de définitions
régulières.
produit un programme écrit dans un langage de haut niveau
(langage C) : Analyseur Lexical.
Une fois compilé, l’AL reconnaı̂t les unités lexicales entrées.
Code source a := b + c + d
Analyseur Outil
modèles
Lexical Lex
Définitions
Unités Régulières
id1 := id2 + id3 + id4
lexicales
Présentation générale
L’outil (f)Lex
(f)lex est un outil destiné à construire des AL à partir de notations
spécifiques basées sur des expressions régulières.
accepte en entrée des modèles sous forme de définitions
régulières.
produit un programme écrit dans un langage de haut niveau
(langage C) : Analyseur Lexical.
Une fois compilé, l’AL reconnaı̂t les unités lexicales entrées.
Code source a := b + c + d
Analyseur Outil
modèles
Lexical Lex
Définitions
Unités Régulières
id1 := id2 + id3 + id4
lexicales
Présentation générale
L’outil (f)Lex
(f)lex est un outil destiné à construire des AL à partir de notations
spécifiques basées sur des expressions régulières.
accepte en entrée des modèles sous forme de définitions
régulières.
produit un programme écrit dans un langage de haut niveau
(langage C) : Analyseur Lexical.
Une fois compilé, l’AL reconnaı̂t les unités lexicales entrées.
Code source a := b + c + d
Analyseur Outil
modèles
Lexical Lex
Définitions
Unités Régulières
id1 := id2 + id3 + id4
lexicales
Présentation générale
Spécification Lex
%{
déclaration (en C) de variables et constantes
%}
déclaration de définitions régulières
%%
règles de traduction
%%
bloc principal et fonctions auxiliaires
Description de la structure
Une définition régulière permet d’associer un nom à une
expression régulière (f)lex et de se référer par la suite (dans la
section des règles) à ce nom plutôt qu’à l’expression régulière.
Les règles de traduction sont des suites d’instructions de la
forme :
exp1 action1
exp2 action2
..
.
Les expi sont des expressions régulières (f)lex et doivent
commencer en colonne 0.
Les actioni sont des blocs d’instructions en C : une seule
instruction C ou une suite d’instructions entre { et } qui doivent
commencer sur la même ligne que l’expression correspondante.
Description de la structure
La section du bloc principal et des fonctions auxiliaires est
facultative. tem Cette section contient :
les routines C définies par l’utilisateur,
une fonction main() si celle par défaut ne convient pas.
Description
Une expression régulière (f)lex se compose :
de caractères normaux,
de méta-caractères qui ont une signification spéciale :
$, , [, ], {, }, <, >, +, −, ∗, /, |, ?, .
Attention
(f)lex fait la différence entre les minuscules et les majuscules.
Propriétés
x|yz ∗ est interprété comme (x)|(y (z ∗ )).
abc{1, 3} est interprété avec flex comme ab(c{1, 3}).
x|y est interprété avec flex comme (x|y ).
Fonctions Description
tableau de caractères qui contient la chaı̂ne
char yytext[]
d’entrée qui a été acceptée.
int yyleng() longueur de cette chaı̂ne
int yylex() lance l’analyseur et appelle yywrap()
toujours appelée en fin de flot d’entrée. Elle ne fait
rien par défaut, mais l’utilisateur peut la redéfinir
int yywrap() dans la section des fonctions auxiliaires.
retourne 0 si l’analyse doit se poursuivre sur un
autre fichier d’entrée et 1 sinon.
contient par défaut juste un appel à yylex().
int main() L’utilisateur peut la redéfinir dans la section des
fonctions auxiliaires.
unput(char c) remet le caractère dans le flot d’entrée
yyterminate() fonction qui stoppe l’analyseur
Exemple
Cet exemple compte le nombre de voyelles, consonnes et
caractères de ponctuations d’un fichier texte.
Code
%option noyywrap
%{
Code-Suite
{consonne} nbConsonnes++;
{ponctuation} nbPonct++;
\$ yyterminate();
.|\n // ne rien faire
%%
main()
{
nbVoyelles = nbConsonnes = nbPonct = 0;
yylex();
printf("Il y a %d voyelles, %d consonnes et
%d signes de ponctuations.\n", nbVoyelles,
nbConsonnes, nbPonct);
}
Compilateur (f)lex
Lex <nom>.l
Flex <nom>.l
Options de compilation
-d pour un mode debug
-i pour ne pas différencier les majuscules des minuscules
-l pour avoir un comportement lex
-s pour supprimer l’action par défaut