Vous êtes sur la page 1sur 6

Analyse lexicale

Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib


4

Chapitre 02 : Analyse lexicale


1. Introduction
2. Dfinitions
3. Expressions rgulires
4. Automates
5. Erreurs Lexicales
6. Mis en uvre d'un analyseur lexical
7. Outil Lex (gnrateur danalyseur Lexical)

1. Introduction
L'analyseur lexical constitue la premire tape d'un compilateur. Sa tche principale est de lire
les caractres d'entre et de produire comme rsultat une suite d'units lexicales que l'analyseur
syntaxique aura traiter.


















En plus, l'analyseur lexical ralise certaines tches secondaires comme l'limination de
caractres superflus (commentaires, tabulations, fin de lignes, ...), et gre aussi les numros de ligne
dans le programme source pour pouvoir associer chaque erreur rencontre par la suite la ligne
dans laquelle elle intervient.


Analyseur
lexical
Table des
symboles
Analyseur
syntaxique
U.L
U.L suivante
Code
source
Analyse
smantique
Analyseur
Lexicale
Ensemble
des lexmes
Code
source
Messages
derreurs
Analyse lexicale
Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
5
2. Dfinitions
1. Une unit lexicale est une suite de caractres qui a une signification collective.
2. Un lexme toute suite de caractre du programme source qui concorde avec le modle d'une
unit lexicale.
3. Un modle (Rgle lexicale) est une rgle associe une unit lexicale qui dcrit l'ensemble
des chanes du programme qui peuvent correspondre cette unit lexicale.
4. Attributs : informations concernant le lexme (champs dans la table des symboles) ;
Exemples
- L'unit lexicale IDENT (identificateurs) en C a pour modle : toute suite non vide de caractres
compose de chiffres, lettres ou du symbole "_" et qui commencent par une lettre. Des exemples
de lexmes pour cette unit lexicale sont : truc, i, a1, ajouter_valeur ...
- L'unit lexicale NOMBRE (entier sign) a pour modle : toute suite non vide de chiffres
prcde ventuellement d'un seul caractre parmi. Comme par exemple : -12, 83204, +0 ...
- L'unit lexicale REEL a pour modle : tout lexme correspondant l'unit lexicale NOMBRE
suivi ventuellement d'un point et d'une suite (vide ou non) de chiffres, le tout suivi
ventuellement du caractre E ou e et d'un lexme correspondant l'unit lexicale NOMBRE.
Cela peut galement tre un point suivi d'une suite de chiffres, et ventuellement du caractre E
ou e et d'un lexme correspondant l'unit lexicale NOMBRE. Exemples de lexmes : 12.4,
0.5e3, 10., -4e-1, -.103e+2
3. Erreurs Lexicales
Peu d'erreurs sont dtectables au seul niveau Lexical :
Plusieurs stratgies sont possibles :
- mode panique : on ignore les caractres qui posent problme et on continue. Cette technique se
contente de refiler le problme l'analyseur syntaxique
- transformations du texte source : insrer un caractre, remplacer, changer, etc. Elle se fait en
calculant le nombre minimum de transformations apporter au mot qui pose problme pour en
obtenir un qui ne pose plus de problmes. Cette technique de rcupration d'erreur est trs peu
utilise en pratique car elle est trop coteuse implanter.
4. Expressions rgulires
Une expression rgulire est une notation pour dcrire un langage rgulier.
Soit A un alphabet (un ensemble de lettres), une expression rgulire est donc:
1. Les lments de A, c et C sont des expressions rgulires.
2. Si o et | sont des expressions rgulires, alors (o | |), (o|) et o* sont des expressions rgulires.
(o | |) reprsente lunion, (o|) la concatnation et o* la rptition (un nombre quelconque de
fois). c est llment neutre par rapport la concatnation et C est lensemble vide de caractre,
neutre par rapport lunion.

Exemple : (a|b)*abb,
Identificateur = alpha (alpha | numer)*
En fait, les expressions rgulires sont beaucoup plus puissantes que ce dont on a besoin lorsquon
fait de lanalyse lexicale.
Analyse lexicale
Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
6
Exemple
On dcrit les lexmes par des expressions rgulires.
Les mots cls: "for", "if"
Les variables: ['a'-'z']+ ['0'-'9']*
Les entiers: ['0'-'9']+
Les symboles: '(', ')', '+', '*', '='
Le lexme vide: (' ' | '\n')
Lordre de priorit
Les oprateurs , concatnation et | sont associatifs gauche, et vrifient
1.
2. concatnation
3. |
Dfinitions rgulires
La nomination des expressions rgulires est dite une dfinition rgulire. Ces noms seront utiliss
pour construire dautres expressions rgulires. On crit donc
d
1
r
1

d
2
r
2

. . .
d
n
r
n

