Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% ont trouvé ce document utile (0 vote)
15 vues2 pages

Pres-Lex Utf8 2

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 2

Master d’Informatique 1

Compilation
Présentation de Lex

Lex est un générateur de programme pour le traitement lexical de chaı̂nes de caractères, en particulier pour l’analyse
lexicale. Un source Lex est une spécification de haut niveau sous forme d’expressions rationnelles décrivant les classes
de tokens et d’actions à exécuter à la reconnaissance d’un token. Ces actions sont écrites en C.

1 Schéma d’utilisation de Lex

lex.l −→ Lex −→ lex.yy.c


source LEX (les actions de lex.l
(actions en C) sont recopiées)

lex.yy.c −→ Compilateur C −→ analyseur


cet exécutable est l’analyseur lexical.

Attention : à la compilation,
ne pas oublier l’appel à la bibliothèque lex ! !
cc lex.yy.c -lfl -o analyseur

chaı̂ne d’entrée −→ analyseur −→ suite de tokens

Le fichier lex.yy.c est donc un programme C compre- lettre [A-Za-z]


nant : chiffre [0-9]
– une représentation de la table de transitions de l’auto- où lettre définit une variable globale qui pourra être
mate construit à partir des expressions rationnelles ; utilisée dans les expressions rationnelles sous la forme
– une routine standard d’utilisation de cette table pour {lettre} où { et } sont des métasymboles permettant de
simuler le fonctionnement de l’automate. Cette routine distinguer la suite de caractères l.e.t.t.r.e et l’identi-
s’appelle yylex. ficateur lettre.
– les actions de lex.l recopiées.

2.2 Les procédures auxiliaires (option-


2 Description d’un source Lex nelles)
La forme générale d’un source Lex est la suivante : Ce sont les routines utilisées dans les actions associées
aux différentes expressions rationnelles, par exemple la
déclarations <- optionnel procédure d’installation dans la table des symboles.
%%
On peut y placer la fonction main dans le cas d’un ana-
règles de transition
lyseur seul. Dans ce cas la fonction yylex sera utilisée
%% <- optionnel
pour lancer la procédure d’analyse et dans la variable yyin
procédures auxilliaires <- optionnel
sera stocké le descripteur du fichier à analyser (par défaut
stdin). Les variables yytext et yyleng contiennent res-
2.1 Les déclarations (optionnelles) pectivement un pointeur sur le premier caractère de la
chaı̂ne reconnue et la longueur de celle-ci.
On y trouve des déclarations de variables globales et
des définitions rationnelles. Elles doivent commencer en
première colonne. Toute ligne commençant par un blanc 2.3 Les règles de transition
est intégralement recopiée dans lex.yy.c, ainsi que tout
texte entre %{...%}. Elles sont de la forme :
Exemples de déclarations : Expression rationnelle Action
où Action est un fragment de code C à exécuter quand le – si le premier caractère est ^ , la chaı̂ne ne sera reconnue
token correspondant à l’expression rationnelle est reconnu. qu’en début de ligne.
– si le dernier caractère est $, la chaı̂ne ne sera reconnue
Ainsi, la règle de transition
qu’en fin de ligne
table printf("objet’’) ; – le / définit un contexte sensitif à droite. Ainsi ab/cd
reconnaı̂t ab s’il est suivi de cd.
substitue table par objet mais aussi tablette par Pour associer la même action à plusieurs expressions ra-
objettte.... tionnelles, on peut les regrouper :
La syntaxe des expressions rationnelles suit les règles clas-
siques. Par exemple, les identificateurs peuvent être définis expression1 |
par expression2 |
:
{lettre}({lettre}|{chiffre})* :
expressionI action ;
où les accolades délimitent la variable globale lettre,
les parenthèses délimitent une sous-expression, le
métasymbole | désigne l’alternative et le métasymbole
* désigne la répétition 0 ou plusieurs fois. 2.4 Les actions
Les entiers sont définis par {chiffre}+ où le métasymbole
L’action par défaut est la recopie de l’entrée sans modifi-
+ désigne la répétition 1 ou plusieurs fois.
cation dans le fichier de sortie. Elle est exécutée pour les
Les nombres décimaux sont définis par chaines non reconnues. Une règle dont l’action est la reco-
pie peut être omise. Inversement, si toute chaine d’entrée
{chiffre}+(\.{chiffre}+) ?(E[-+] ?{chiffre}+) ? doit être reconnue et traitée (comme c’est le cas dans un
compilateur), alors il faut des règles pour tout reconnaitre.
où le métasymbole ? définit une sous-expression option- L’action vide ignore l’entrée (ne pas recopie pas).
nelle. Le symbole ”.” étant un métasymbole, le caractère
Les actions sont des fragments de programmes C. Ce sont
”.” est désigné par "\.".
les fonctions de la bibliothèque C, celles de la bibliothèque
Les méta symboles sont : Lex, celles définies par le programmeur à la fin du source
Lex.
" \ [ ] ^ ? . * + | ( ) $ / { } %

et correspondent respectivement à :
– " " : tout ce qui se situe entre ” ” est pris comme chaı̂ne
3 Cas des règles ambiguës
de caractères. Ainsi ”.” désigne le caractère . et ” ”
désigne un blanc significatif (par exemple a" "b permet On peut avoir plusieurs expressions rationnelles qui re-
de reconnaitre le token a b). connaissent la même chaı̂ne d’entrée. Dans ce cas Lex lève
– \ : placé devant un méta-symbole, il le transforme en l’ambiguité en appliquant les règles suivantes :
caractère (comme \. ). 1. le plus long préfixe est retenu ;
– [ ] définit une classe de caractères (i.e. représente un 2. parmi plusieurs expressions rationnelles qui recon-
caractère). Par exemple, [ab+] reconnaı̂t l’un des ca- naissent le même préfixe, la première est choisie.
ractères a, b et + ; x[ab+]y reconnait l’une des chaines
xay, xby ou x+y. Exemple : Considérons le source Lex suivant :
Les seuls opérateurs ou métasymboles actifs entre [ ]
sont \, - et ^ . Le symbole - désigne un intervalle, integer action1; {action correspondant
le symbole ^ désigne le complémentaire et \ sert à au mot réservé integer}
représenter les escapes \n, \t, \b. [a-z]+ action2; {action correspondant
Lorsque le caractère - doit être reconnu entre des cro- à un identificateur}
chets, il faut le placer en tête. Ainsi [0-9] désigne un
chiffre mais [-+0-9] reconnait soit un chiffre, soit le Les chaines de caractères suivantes sont reconnues ainsi :
symbole -, soit le symbole +. – "integers" est pris pour un identificateur (8 ca-
Le symbole ^ désignant le complémentaire doit être ractères : règle 1).
placé en tête. Ainsi [^abc] reconnait tout caractère sauf – "integer" est pris pour le mot réservé integer (7 ca-
a, b ou c. ractères reconnus par deux expressions : règle 2).
– ? désigne une expression optionnelle. Par exemple – "int" est pris pour un identificateur (3 caractères re-
abc ?d reconnaı̂t l’une des chaines abd et abcd. connus).
– . remplace n’importe quel caractère sauf \n.
Ce mécanisme est utilisé pour gérer les mots-clés ou
Notion de contexte sensitivité : on peut spécifier dans réservés. En listant en premier les expressions rationnelles
quelques cas précis qu’une expression ne doit être reconnue décrivant les mots réservés, ils sont reconnus comme tels
que dans un contexte donné. et non comme des identificateurs.

Vous aimerez peut-être aussi