IFT451
Introduction aux langages formels
Froduald Kabanza
Département d’informatique Université de Sherbrooke
planiart.usherbrooke.ca/kabanza/cours/ift313
Convertir un expression régulière
en un AFN
IFT313 © Froduald Kabanza
2
Sujet couvert
• Convertir une expression régulière en automate fini.
IFT313 © Froduald Kabanza
3
Objectif
• Être capable d’écrire un automate fini acceptant le langage décrit par une expression régulière donnée.
IFT313 © Froduald Kabanza
4
Références
[1] Sudkamp, T. A.. Languages and Machines. Third Edition Edition.
Addison-Wesley, 2005.
– Sections 6.1 à 6.2.
[2] Appel, A. and Palsberg. J. Modern Compiler Implementation in Java.
Second Edition. Cambridge, 2004.
– Section 2.4
[3] Wolper, P. Introduction à la calculabilité, 3è édition. Dunod, 2006 – Section 2.7
[4] Aho, A., Lam, M., Sethi R., Ullman J. Compilers: Principles, Techniques, and Tools, 2nd Edition. Addison Wesley, 2007.
– Section 3.7.4
IFT313 © Froduald Kabanza
5
Pourquoi la conversion ?
- Les expressions régulières sont souvent plus faciles à décrire, mais plus compliquées à implémenter directement.
- Les automates finis non déterministes (AFN) sont utiles parce qu’il est très facile de convertir une expression régulière en AFN.
- Ceci nous donne deux chois pour coder un analyseur lexical (scanner) à partir d’une expression régulière :
a. Convertir l’AFN en AFD et utiliser un pilote (driver) de AFD.
b. Utiliser un pilote (driver) de AFN.
- Nous voyons la première approche en détail. La deuxième approche est laissée comme exercice.
IFT313 © Froduald Kabanza
6
Algorithme RegExpToNFA
- Entrée : Une expression régulière r sur un alphabet A
- Sortie : Un AFN acceptant L(r).
- Méthode :
+ Pour chaque expression régulière r de base (c-à-d., ε ou un élément de A), il existe un AFN très simple pour L(r).
+ Pour chaque expression régulière plus complexe, u, (par ex- emple: rs, r|s, r*, r+, [abc], [a-z],…), on obtient l’AFN pour L(u) en combinant les AFNs pour L(r), L(s), L(a), L(b), … + On peut ensuite optimiser l’AFN obtenu.
IFT313 © Froduald Kabanza
7
Cas de base
1. Pour ε, construire l’AFN :
tel que i est un nouvel état initial et accepteur.
2. Pour chaque symbole a de l’alphabet, construire l’AFN :
Là aussi i et f sont de nouveaux états.
i
i
af
IFT313 © Froduald Kabanza
8
Cas récursifs
• Soit N(r) et N(s) les automates pour les expressions régulières r et s :
• Pour les cas récursifs, nous avons besoin de manipuler explicitement uniquement les états initiaux et finis des automates à combiner.
r s
IFT313 © Froduald Kabanza
9
Cas récursifs
3. Pour l’expression régulière rs, construire l’AFN N(rs) :
C-à-d.: L’état initial de N(rs) est l’état initial de N(r) et les états finaux de N(rs) sont les états finaux de N(s). Ensuite, il faut ajouter des transi- tions ε partant des états finaux de N(r) vers l’état initial de N(s).
r
εs
ε ε
IFT313 © Froduald Kabanza
10
Cas récursifs
4. Pour l’expression régulière r|s, construire l’AFN N(r|s) :
C-à-d.: on crée un nouvel état i, avec des transitions ε aux états initiaux de N(r) et N(s). Les états finaux de N(rs) sont ceux de N(r) et N(s).
r
s
ε
ε
i
IFT313 © Froduald Kabanza
11
Cas récursifs
5. Pour l’expression régulière r*, construire l’AFN N(r*) :
C-à-d: On crée un nouvel état initial i avec une transition ε à l’ancien état initial de N(r), ainsi que des transitions des états finaux de N(r) à l’ancien état initial de N(r).
i ε
εε
r ε
IFT313 © Froduald Kabanza
12
Autres expressions
6. Pour r+, construire N(r+) comme N(rr*).
7. For r?, construire N(r?) comme N(r|ε).
8. For abc, construire N(abc) comme N(a(bc)).
9. Finalement pour [abc], construire N([abc]) comme N(a|(b|c)).
En général, pour les abréviations, utilisez la définition correspondante
.
IFT313 © Froduald Kabanza
13
Exemple
r = if
1 i 2 I
N(i) :
3 f 4 F
N(f) :
1 i 2
ε3 f 4 IF
N(if) :
1 i 2 f 3 IF
Après simplification :
IFT313 © Froduald Kabanza
14
Exemple
r = [0-9]+ | [0-9]*.[0-9]+
9
1 2
0
.. .
3
ε1
09.. . 2
ε
ε
N([0-9]), après simplifications :
N([0-9]*), après simplifications :
IFT313 © Froduald Kabanza
15
Exemple (suite)
r = [0-9]+ | [0-9]*.[0-9]+
9
1
0
5 .. .
ε
4
ε
ε
2
90.. . 3
ε
ε
NUM
6
90.. . 7
ε
REAL
.
Ainsi de suite … À la fin on obtient :
1 3
4
[0-9]
2
[0-9]
[0-9]
.
.
REAL NUM
[0-9]
IFT313 © Froduald Kabanza
16
Résumé
- Il est facile de traduire une expression régulière en un AFN - La méthode qu’on vient de voir n’est pas optimale.
- Il existe des approches plus efficaces.
- On peut formellement démontrer que la méthode précédente est cor- recte. (Laissé comme exercice).
- Donc pour toute expression régulière il existe un AFN qui accepte le langage décrit par l’expression.
- L’inverse est vrai aussi (Laissé comme exercice).
IFT313 © Froduald Kabanza
17
Leçon suivante
- Nous venons de voir comment générer un AFN à partir d’une expression régulière.
- L’étape prochaine est de voir la construction d’un AFD correspondant à un AFN.
- Nous savons déjà comment programmer un scanner en utilisant un AFD (Devoir 1).
- La construction d’un AFD à partir d’un AFN nous permettra donc d’im- plémenter des scanners à partir des expressions régulières.
- L’alternative est de scanner en utilisant un AFN directement. Nous abor- derons ce sujet sommairement.