• Aucun résultat trouvé

IFT451 Introduction aux langages formels

N/A
N/A
Protected

Academic year: 2022

Partager "IFT451 Introduction aux langages formels"

Copied!
17
0
0

Texte intégral

(1)

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

(2)

IFT313 © Froduald Kabanza

2

Sujet couvert

• Convertir une expression régulière en automate fini.

(3)

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.

(4)

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

(5)

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.

(6)

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.

(7)

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

a

f

(8)

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

(9)

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

ε ε

(10)

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

(11)

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 ε

(12)

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

.

(13)

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 :

(14)

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 :

(15)

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]

(16)

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).

(17)

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.

Références

Documents relatifs

 Pour ce faire la partie gauche de la production (un non-terminal) est enlevée de la pile et remplacée par la partie droite de la production. (q, ε, A)  (q, a) pour chaque

- On vient de voir qu’en calculant First(S) ou First(XYS) on doit tenir compte des non-terminaux qui pourraient dériver la chaîne vide et de ceux qui pourraient les suivre dans

 Parce que les deux règles ont la même fonction d’analyse (c-à-d., la fonction correspondant au non terminal dans la partie gauche de chaque production).. Si elle partagent le

– Si le symbole est un non terminal, l’attribut pourrait être une donnée calculée en utilisant les actions sémantiques. – Une grammaire avec des attributs est appelée

• Pour aller au-delà, il faut utiliser d’autres outils ou des méthodes adhoc pour évaluer les attributs (avec l’aide

• Pouvoir programmer un analyseur syntaxique récursif pour une grammaire donnée. • Connaître les fondements d’un générateur d’analyseur syntaxique LL tel

AFD pour préfixes viables, avec état initial I0 et fonction de transition goto Initialement la pile contient I0.. L’état I2 contient élément Shift (T ® T.*F) et un élément

- Pour montrer que la grammaire n’est pas LR(0), on montre que l’AFD correspon- dant pour les préfixes viables a au moins un état contenant à la fois un élément shift et