o chaque d
i
est un nom distinct et chaque r
i
est une expression rgulire sur lalphabet U
{d
1
,d
2
,d
i-1
}
Exemple
Voici quelques dfinitions rgulires, et notamment celles de identificateur et nombre, qui
dfinissent les identificateurs et les nombres du langage Pascal :
lettre A | B | . . . | Z | a | b | . . . | z
chiffre 0 | 1 | . . . | 9
identificateur lettre ( lettre | chiffre )
chiffres chiffre chiffre
frac . chiffres |
Exp ( E (+ | - | ) chiffres ) |
nombre chiffres frac exp
Notations abrges
Pour allger certaines critures, on complte la dfinition des expressions rgulires en ajoutant
les notations suivantes :
- Soit x une expression rgulire, dfinissant le langage L(x) ; alors (x)
+
est une expression
rgulire, qui dfinit le langage (L(x))
+
,
- Soit x une expression rgulire, dfinissant le langage L(x) ; alors (x)? est une expression
rgulire, qui dfinit le langage L(x) { },
- Si c
1
, c
2
,. . c
k
sont des caractres, lexpressions rgulire c
1
|c
2
|... |c
k
peut se noter [c
1
c
2
... c
k
],
- Lexpression [c
1
c
2
] dsigne la squence de tous les caractres c tels que c
1
c c
2
.
Exemple
Les dfinitions de lettre et chiffre donnes ci-dessus peuvent donc se rcrire :
lettre [AZaz]
chiffre [09]
Analyse lexicale
Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
7
5. Automates
Un automate tats finis (AEF) est dfini par
- un ensemble fini E d'tats
- un tat e
0
distingu comme tant l'tat initial
- un ensemble fini T d'tats distingus comme tats finaux (ou tats terminaux)
- un alphabet des symboles d'entre
- une fonction de transition o:A E E qui tout couple form d'un tat et d'un symbole de
fait correspondre un ensemble (ventuellement vide) d'tats : o (e
i
,a)={ei1,,e
in
}
Les automates sont souvent donns sous la forme d'un graphe: les tats sont les nuds du graphe et
les arcs correspondent la fonction de transition.
Exemple
={a,b}, E={0,1,2,3}, e
0
=0, T={3}
(0,a)={0,1}, (0,b)={0}, (1,b)={2}, (2,b)={3},
Reprsentation graphique :

Construction d'un AFN partir d'une E.R.
Pour une expression rgulire s, on note A(s) un automate reconnaissant cette expression.

1. automate acceptant la chane vide

2. automate acceptant la lettre a

3. automate acceptant (r)(s)
1. mettre une -transition de chaque tat terminal de A(r) vers l'tat initial de A(s)
2. les tats terminaux de A(r) ne sont plus terminaux
3. le nouvel tat initial est celui de A(r)
4. (l'ancien tat initial de A(s) n'est plus tat initial)


4. automate reconnaissant r|s
1. crer un nouvel tat initial q
2. mettre une -transition de q vers les tats initiaux de A(r) et
A(s)
3. (les tats initiaux de A(r) et A(s) ne sont plus tats initiaux)



5. automate reconnaissant r+



Analyse lexicale
Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
8
6. Mise en uvre d'un analyseur lexical
A) A la main
Un automate peut trs facilement tre simul par un algorithme. C'est encore plus facile si
l'automate est dterministe. Alors, on peut crire un programme reconnaissant tout mot de tout
langage rgulier. Ainsi, si l'on veut faire l'analyse lexicale d'un langage rgulier, il suffit d'crire un
programme simulant l'automate qui lui est associ.
Exemples
Start 1 alpha
2
numer
3
4
oparith-{/}
<
alpha ou
numer
numer
6
8
>
=
5 =
7 =
9 10 =
:
11
;
13 14
/
* * 12 /
!=*
!=/
15


buffer=&Buffer[0];
while(1) {
c = lireChar();
switch(etat){
case: 0
switch(type(c)){
buffer*=c;buffer++;
case ALPHA: etat=1;break;
case NUMER: etat=2;break;
case OPARITH-{/}: etat=3; break;
case '<': etat=4; break;
case '>': etat=6; break;
case '=': etat=8; break;
case ':': etat=9; break;
case ';': etat=11; break;
case '/': etat=12; break;
default: erreur;}
break;
case 1:
if (type(c) == ALPHA ou type(c) == NUMER) {
buffer*=c;buffer++;
etat=1;}
else {buffer*='\0'; remettreCar();
return(ajouter_token(Buffer,TYPE_IDENT));} break;
Analyse lexicale
Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
9
case 2:
if (type(c) == NUMER){
buffer*=c;buffer++;
etat=2;}
else { buffer*='\0';remettreCar();
return(ajouter_token(Buffer,TYPE_NUMER));} break;
case 3:
return(ajouter_token(Buffer,TYPE_OPER)); break;
{{ finir!!}} }
B) Automatiquement
Il existe des outils pour crire des programmes simulant des automates partir de simples
dfinitions rgulires. Par exemple : flex