Chapitre 2-Analyse Lexicale
Chapitre 2-Analyse Lexicale
Chapitre 2-Analyse Lexicale
Chapitre 2
1
III- L'analyse lexicale - Plan:
1- Le rôle d'un analyseur lexical
2- Terminologie
3- Spécification des unités lexicales
3.1- Chaînes et langages
3.2- Opérations sur les langages
3.3- Expressions régulières
3.4- Définitions régulières
4- Reconnaissance des unités lexicales
5- Le langage FLEX
5.1- Structure d'un programme FLEX
5.2- Ecriture d'un analyseur lexical avec FLEX
2
III- L'analyse lexicale
6- Automates à états finis (AEF)
6.1- Automates à états finis non déterministes (AFN)
6.2- Tables de transition
6.3- Automates à états finis déterministes (AFD)
7- Grammaires régulières
8- Des expressions régulières aux automates
8.1- Conversion d'un AFN en AFD
8.2- Construction d'un AFN à partir d'une expression
régulière
8.3- Minimisation du nombre d'états d'un AFD
3
1- Le rôle d'un analyseur lexical:
L'analyseur lexical est chargé de lire le texte d'entrée,
caractère par caractère, de la gauche vers la droite et isoler
les mots et leur classe.
De plus, il doit:
- éliminer les blancs (espaces, tabulations, fin de lignes)
et les commentaires.
- détecter les erreurs et associer des messages d'erreurs.
4
1- Le rôle d'un analyseur lexical:
table des
symboles
unité lexicale
texte Analyse et attributs Analyse reste
d'entrée lexicale prochaine syntaxique
unité lexicale
traitement
des erreurs
6
2- Terminologie
Remarques:
Dans de nombreux langages, les classes suivantes couvrent la
plupart des unités lexicales:
1- Une unité lexicale pour chaque mot clé.
2- Des unités lexicales pour les opérateurs, soit individuellement,
soit par classes.
3- Une unité lexicale pour les identificateurs (noms de variables,
fonctions, tableaux, structures...).
4- Une ou plusieurs unités lexicales pour les nombres et les
chaînes.
5- Une unité lexicale pour chacun des signes de ponctuation, tels
que les parenthèses gauche et droite, la virgule , le point-virgule...
7
3- Spécification des unités lexicales
3.1- Chaînes et langages:
Définitions générales:
- Un alphabet Σ ou une classe de caractères définit un
ensemble fini de symboles.
Exemples: {0,1} : l'alphabet binaire
ASCII : l'alphabet informatique
8
3- Spécification des unités lexicales
- La longueur d'une chaîne s est notée: |s|
La longueur de la chaîne vide notée ε : |ε| = 0
9
3- Spécification des unités lexicales
Soit une chaîne s :
- préfixe de s est une chaîne obtenue en supprimant un
nombre quelconque (même nul) de symboles à la fin de s.
- suffixe de s est une chaîne obtenue en supprimant un
nombre quelconque (même nul) de symboles au début de s.
- sous-chaîne de s est une chaîne obtenue en supprimant un
préfixe et un suffixe.
- sous-suite de s est une chaîne obtenue en supprimant un
nombre quelconque (même nul) de symboles non
nécessairement consécutifs.
- Un langage est un ensemble quelconque de chaînes
construites sur un alphabet fixé.
10
3- Spécification des unités lexicales
3.2- Opérations sur les langages:
Soit L et M deux langages:
- Union de L et M : L U M = { ∀s / s ∈ L ou s ∈ M}
- Concaténation de L et M : LM = { st / s ∈ L et t ∈ M}
∞
- Fermeture de Kleene de L : L* =U i=0 Li
L* dénote un nombre quelconque (même nul) de
concaténation de L.
On note L0 = {ε}
∞
- Fermeture positive de L : L+ = Ui=1 Li
11
3- Spécification des unités lexicales
Exemples:
Soit L = {A,B,...,Z} U {a,b,...,z}
et C = {0,1,...9}
A partir de L et C, nous pouvons produire d'autres langages.
12
3- Spécification des unités lexicales
3.3- Expressions régulières:
Une expression régulière est une notation qui permet de
décrire un ensemble (une classe) de chaînes de caractères.
13
3- Spécification des unités lexicales
Les règles qui définissent les expressions régulières sur un
alphabet Σ sont:
14
3- Spécification des unités lexicales
soit r et s deux expressions régulières qui dénotent les langages
L(r) et L(s), alors:
(r) | (s) est une expression régulière qui dénote (L(r)) U (L(s)).
15
3- Spécification des unités lexicales
Exemples:
a|b*c : les chaînes constituées, soit d'un a, ou d'un
nombre quelconque, éventuellement nul, de la lettre b suivie
de la lettre c.
a | b = {a,b}
(a|b)(a|b) = {aa,ab,ba,bb}
Définition:
Si deux expressions r et s dénotent le même langage, on
dit qu'elles sont équivalentes et on écrit: r=s
Exemple: (a|b)= (b|a)
16
3- Spécification des unités lexicales
Propriétés algébriques sur les expressions régulières:
19
3- Spécification des unités lexicales
Exemples d'expressions régulières:
Un identificateur: lettre(lettre|chiffre)*
= [a-zA-Z][a-zA-Z0-9]*
Un réel:
(+|-)?(chiffre)+(.(chiffre)+)?((e|E)(+|-)?(chiffre)+)?
= [+-]?[0-9]+(.[0-9]+)?((e|E)(+|-)?[0-9]+)?
20
3- Spécification des unités lexicales
3.4- Définitions régulières:
Une définition régulière est une suite de définitions de la
forme:
d1 r1 Chaque di est un nom distinct
d2 r2 et chaque ri est une expression
régulière sur les symboles :
Σ U {d1,d2,...,di-1}
dn rn
21
3- Spécification des unités lexicales
Exemples:
1- Définition régulière d'un identificateur:
lettre A|B|...|Z|a|b|...|z
chiffre 0|1|2...|9
id lettre(lettre|chiffre)*
22
3- Spécification des unités lexicales
3- Définition régulière d'un réel:
L'alphabet Σ={0,1,...,9,.,e,E,+,-}
23
4- Reconnaissance des unités lexicales
Soit le fragment de grammaire des instructions conditionnelles:
inst si (exp) alors inst
|si (exp) alors inst sinon inst
|autre_inst
exp terme operel terme
|terme
terme id
|nb
Les terminaux de cette grammaire sont:
si, alors, sinon, (, ), operel, id et nb.
Pour les reconnaître, nous allons d'abord donner les définitions
régulières associées.
24
4- Reconnaissance des unités lexicales
4.1- Définitions régulières des terminaux de la grammaire:
A noter qu'il faut reconnaitre les blancs aussi pour les ignorer.
delim espace|tabulation|fin_de_ligne
blanc (delim)+
IF si
THEN alors
ELSE sinon
operel <|<=|==|<>|>=|>
id [A-Za-z][A-Za-z0-9]*
nb (+|-)?[0-9]+(.[0-9])?((+|-)?(e|E)[0-9]+)?
delim
début delim autre *
0 1 2
(ne rien retourner)
Remarque: autre veut dire, autre que les autres arcs sortants du
même état.
27
4- Reconnaissance des unités lexicales
2- Diagramme de transition des identificateurs:
lettre|chiffre
début lettre autre *
3 4 5
retourne(id,pointeur sur lexème)
28
4- Reconnaissance des unités lexicales
Diagramme de transition des entiers signés ou non:
chiffre
début +|- chiffre autre *
0 1 2 3
chiffre
29
4- Reconnaissance des unités lexicales
Diagramme de transition des nombres décimaux non signés:
chiffre chiffre
début chiffre chiffre autre *
0 1 2 3 4
30
4- Reconnaissance des unités lexicales
3- Diagramme de transition des nombres réels:
autre
c c c
début +|- c c e|E 11 +|- 12 c autre 14 *
6 7 8 9 10 13
c e|E c
autre
A l'état 14 d'acceptation avec recul, nous retournons l'unité lexicale
nb et un pointeur sur le lexème reconnu.
31
4- Reconnaissance des unités lexicales
4- Diagramme de transition des opérateurs de relation
16
> 18 * (operel, PGQ)
autre
début =
19
= 20 (operel, EGA)
15
26
'(' (po)
début 25
')' 27
(pf)
33
4- Reconnaissance des unités lexicales
4.3- La table de symboles:
La table des symboles est une structure de données constituée
des champs suivants:
35
4- Reconnaissance des unités lexicales
Supposons que le texte d'entrée est: "si gamma=10 alors aire >= 78 sinon g>1.3"
La table des symboles aura la forme suivante:
ptrlex unilex indice
0 si 1
3 id 2
9 operel 3
11 nb 4
14 alors 5
20 id 6
25 operel 7
28 nb 8
31 sinon 9
37 id 10
39 operel 11
41 nb 12
36
4- Reconnaissance des unités lexicales
La chaîne engendrée est:
"si$gamma$=$10$alors$aire$>=78$sinon$g$>$1.3"
37
4- Reconnaissance des unités lexicales
L'algorithme de la fonction d'insertion:
Fonction inserer
début
indice indice+1;création d'une nouvelle entrée de la TS
TS[indice].ptrlex l'adresse du début du lexème dans le
tampon lexèmes
TS[indice].unilex l'unité lexicale associée
retourner(indice)
fin inserer
38
4- Reconnaissance des unités lexicales
L'algorithme de la fonction de recherche:
Fonction chercher
début
j 0; pour parcourir la TS
trouve=faux; boolean pour arrêter la recherche
tant que (j<taille de la TS et non trouvé) faire
si TS[j].unilex=l'UL du lexème à chercher alors
si TS[j].ptrlex pointe sur le lexème
alors
trouve vrai;
retourne(j);
sinon j j+1;
sinon trouve retourne(-1)
Fin Fonction chercher
39
6- Automates à états finis (AEF)
Les automates à états finis sont des graphes orientés à l'image des
diagrammes de transition, avec certaines différences:
51
6- Automates à états finis (AEF)
6.1- Automates à états finis non déterministes (AFN):
Exemple: L'AFN qui reconnait le langage défini par l'expression
régulière : (a|b)* abb
a
début a 1
b 2
b 3
0
b
Remarque: Le non déterminisme ici est associé à deux arcs
sortants de l'état 0 avec le même symbole a.
52
6- Automates à états finis (AEF)
6.2- Tables de transition:
Nous pouvons représenter un AFN par une table de
transition, dont les lignes correspondent aux états et les colonnes
aux symboles d'entrée et à ε.
L'entrée pour un état donné et une entrée donnée est la valeur
de la fonction de transition appliquée à ces arguments.
Exemple: soit l'AFN précédant
Symbole a b ε
Etat
0 {0,1} {0} -
1 - {2} -
2 - {3} -
3 - - -
53
6- Automates à états finis (AEF)
6.3- Automates à états finis déterministes (AFD):
Un AFD est un cas particulier d'un AFN où:
- il n'y a aucun arc étiqueté par ε,
- pas plus d'un arc avec le même symbole sortant d'un état.
54
6- Automates à états finis (AEF)
Exemple: L'AFD qui reconnait le langage défini par l'expression
régulière : (a|b)* abb
a a
début a 1
b 2
b 3
0
a
b b
55
6- Automates à états finis (AEF)
Exemple 2: L'automate à états finis déterministe d'un commentaire à la C
autre *
début / * * / 4
0 1 2 3
autre
autre
début 0
/ /
1 2 3
/ autre
5 7
autre
57
6- Automates à états finis (AEF)
6.4- Algorithme d'application d'un AFD à une chaîne
Donnée:
Une chaîne d'entrée x terminée par un caractère de fin eof.
Un AFD D dont l'état initial est e0, les états finaux sont F et
la fonction de transition est trans.
Résultat:
"oui" si D accepte x
"non" dans le cas contraire.
58
6- Automates à états finis (AEF)
Méthode:
Appliquer l'algorithme suivant à la chaîne d'entrée x.
La fonction de transition (e,c) donne l'état vers lequel il existe
un arc provenant de l'état e pour le caractère c.
La fonction carcactereSuivant retourne le caractère suivant
de la chaîne d'entrée x.
e = e0 ;
c = caractereSuivant();
tant que (c!=eof){
s = trans(e,c);
c=caractereSuivant();
}
si (s ∈ F) retourner "oui"
sinon retourner "non";
59
7- Grammaires régulières
7.1- Définition:
Une grammaire est régulière si toutes ses productions
vérifient une des 2 formes:
A aB
ou A a
60
7- Grammaires régulières
Par analogie, il est possible de définir des grammaires
linéaires gauches:
A Ba
ou A a
Remarque:
Les grammaires régulières sont une sous-classe des
grammaires hors contextes.
Elles permettent de décrire les langages réguliers.
61
7- Grammaires régulières
7.2- Correspondance entre une grammaire régulière et un
automate:
Nous pouvons faire la correspondance entre un automate et
une grammaire régulière de la manière suivante:
62
8- Des expressions régulières aux automates
8.1- Conversion d'un AFN en un AFD:
64
8- Des expressions régulières aux automates
8.1- Conversion d'un AFN en un AFD:
Définition:
On définit l'ensemble des ε-successeurs d'un état p et on note ε-
Succ(p), l'ensemble des états q tels que:
ε
p q
On note ε-Succ(P) pour un ensemble d'états, l'union des
ε-successeurs des éléments p ∈ P.
Remarque: De tels successeurs peuvent être obtenus par une plusieurs
transitions.
On définit l'ensemble des successeurs d'un état p pour un caractère
a et on note Succ(p,a), l'ensemble des états q tels que:
a
p q
65
8- Des expressions régulières aux automates
8.1- Conversion d'un AFN en un AFD:
Algorithme: On se donne un automate (S, e0, F, Trans). L'automate
correspondant aura pour états des parties de S, c-à-d des
ensembles d'états.
On notera de manière générale P(E) l'ensemble des parties E
et plus spécifiquement PS l'ensemble des parties de S.
Un automate déterministe reconnaissant le même langage est:
- ensemble d'états : PQ
- état initial: ε-Succ(e0)
- état d'acceptation: {q ⊂ S | q ∩ F ≠ ∅}
- transition: {(q,a,q') | q,q' ∈ PQ, a∈ A, ∀y∈S.y∈q' ⇔
a
∃ x ∈ q.x y
66
8- Des expressions régulières aux automates
8.2- Construction d'un AFN à partir d'une expression régulière:
Algorithme de Mc Naughton-Yamada-Thomson:
Données: Une expression régulière r sur un alphabet Σ .
Méthode:
- Décomposer r en sous expressions constitutives.
- Les règles de construction d'un AFN contiennent des règles
de base pour traiter les sous-expressions .
67
8- Des expressions régulières aux automates
Algorithme de Mc Naughton-Yamada-Thomson:
Soit r une expression régulière,
Cas de base:
si r = ε , l'automate est:
début début ε
i f
ou
si r = a , l'automate est:
début a
i f
ε r1 ε
début
i f
ε ε
r2
début r1 ε r2
70
8- Des expressions régulières aux automates
3- si r = r1* = ε | r1+ , l'automate associé à r est:
ε
début ε r1 ε
i f
ε
La répétition non nulle (+) consiste à relier l'état final de
l'automate de r1 à son état initial.
Pour ajouter ε au langage reconnu par l'automate, il suffit de
créer un nouvel état initial et un état final et de les relier avec une
transition ε .
71
8- Des expressions régulières aux automates
Exemple: Soit l'expression régulière a | b c*
- Pour 'a' , 'b' et 'c', on a les automates:
début a
1 2
début b
4 5
début 7 c 8
72
8- Des expressions régulières aux automates
Exemple: Soit l'expression régulière a | b c*
- Pour c* , on a:
ε
début ε c ε
6 7 8 9
ε
- Pour b c* , on a:
ε
début b ε ε c ε
4 5 6 7 8 9
73
8- Des expressions régulières aux automates
Exemple: Soit l'expression régulière a | b c*
- Pour a|bc* , on a:
début ε a ε
0 1 2 3
ε ε
b ε ε c ε
4 5 6 7 8 9
ε
L'expression régulière équivalente:
a|b|bcc* = a|b|bc+ = a|bc*
74
8- Des expressions régulières aux automates
Elimination des ε-transitions:
Elle se fait en 4 étapes:
75
8- Des expressions régulières aux automates
Elimination des ε-transitions:
1- Augmentation des transitions:
On construit un nouvel automate où il existe une transition
entre l'état i et l'état j étiqueté par x, s'il existe un état k tel qu'il
existe une suite d' ε-transitions de i à k et qu'il existe une
transition x de kà j.
i
x
j
ε x
k
76
8- Des expressions régulières aux automates
Elimination des ε-transitions:
1- Augmentation des transitions:
2- Un état est final s'il existe est une suite d'ε-transitions qui
mènent à un état final. a
début ε a ε
0 1 2 3
ε
ε ε
b ε ε c ε
4 5 6 7 8 9
b c c
c
77
8- Des expressions régulières aux automates
Elimination des ε-transitions:
3- On supprime les ε-transitions:
4- On supprime les états inaccessibles à partir de l'état initial.
a
début a
0 1 2 3
b c
4 5 6 7 8 9
b c c
c
78
8- Des expressions régulières aux automates
Elimination des ε-transitions:
3- On supprime les ε-transitions:
4- On supprime les états inaccessibles à partir de l'état initial.
a
début
0 2
5 8
b c
c
79
8- Des expressions régulières aux automates
8.3- Minimisation du nombre d'états d'un AFD:
But: Obtenir un automate ayant le minimum d'états possible.
Méthode:
1- Faire deux classes, A contenant les états finaux et B
contenant les états non finaux.
2- S'il existe un symbole
80