Académique Documents
Professionnel Documents
Culture Documents
Compilation
I. Mots et langages
II. Les automates finis et les langages réguliers
III. Les grammaires
IV. Les grammaires non contextuelles
V. Les automates à piles
VI. Les machines de Turing
VII. Décidabilité
Exercice :
Donner les i associés aux mots sivants :
1) abba sur le vocabulaire {a, b}
2) (x1*(x2+x1)) sur le vocabulaire {x1, x2, +, *, (, )}
Leila Ben Ayed Théorie des Langages et Compilation 8
I.1. Vocabulaire et mot
Corrigé:
1) Si le vocabulaire X = {a, b} alors dans le mot abba,
1 = a
2 = b
3 = b
4 = a
2) Si le vocabulaire est X = {x1, x2, +, *, (, )} alors dans le mot (x1*(x2+x1))
1 = ( 2 = x1 3 = *
4 = ( 5 = x2 6 = +
7 = x1 8 = ) 9 = )
Leila Ben Ayed Théorie des Langages et Compilation 9
I.1. Vocabulaire et mot
Longueur d’un mot : La longueur d’un mot est le
nombre de symboles qu’il contient , on le note |
|.
Exercice :
Quelle est la longueur des mots abba et sur le
Vocabulaire {a,b}
Corrigé:
Le mot abba est de longueur 4, |abba| = 4
Le mot est de longueur 0, | | = 0
Exemple:
• Si le vocabulaire est X = {0, 1, 2, 3, …9}
L = { représentations décimales des nombres entiers
naturels}
L = |N
• Si le vocabulaire est X = {x1, x2, +, *, (, )} x1++ X*
L = {expressions arithmétiques parenthésées}
manipulant x1, x2, + et * (x1+ x2)
Leila Ben Ayed Théorie des Langages et Compilation 12
I.2. Langage
(main) element de X*
main(){}
Propriétés
Soient A, B, C des langages, on a A.(B+C) = A.B + A.C
(A+B).C = A.C+B.C
A B AC BC
CA CB
L’opération + A+ = Ai
i1
Leila Ben Ayed Théorie des Langages et Compilation 18
I.3. Opérations sur les langages
Exercice :
Calculer A* pour chacun des ensembles A suivants:
1) A = {a}
2) A = {X* / || = 2k+1 / k 0}
Corrigé :
1) Si A = {a} alors A* = {a}* = a*
Car A* = A0 + A1 + A2 +… Ai +…
A0 = {} = {a0}
A1 = AA0 = {a} {} = {a} = {a1}
A2 = AA1 = {a}{a} = {aa} = {a2}
Ai = {ai}
Ai+1 = A Ai = {a}{ai} = {ai+1}
….
A* = {, a, aa, aaa, …} = {a0, a1, a2, a3, …} = a*
A0 + A1 + A2 = X*
Donc A* = X*
–L est l’ensemble des mots sur {a, b} où tous les a précèdent les b et sont de
même nombre
L = { anbn, n 0}
– L est l’ensemble des mots sur {a, b} où tous les a précèdent les b et
sont de même nombre
La définition par propriété mesurable est la suivante :
L = { anbn, n 0}
L = { {a, b}*/ = a ou = b ou = aa ou = bb
ou = a1a ou = b1b et 1 L}
OFF ON
Presser
La séquence:
presser presser presser est acceptée
Par ce que
•en partant de l’état off, avec un presser on passe à l’état ON
•En lisant le deuxième presser à partir de l’état ON, on revient à l’état OFF
•Le dernier presser lu nous mène de l’état OFF à l’état ON
Donc à la fin de la lecture des trois presser, trois transitions sont effectuées et la
dernière nous mène à l’état ON donc la séquence est acceptée.
Leila Ben Ayed Théorie des Langages et Compilation 32
II.1. Les automates finis déterministes
Exemple d’un automate fini
presser
Presser
presser presser
presser presser presser
presser
OFF
OFF ON
ON
Le mot est lu et l’état est final
Presser
presser donc le mot est accepté
La séquence:
presser presser presser est acceptée
Par ce que
•en partant de l’état off, avec un presser on passe à l’état ON
•En lisant le deuxième presser à partir de l’état ON, on revient à l’état OFF
•Le dernier presser lu nous mène de l’état OFF à l’état ON
Donc à la fin de la lecture des trois presser, trois transitions sont effectuées et la
dernière nous mène à l’état ON donc la séquence est acceptée.
Leila Ben Ayed Théorie des Langages et Compilation 33
II.1. Les automates finis déterministes
Exemple d’un automate fini
Presser
OFF ON
Presser
La séquence:
presser presser n’est pas acceptée par l’automate
Par ce que
•en partant de l’état off, avec un presser on passe à l’état ON
•En lisant le deuxième presser à partir de l’état ON, on revient à l’état OFF
A Presser
OFF ON
Presser
Le langage accepté par cet automate est l’ensemble des séquences de presser qui,
partant de l’état initial OFF, après la lecture de tous les symboles de la séquence,
on se trouve à l’état ON.
Ce langage (le langage accepté par l’automate A, L(A)) est l’ensemble des
séquences de presser de longueur impaire.
L(A) = { {presser}*/ | | = 2k + 1, k 0}
A a
P I
L’état initial devient un état final puisque le mot est accepté (pour k = 0).
En étant à l’état initial de l’automate, on peut ne rien lire (c-a-d lire 0 symboles
donc lire ) et on est déjà à un état final.
Le plus petit mot accepté est aa (On atteint l’état final après la lecture de aa).
Après il faudra continuer à avoir un nombre paire de a. Donc quand on se trouve à
l’état d’acceptation ou l’état final, il faudra continuer à lire des séquences de 2a
pour revenir à l’état final.
Le plus petit mot accepté est aa (On atteint l’état final après la lecture de aa).
Après il faudra continuer à avoir un nombre paire de a. Donc quand on se trouve à
l’état d’acceptation ou l’état final, il faudra continuer à lire des séquences de 2a
pour revenir à l’état final.
Le plus petit mot accepté est aa (On atteint l’état final après la lecture de aa).
Après il faudra continuer à avoir un nombre paire de a. Donc quand on se trouve à
l’état d’acceptation ou l’état final, il faudra continuer à lire des séquences de 2a
pour revenir à l’état final. Les b on peut les lire à n’importe quel état et on reste
au même état puisqu’ils n’engendrent pas une transitions contrairement à un a lu
qui nous fait passer de q0 à q1 ou de q1 à q2 ou de q2 à q0 par ce qu’il faut les
comptabiliser.
A
a a a
q0 q1 q2 q3
a
Le plus petit mot accepté est a (On atteint l’état final après la lecture de a). Après il
faudra continuer à avoir un nombre multiple de 3a. Donc quand on se trouve à
l’état d’acceptation ou l’état final, il faudra continuer à lire des séquences de 3a
pour revenir à l’état final.
Le plus petit mot accepté est a (On atteint l’état final après la lecture de a). Après il
faudra continuer à avoir un nombre multiple de 3a. Donc quand on se trouve à
l’état d’acceptation ou l’état final, il faudra continuer à lire des séquences de 3a
pour revenir à l’état final.
(b+c)*a(b+c)*(a(b+c)*a(b+c)*a(b+c)*)*
b, c
1 0,1,2,3,4,5,6,7,8,9
q0 q1 q2
c*1c
(0+1+2+…+9)*1(0+1+2+…9)
1,2,3,4,5,6,7,8,9
q0 q1
0*(1+2+…9)(0+1+2+…+9)*
a,b a,b a
a a
q0 q1 q0 q1
b
Non complet sur {a, b} car
Ambigu sur {a, b} car
(q0, b) =
(q0, a) = {q0, q1}
L(A) = a(a+b)*
L(A) = ((a+b)*a+)+
b a
a
q0 q1 L(A) = (b*a+)+
b
Automate fini déterministe sur {a, b} car il est complet et non ambigu:
(q0, a) = {q1} (q0, b) = {q0} (q1, a) = {q1} (q1, b) = {q0}
Leila Ben Ayed Théorie des Langages et Compilation 47
II.2. Langage accepté par un automate fini
Définition 11. Configuration
Une configuration est un couple
(q, )
où q est l’état courant et est le reste du mot à lire.
b b b
A
a a
q0
q0 q1
q1 q2
a
(q0, aa) (q1, a) (q2, )
(q0, bba) (q0, ba) (q0, a) (q1, )
Leila Ben Ayed Théorie des Langages et Compilation 48
II.2. Langage accepté par un automate fini
ssi a
x
y
a / x = a y et (q, a) = {p}
b b b
A
a a
q0
q0 q1
q1 q2
(q, x) |-- (p, y) ssi (q, x) |-- (q1, x1) |-- (q2, x2) |--…(qk, xk) = (p, y)
* k
* k
b b b
A
a a
q0
q0 q1
q1 q2
Corrigé:
*
A
a a
q0 q1 q2
a
Corrigé :
L0 = {a} L1 (1) L1 = {a} L2 (2)
L2 = {a} L0 + {} (3)
(1) + (2) L0 = {a}{a}L2 = {aa}L2 (4)
(4) + (3) L0 = {aa} L2 = {aa}({a}L0 + {}) L0 = {aaa}L0 + {aa}
L0 = {aaa}*{aa} = (aaa)*aa
D’après le lemme d’Arden
2) Calculons L0
L0 = {a} L0 + {b}L1 + {} (1)
L1 = {b} L1 + [] (2)
(2) L1 = {b}*{} d’après le lemme d’Arden L1 = b* (3)
(1) + (3) L0 = {a}L0 + {b} b* + {}
L0 = {a}L0 + b+ + {}
L0 = {a}L0 + b* car b++{} = b*
L0 = {a}*b* = a*b*d’après le lemme d’Arden
L(A) = L0 = a*b* donc l’automate A reconnaît le langage a*b*
Leila Ben Ayed Théorie des Langages et Compilation 58
II.2. Langage accepté par un automate fini
(Lemme d’arden)
Exercice :
1) Construire une automate qui accepte le langage (a+b)*
2) Vérifier que l’automate construit reconnaît le langage (a+b)* (L0 est le langage accepté par
l’automate puisque c’est le langage où q0 est l’état initial)
Corrigé:
1)
a,b
A
q0
a a,b
a b
a,b
q0 q1
{q0} {q0, q1} {q1}
a a,b
a b
a,b
q0 q1
{q0} A {q0, q1} B {q1} C
a
a b
a
A B
{q0} A {q0, q1} B {q1} C
a,b
b b {q0, q1} B {q0, q1} B {q1} C
C
{q1} C {q1} C {q1} C
Corrigé :
Etape1. Définir les nouveaux groupes d’états
a b
a a,b
a b
a
q0 q1
{q0} A {q0, q1} B P
a
a b
a
A B {q0} A {q0, q1} B
a,b P
II.4.1. Définition
Un langage L est dit régulier s’il existe un automate fini A
qui l’accepte (L(A) = L)
Le lemme de pompage
Soit L un langage régulier reconnu par
un automate à n états.
Pour tout mot z de L, z est de longueur
≥ n, il existe une factorisation z = uvw,
où |uv| ≤ n, v ≠ et,
pour tout i ≥ 0, on a uviw L.
a a,b
Corrigé:
a
q01 q1
A
a a
q0
b
b
a,b
a,b q02 q2
Corrigé:
a a,b
b
a b a,b
A q01 q1 q02 q2
b a,b
a,b
a a,b
b
a b a,b
A q01 q1 q02 q2
b a,b
a,b
a a L(A1) = a*ba*
L(A) = (L(A1))* = (a*ba*)*
b Par ce que on a :
A1 q01 q1
(q01, a q01) et (q01, b, q1)
dans 1 qu’on ajoute :
(q0, a, q01) et (q0, b, q1) à
_____
Corrigé: Par ce que on a :
a a,b (q01, a, q01) et (q01, b, q1)
A
b dans 1 qu’on ajoute :
a q01 q1 (q1, a, q01) et (q1, b, q1) à
q0
b
a
a a L(A1) = a*ba*
L(A) = (L(A1))+ = (a*ba*)+
b Par ce que on a :
A1 q01 q1
(q01, a q01) et (q01, b, q1)
dans 1 qu’on ajoute :
(q0, a, q01) et (q0, b, q1) à
_____
Corrigé: Par ce que on a :
a a,b (q01, a, q01) et (q01, b, q1)
A
b dans 1 qu’on ajoute :
a q01 q1 (q1, a, q01) et (q1, b, q1) à
q0
b
a
Corrigé:G1 G2
0 (q0, q2, q3) (q1)
G1 G2 G3
P1 (q0, q3) (q2) (q1) (q2, a, q0) est
P2 (q0, q3) (q2) (q1) dans A minimal
q0 q2 q1 car (q2, a, q3) était
On obtient le dans A et que le
A minimal a a group d’états (q0,
q0 q1 q2
q3) est renommé
a q0
Lemme
{langages réguliers} = {langages représentés par une expression
régulière}
Rq. Un langage est dit régulier s’il existe un automate fini qui l’accepte ou une
expression régulière qui le représente
Exemples:
a*b*
(a+b)*c+
(0+1+2+…9)+représentations décimales des entiers
(a+b+…z+A+B+…Z)(a+b+…z+A+B+…Z+0+1+…9)*
les identificateurs alphanumériques qui
alphabétique
Exemples:
(a+b)*aa mots sur {a, b} ayant aa comme facteur droit
(a+b+c)*abc(a+b+c)* mots sur {a,b,c} ayant abc comme facteur
0*(1+2+…9)(0+1+…9)* représentations décimales des entiers non nuls
Corrigé:
Supposons qu’il existe un automate fini A à n états qui accepte L (L(A) = L) (1)
Alors A accepte en particulier anbn,
Considérons la séquence de configurations aceptables pour anbn
(q0, anbn) |-- (q1, an-1bn) |--…..(q2n-1, b) |-- (q2n, ) où q2n F
Cette séquence contient 2n+1 états
Donc un état au moins doit apparaître plus qu’une fois dans les n premiers mouvements. Soit q cet état, si = sj
= q pour certaines valeurs de i et j telles que 0 i j n
Ceci entraine
+ + +
(q0, anbn) |-- (q, an-ibn) |--…..(q, an-jbn) |-- (q2n, )
+ +
(q0, an-j+ibn) |-- (q, an-jbn) |--…..(q2n, )
C-a-d an-j+i bn L(A)
C-a-d L L(A) (absurde) avec l’hypothèse (1)
Plan
III.1. Définition d’une grammaire
III.2. Langage généré par une grammaire
III.3. Grammaire régulière
III.4. Langages réguliers et grammaires
régulières
III.5. Les formes normales de grammaires
Leila Ben Ayed Théorie des Langages et Compilation 87
III.1. Définition d’une grammaire
S abNSc
S S abNSc
bNa abN abNabNScc
bNb bbN abNabNcc
bNc bc aabNbNcc
aabNbcc
Génère {anbncn, n 0} aabbNcc
aabbcc
e a S b
aeb = ab
e
e
aeb
aaebb
Leila Ben Ayed Théorie des Langages et Compilation 91
III.1. Définition d’une grammaire
Exercice : Soit le langage L suivant :
L = a* ={ai, i>=0}
S -> aS
S S S S -> e
e a S
e
ae = a
S -> p
S -> S V S
S -> S /\ S
S -> (S)
S -> ! S
S -> S -> S
L = { w / w = p ou w = w1 V w2 ou w = w1 /\w2 ou w = (w1)
ou w = ! W1 ou w = w1 ->w2, w1 L et w2 L}
1,2,3,4,5,6,7,8,9
A B
Définition:
Soit G = (V, T, S, R) une grammaire. Si T X où X est un
alphabet alors on dit que G est une grammaire sur X.
Définition:
L(G) = { T* / est dérivé de S}
On dit que L(G) est le langage généré par G.
Remarque:
Il est possible d’éliminer les règles de la forme : N a en les
remplaçant par N aX
X
Où X est le nouveau symbole n’apparaissant pas dans la
grammaire initiale.
Théorème
Pour chaque alphabet X,
{Langages réguliers sur X}
=
{L(G) / G est une grammaire régulière sur X}
=
{L(M) / M est un automate fini sur X}
Rq. Un langage est dit régulier s’il existe un automate fini qui
l’accepte ou bien une grammaire régulière qui le génère ou
bien une expression régulière qui le représente.
Leila Ben Ayed Théorie des Langages et Compilation 104
III.4. Langages réguliers et grammaires
régulières
Preuve:
• Conversion grammaire / automate
Soit G = (V, T, S, R) une grammaire régulière.
1) On peut transformer la grammaire G en une grammaire
G’ = (V’, T, S, R’)
Qui génère le même langage sur G, mais n’ayant pas de règle dont le coté droit
consiste en un seul symbole terminal (remplacer N a par
N aX, X }.
2) On définit un automate fini M = (Q, X, , q0, F)
Q = V’
X=T
= { (p, x, q} / p xq R’}
q0 = S
F = {q / (q ) R’}
Corrigé Exercice 2:
G = (V, T, A, R)/ V = {A, B}, T = {a, b}, R = {A bB | aA|, A bB |}
A bB
a b A aA
b
A B A
B bB
B
A BC ; A a
où
A, B, C V et a X {}
A av
où
a X, A V, v V*
Exemple
G = ({S}, {a, b}, S, {S aSb |})
S aSb ici U = S x = et y =
V = aSb A = S et t = aSb
aSb aaSbb ici U = aSb x = a et y = b
V = aaSbb A = S et t = aSb
k
UV U U1 U2 … Uk = V
G G
* k
S k1/S
*
Par exemple S aabb Puisque S aSb aaSbb aabb
Exercice :
1) Construire une grammaire G qui génère des expressions booléennes sur les
nombres entiers, les opérateurs arithmétiques {+, *}, les opérateurs booléens {et,
ou, non} et les opérateurs relationnels {>, <, = }
2) Vérifier que le mot (nb + nb) > nb est généré par la grammaire
Corrigé :
G = (V, X, Eb, R)
V = {Ea, Eb, Er}
X = {nb, +, *, (, ) , >, <, = , et, ou, non} où nb représente un nombre entier.
R={ Ea Ea + Ea | Ea * Ea | nb | (Ea)
Er Ea > Ea | Ea < Ea | Ea= Ea
Eb Er | non Eb | Eb et Eb | Eb ou Eb | (Eb)
}
Lemme1
Tout langage L hors-contexte tel que L
peut être engendré par une grammaire
hors-contexte sous forme normale de
GREIBACK
-Exemple
S AB
Aa
Bb
Pour le mot ab, on a deux dérivations possibles :
1) S AB aB ab
2) S AB Ab ab
Ces deux dérivations ne diffèrent que par l’ordre d’application des règles. En
conséquence, on fait correspondre le même arbre.
A B
a b
A = 0 1 2 …… n =
et
i = 0, …, n-1 : i = ui Ai yi
i+1 = ui Zi yi
(Ai Zi) R ; ui X*
Lemme 2
Pour tout mot d’un langage L(G), il
existe une dérivation la plus à gauche
a b S b S
a a A b
b S
a
Leila Ben Ayed Théorie des Langages et Compilation 126
IV.5. Dérivation, arbre et ambiguïté
Exercice :
Soit une grammaire avec les règles de production suivantes :
R = {S aAb, S a, S abSbS, A bS, S abSb}
1) Donner une dérvation la plus à gauche du mot abababab
2) Construire un arbre associé à cette dérivation
3) Construire deux dérivations les plus à gauche pour le mot abab
Corrigé:
1) La dérivation la plus à gauche : 2)
S abSbS (3) S
ababS (2)
ababaAb (1) a b S b S
abababSb (4)
abababab (2) a
a A b
b S
a
Leila Ben Ayed Théorie des Langages et Compilation 127
IV.5. Dérivation, arbre et ambiguïté
R = {S aAb, S a, S abSbS, A bS, S abSb}
S S
a A b a b S b
b S a
Corrigé :
1) G / L(G) = L1.L2 = l+(l+c)*
G = ({S1,S2,S}, LC, S, R1R2 {SS1S2})
Leila Ben Ayed Théorie des Langages et Compilation 135
IV.6. Propriétés des langages non contextuels
(LNC)
V.1. Présentation
V.2. Définition d’un automate à pile
V.3. Description d’un automate à pile
V.4. Exemple d’automate à Pile
V.5. Fonctionnement d’un automate à pile
V.6. Langages acceptés par des automates à pile
V.7. Construction d’un automate à pile à partir d’une
grammaire non contextuelle
A x B
Partant d’une grammaire non contextuelle ayant une règle de production de la forme
(A x B y), l’automate doit se souvenir qu’il doit lire la chaine y après avoir lu la sous
chaine dérivant de B. Pour cette raison, on ajoute une pile à l’automate fini où on
empile ce que nous avons à lire (x) et après avoir dérivé la sous chaine dérivant de B,
on doit lire y et dépiler le y de la pile.
On parle d’automate à pile
Où
X est un alphabet
Q est un ensemble d’états
q0 Q est l’état initial
F Q est l’ensemble des états finaux
est le vocabulaire de la pile
Z0 est le symbole initial de la pile (symbole de fond de pile)
d est une fonction de transition
d : Q x (X {}) x { parties finies de Q x *}
Tête de lecture/écriture
q Unité de contrôle
Tête de lecture
U V Ruban d’entrée
L’unité de contrôle, se trouve à un état q munie de deux têtes (L/E sur pile
et L sur ruban d’entrée). Le ruban d’entrée sert de support à un mot de X *.
La lecture se fait de gauche à droite. La pile est un ruban infini du côté droit
où sont lus et écrits les symboles de la pile (*). La case lue est toujours
celle qui contient le symbole le plus à droite.
Leila Ben Ayed Théorie des Langages et Compilation 143
V.4. Exemple d’un automate à pile qui
accepte {ancbn / n 0}
(a, Z0, Z0a)
(a, a, aa) •Commencer par empiler tous les a
q0 •On doit lire un c
• Le c peut être précédé d’un a
comme il peut être le seule
symbole dans le mot
(c, a, a) • Dans les deux cas, il ne doit pas
(c, Z0 , Z0) être empilé et il faut changer
d’état pour séparer la lecture
des a de la lecture des b.
•si on lit un b alors il doit être
q1 (b, a, ) précédé d’un a. On le dépile et on
(, Z0, ) continue à accepter uniquement des
b et dépiler les a correspondants.
•A la fin, il faut arriver à vider la pile
C C C
q0 q1 q1
Z0 Z0
Le mot aacb n’est pas accepté par ce que on n’arrive pas à vider la pile
Leila Ben Ayed Théorie des Langages et Compilation 146
V.5. Fonctionnement d’un automate à pile
a- Configuration
Une configuration d’un automate à pile est le contenu des deux rubans, d’un état
et de la lettre à lire
vide
Leila Ben Ayed initialement Théorie des Langages et Compilation 147
V.5. Fonctionnement d’un automate à pile
b- Configuration successeur de = (U, q, aV, Z)
est une configuration successeur de qu’on note |-- si
c- Configuration k successeur
k
|-- |-- 1 |-- 2 |-- … k / k =
* k
|-- k0 |--
+ k
Leila
|--Ayed
Ben k>0 |-- Théorie des Langages et Compilation 148
V.5. Langages acceptés par un automate à
pile
Deux critères d’acceptation sont définis pour un automate à pile
- Le critère pile vide (mot accepté = mot lu + pile vide)
- Le critère état final (mot accepté = mot lu + état final)
Pour un automate à pile A, deux langages sont acceptés L(A) et N(A) qui peuvent être
vides (cas de N(A) lorsqu’il n’ya pas d’état final N(A) = si F = )
*
L(A) = { X* / (, q0, , Z0) |-- ( , q, , )}
*
N(A) = { X* / (, q0, , Z0) |-- (, qF, , )/ qF F}
q0
1) / (q0, , Z0) = (q1, S)
(q1, , S) = (q1, bSa)
(q1, , S) = (q1, )
(q1, a, a) = (q1, ) (, Z0, S)
(q1, b, b) = (q1, )
q1
(, S, bSa) (, S, )
(a, a, ) (b, b, )
q1
(b, a, )
(b, Z0, Z0)
q2
Leila Ben Ayed
(b, Z0, Z0Théorie
) des Langages et Compilation 160
Exercices
Exercice 5 :
1) Construire un automate à pile qui accepte {anbm / m>n} avec le critère pile vide
2) Vérifier que le mot abb est accepté par l’automate
(a, Z0, Z0a)
1) (a, a, aa)
q0
2) Vérifier que le mot = abb est accepté
par l’automate
(, q0, abb, Z0) |-- (a, q0, bb, Z0a)
(b, a, )
(b, Z0, Z0) |-- (ab, q1, b, Z0)
|-- (abb, q2, , Z0)
|-- (abb, q2, , )
q1 (b, a, )
(, a, )
q2 (, Z0, )
(, a, )
(, Z0, )
Leila Ben Ayed Théorie des Langages et Compilation 166
Exercices
Exercice 11 :
1) Construire un automate à pile qui accepte {anbmct/ t = n+ m} avec le critère pile
vide
2) Vérifier que le mot abcc est accepté par l’automate
(a, Z0, Z0a)
1) (a, a, aa) •Il est nécessaire de vider la pile
q0 (, Z0, )
n=m=0
(b, Z0, Z0b) 2) Vérifier que le mot = abcc est accepté par
(b, a, ab) l’automate
(c, a, ) (, q0, abcc, Z0) |-- (a, q0, bcc, Z0a)
q1
(b, b, bb) |-- (ab, q1, cc, Z0ab)
|-- (abc, q2, c, Z0a)
(c, b, ) |-- (abcc, q2, , Z0)
n=0 |-- (abcc, q2, , )
q2
(c, b, )
(c, a, )
m=0 (, Z0, )
Leila Ben Ayed Théorie des Langages et Compilation 167
Exercices
Exercice 11 :
1) Construire un automate à pile qui accepte {anbmct/ t = n+ m} avec le critère état
final
2) Vérifier que le mot abcc est accepté par l’automate
(a, Z0, Z0a)
1) (a, a, aa) •Il est nécessaire d’atteindre un état
q0 final
(c, b, )
n=0
q2
(c, b, ) (, Z0, )
(c, a, )
m=0
Leila Ben Ayed Théorie des Langages et Compilation 168
Exercices
Exercice
1) Construire un automate fini qui accepte {anb2nck/ k >0} avec le critère pile vide
n=0
Leila Ben Ayed Théorie des Langages et Compilation 170
Exercices
Exercice 12 :
Construire un automate à pile qui accepte les mots palindrômes sur le vocabulaire
{a,b,c} avec le critère pile vide
Z0 Ruban infini
Tête de lecture/écriture
q Unité de contrôle
d : Q x X Q x X x {1, 0, -}
Dans un état qi, lisant un symbole sj, la machine va dans l’état qij, remplace le
symbole lu par sij et effectue un déplacement dij. Les instructions pour une
machine de Turing sont représentées par des quintuples: (qi, sj, qij, sij, dij)
sj sij, dij
qi qj
– Cette machine permet d’effacer la bande contenant une suite de ‘a’ et les
remplacer par des ‘#’
q1 Etat Courant
(q1, a) = (q2, b, 1)
q1
a b, 1 q2
………. b b b b c a ………...
Configuration i+1
q2 Etat Courant
Leila Ben Ayed Théorie des Langages et Compilation 178
VI.2. Fonctionnement d’une machine de
Turing
q1 Etat Courant
(q1, a) = (q2, b, 0)
q1
a b, 0 q2
………. b b b b c a ………...
Configuration i+1
q2 Etat Courant
Leila Ben Ayed Théorie des Langages et Compilation 179
VI.2. Fonctionnement d’une machine de
Turing
Si la machine s’arrête dans un
Un mot accepté état final et le mot est
entièrement lu
a a, 1
q1
, - q2
q1
Configuration 2 finale a b a
Pas de transition possible
Arrêt + rejet du mot aba
q1
Leila Ben Ayed Théorie des Langages et Compilation 182
VI.2. Fonctionnement d’une machine de
Turing
a a, 1
Acceptation q1
, - q2
q1
Configuration 4 finale a a a
Arrêt + acceptation du mot aaa
q1
Leila Ben Ayed Théorie des Langages et Compilation 183
VI.2. Fonctionnement d’une machine de
Turing
Boucle infinie
Configuration 1 a b a
b b, 0
a a, 1 q1
q1
, - q2
Configuration 2 a b a
b b, 0 q1
a a, 1
Configuration 3 a b a
q1
, - q2
q1
Leila Ben Ayed Théorie des Langages et Compilation 184
VI.2. Fonctionnement d’une machine de
Turing
Configuration 1 a b a
Boucle infinie
q1
b b, 0 a b a
Configuration 2
a a, 1
, - q1
q1 q2 a b a
Configuration 3
q1
Configuration 4 a b a
et ca reboucle q1
A cause de la boucle infinie, l’état final n’est jamais atteint, la
machine ne s’arrête jamais et le mot en entrée n’est pas accepté
Leila Ben Ayed Théorie des Langages et Compilation 185
Succession de Configurations
1 2
………. # x a y b # # ………... ………. # x a y b # # ………...
q2 q0
3 4
………. # x x y b # # ………... ………. # x x y b # # ………...
q1 q1
x, x, d a, x, d y, y, d
q 2 Ben Ayed
Leila q0 q1 Théorie des Langages
q1et Compilation ….. 186
Succession de Configurations
1 2
………. # x a y b # # ………... ………. # x a y b # # ………...
q2 q0
3 4
………. # x x y b # # ………... ………. # x x y b # # ………...
q1 q1
q2 xayb |-- x q0 ayb |-- xx q1 yb |-- xxy q1 b
Leila Ben Ayed Théorie des Langages et Compilation 187
Succession de Configurations
q2 xayb |-- x q0 ayb |-- xx q1 yb |-- xxy q1 b
*
Peut etre noté comme suit: q2 xayb |-- xxy q1 b
Configuration initiale : q0 w
Mot en entrée
w
# a a b b # #
q0
Leila Ben Ayed Théorie des Langages et Compilation 188
Succession de Configurations
Pour une machine de Turing M
Un calcul particulier est effectué par la liste d’instructions, l’état initial q0, le
contenu du ruban au départ et la position initiale de la tête de lecture/écriture
sur le ruban.
qF
(q0, 1, q1, 1, 1) (q0, 1, q1, 1, 1)
(q1, 0, q1, 0, 1) (q1, 0, q1, 0, 1)
(q1, 1, q0, 1, 1) (q1, , qF, 1 , -)
Leila Ben Ayed Théorie des Langages et Compilation 192
Exemple de compteur de parité
Illustration d’un calcul:
(q0, 0, q0, 0, 1) (q1, #, qF, 1, -)
(q0, 1, q1, 1, 1) (q1, 0, q1, 0, 1)
(q0,
(q0, #,
, qF,
qF, 0,
0, -)
-) (q1, 1,
(q1, 1, q0,
q0, 1,
1, 1)
1) 0 0, 1
(1,1,
1 1, 1)1 (0,0,
0 0, 1)1
q0
q0 q1
q1
1 0 1 Le nombre de 1 est
pair
(1,1,
1 1, 1)1
0, - 1, -
1 0 1 0#
q2
qF
qF
(q0, 1, q1, 0, 1) (q0, 1, q1, 0, 1)
(q1, 0, q1, 0, 1) (q1, 0, q1, 0, 1)
(q1, 1, q0, 0, 1) (q1, , qF, 1, -)
Leila Ben Ayed Théorie des Langages et Compilation 194
Exercice
Corrigé:
On démarre sur la première parenthèse. Le calcul consiste à aller chercher vers la
droite la première parenthèse fermante, l’effacer et revenir vers la gauche pour
chercher la première parenthèse ouvrante à partir de là, l’effacer puis recommencer la
recherche (fermante, ouvrante).
Nous avons besoin donc de deux états: un qui sert à se déplacer à droite (q0) pour
chercher une fermante et un qui sert à se déplacer à gauche (q1) pour chercher une
ouvrante.
Enfin, il se peut que l’on ne rencontre plus de parenthèses fermantes, auquel cas il
faut revenir au point de départ de la chaine en vérifiant qu’il n’ y a plus d’ouvrante non
plus. Un état q2 effectue cette vérification en reculant.
Nous utilisons le symbole x pour remplacer les parenthèses rencontrées pour ne pas
les reprendre une deuxième fois.
(1, -
q2 # 0, - qF
x x, 0
# #, -
qv q2 x x, 0
##, 1
xx, 1
Leila Ben Ayed Théorie des Langages et Compilation 198
Exercice
Le mot aba n’est pas accepté
# a a b b # x x x b
x x, 1
a x, 1
q0 q1 a a, 1
q0 q1
# #, -
# x a b b # x x x b b x, 0
qF
q0 b 1, - a x, 1
q1 q1 b 1, -
# #, -
# x a b b # x x x x qv q2 x x, 0
##, 1
q1 q2
xx, 1
# x a x b # x x x x
q2 q2
qv
qv
......... .........
Point de référence
Machine de Turing à bande semi-infinie
Fonction T- calculable
Une fonction f(x) est dite Turing calculable (T-calculable) si ses valeurs peuvent
être calculées par une machine de turing dont le ruban contient une
représentation standard de l’argument x. Quand la machine (le calculateur)
s’arrête, la valeur de f(x) apparaît dans une représentation sur le ruban. Une
représentation standard possible est une représentation en Base 1 (symbole
utilisé est 1).
m n
B 1 1 B
m+n
Machine de Turing :
(1, 1, 0)
(B, B, -)
B 1 1 B
1
n
Leila Ben Ayed Théorie des Langages et Compilation 212
VI.5. Relation avec les calculateurs
Nous utilisons P1, P2 et P3 pour désigner les têtes de L/E respectivement sur
les rubans 1, 2 et 3.
Thèse de Church
Si il existe un algorithme qui calcule f(x)
Alors il existe une machine de Turing qui
exécute l’algorithme qui calcule f(x)
M1 M2 M3 ?
Machines de Turing : dénombrable
R # R #
R#
L # L #
L#
Leila Ben Ayed Théorie des Langages et Compilation 222
Exemple
Une machine qui scanne la bande jusqu’à ce qu’elle trouve un
non blanc. Elle revient a gauche et copie le symbole qu’elle
trouve dans la case juste avant. La
X={a,b,c,#}
a Lb
# L b
R
R c Lc
#
L : action reculer suivie de #
remplacer symbole courant par représente a,b ou c
Leila Ben Ayed Théorie des Langages et Compilation 223
Exemple: Copie d’un mot
#w# résultat #w#w#
Un algorithme possible:
Chercher le premier blanc a gauche
T: avancer à droite d’une case
Si la case contient # alors
ecrire #
chercher le deuxieme # à D de la Tête
ecrire
chercher le deuxieme # à G de la tête
ecrire (le remettre)
aller à T
Sinon
avancer à droite jusqu’au premier #
L# #
R #R2# L2#
#
C
R#
Leila Ben Ayed Théorie des Langages et Compilation 225
Exemple : Copie d’un mot
#w# résultat #w#w#
Exemple d’exécution :
#abc# > #abc > #abc > ##bc > ##bc## >
##bc#a > ##bc#a > #abc#a >#a#c#a >
#a#c#a# > #a#c#ab….
#ab##ab …>
#abc#abc …>
#abc#abc#
Exemple d’exécution :
#abc# > #abc > #abc > ##bc > ##bc## >
##bc#a > ##bc#a > #abc#a >#a#c#a >
#a#c#a# > #a#c#ab….
#ab##ab …>
#abc#abc …>
#abc#abc#
SL
L# #
R L R
L#
Application : F(w)=ww la machine est CSL(copie suivi de Shift Left)
Leila Ben Ayed Théorie des Langages et Compilation 228
Exemple : Décalage à droite (Shift Right) - SR
#w# q0 résultat w# h
SR
L# #
R L R
L#
Application : F(w)=ww la machine est CSL(copie suivi de Shift Left)
Leila Ben Ayed Théorie des Langages et Compilation 229
Exercice
L = {w Xo : |w|a = |w|b = |w|c}
X={a,b,c,#}
Décidabilité
Intuitivement, P est décidable s’il existe un algorithme qui
pour chaque x répond par “OUI” ou par “NON” à la
question :
PROBLÈMES DE DÉCISION
Définition : c’est un problème pour lequel il existe, en un temps fini, deux
réponses possibles oui ou non
I.1. Compilateurs
I.2. Les Grammaires non contextuelles
I.3. Phases de Compilation
I.4. Qualité d’un Compilateur
I.5. Outils pour la construction de Compilateurs
Messages
d’erreur
R = { Expb Expr
Expb non(Expb) G = (V, T, Expb, R)
Expb Expb et Expb V = {Expb, Expr, Expa}
Expb Expb ou Expb T = {id, nb, oprel, oparith, non, et, ou, (, )}
Expr Expa oprel Expa où oprel {<, >, <=, >=, <>, =}
Expr (Expr)oparith {+, *, /, -}
Expa Expa oparith Expa
Expa (Expa)
Expa id
Expa nb
}
Program test
Var a, b : entier;
Début
a:= 10;
Si a>= 10 alors a:= 20; Fin Si
Fin
Program id
Var id, id : entier;
Début
id:= nb;
Si id oprel nb alors id:= nb; Fin Si
Fin
Analyse lexicale
PCible
Leila Ben Ayed Théorie des Langages et Compilation 255
I.3. Phases de compilation
Psource Analyse
Les compilateurs
comportent ces deux
parties.
Génération de
Partie frontale code
Si on change de intermédiaire
machine, on peut ne
modifier que la partie
terminale
PLI
Partie terminale Générateur de code
machine
PASS
id := Exp ;
Exp + Exp
id Exp * Exp
id nb
Leila Ben Ayed Théorie des Langages et Compilation 274
I.3. Phases de compilation
• Analyse sémantique
Comme vitesse est un réel, un compilateur peut convertir le nombre
entier nb en réel pour pouvoir utiliser l’opérateur de multiplication
Var position, Initiale,
P : réel;
Vitesse
Analyseur
id := Exp
Sémantique
Passer unité
lexicale et ses
attributs
Lire caractère
Programme Analyseur Analyseur
Source
lexical Obtenir syntaxique
Rendre prochaine
caractère unité lexicale
Table des
symboles
Leila Ben Ayed Théorie des Langages et Compilation 280
II.1. Présentation générale
• Rq. L’AL est un sous programme de l’AS. A la réception de
« prochaine unité », l’AL lit les caractères d’entrée jusqu’à ce qu’il puisse identifier la
prochaine unité lexicale.
Unité lexicale : produite la même pour un ensemble de chaines de caractères
Modèle d’une unité lexicale : règle qui décrit une unité lexicale (Expression régulière)
Lexème : une suite de caractères du PS qui concorde avec le modèle d’une unité lexicale.
Unité Lexicale Lexèmes Description formelle des
modèles
const const const
if if If
oprel < <= = <> > >= (<+<=+=+<>+>+>=)
id Pi compte D2 lettre(lettre+chiffre)*
nb 3 6.780 6.0 Chiffre+ + chiffre+.chiffre+
Début > =
0 1 2 return(oprel, PGE)
autre
3 *
return(oprel, PGQ)
autre
3 *
return(oprel, PGQ)
Ce diagramme fonctionne comme suit:
Son état de départ est l’état 0. Dans l’état 0, on lit le prochain caractère de l’entrée. On suit l’arc
> depuis l’état 0 vers l’état 1 si le caractère d’entrée est >. Sinon, on n’a réussi à reconnaître ni >
ni >=. En atteignant l’état 1, on lit le prochain caractère d’entrée. L’arc étiqueté = entre l’état 1
et l’état 2 doit être suivi si le caractère d’entrée est = et le diagramme reconnaît >= (PGE).
Autrement, l’arc étiqueté autre conduit à l’état 3. Le diagramme reconnaît ainsi > (PGQ) et
recule d’un caractère dans l’entrée. On utilise une * pour signaler les états dans lesquels ce
recul dans l’entrée doit être fait.
Leila Ben Ayed Théorie des Langages et Compilation 283
II.2. Automates finis et expressions
régulières
Un diagramme de transition pour la reconnaissance
des opérateurs de relation
Début < = return(oprel, PPE)
0 1 2
>
= *
4 return(oprel, PPQ)
5 return(oprel, EGA)
>
return(oprel, PGE)
= 7
6
autre *
Leila Ben Ayed Théorie des Langages et Compilation 8 return(oprel, PGQ)
284
II.2. Automates finis et expressions
régulières
Un diagramme de transition pour la reconnaissance des
identificateurs et des mots clés
lettre, chiffre
*
Début lettre autre
0 1 2
return(UnilexId(), RangerId())
L’action spécifiée par le symbole * permet de reculer d’une position sur le fichier
source après la consommation d’un symbole autre qu’une lettre ou un chiffre.
NB.
1) Le diagramme de transition ne change pas si on doit reconnaître de nouveaux mots clés; on
initiale simplement la table des symboles avec les nouvelles chaines et les nouvelles unités
lexicales.
2) En pratique, la table des symboles peut être répartie sur deux tables: table des mots clés et
table des identificateurs de variables.
d1 r1
d2 r2
…
d n rn
Où chaque di est un nom distinct et chaque ri est une expression régulière sur les
symboles de {d1, d2, …, di-1}
Exemples:
Lettre A|B|…|Z|a|b|…|z
chiffre 0|1|…|9
id Lettre(Lettre + Chiffre)*
autre *
bl, tab, \n 1 2
l return(UnilexId(), RangerId())
c
Début
c autre 4 *
0 3 return(nb, val)
6
< return(oprel, PPE)
=
Echec()
5 > 7
return(oprel, DIF)
= autre
autre EOF *return(oprel, PPQ)
8
9
> return(oprel, EGA)
return(oprel, PGE)
14 = 11
13
10
return(EOF, 0) autre *
12 return(oprel, PGQ)
Leila Ben Ayed Théorie des Langages et Compilation 292
II.4. Reconnaissance des unités lexicales
Système de transition associé à un analyseur lexical
l, c
Init(Val)
autre *
bl, tab, \n 1 2
l return(UnilexId(), RangerId())
cAdd(Val, c)
Début Add(Val, c)
c autre 4 *
0 3 return(nb, conv(val))
6
< return(oprel, PPE)
=
Erreur()
5 > 7
return(oprel, DIF)
= autre
autre EOF *return(oprel, PPQ)
8
9
> return(oprel, EGA)
return(oprel, PGE)
14 = 11
13
10
return(EOF, 0) autre *
12 return(oprel, PGQ)
Leila Ben Ayed Théorie des Langages et Compilation 293
II.4. Reconnaissance des unités lexicales
Code C d’un analyseur lexical
Unilex AnalLex() /* Unilex est une chaine si Alalex retourne uniquement l’unité lexicale*/
{ /* Unilex est un entier si Analex retourne l’unité lexicale et chaque unité est définie comme une
constante*/ case 1: car = carsuiv();
While(1) if(isletter(car) || isdigit(car))
/* Unilex est un enregistrement si Analex ajouter(car, chaine);;
else etat = 2;
retourne l’unité lexicale et un attribut*/
break;
{ case 2: Reculer(1); RangerId(); return(UniLexId()); /*
Switch(etat) cas où l’analyseur lexical retourne uniquement
{ */l’unité lexicale sinon, il faut utiliser un
case 0: Init(Chaine); car = carsuivant(); enregistrement (symbole)*/
if(car == ‘ ‘ || car == ‘\t’ || car = ‘\n’) ………….
{ etat = 0; debutlex ++; }
else if( car == ‘<‘) etat = 5; case 3: car = carsuiv();
else if (car == ‘=‘) etat = 9; if(isdigit(car)) ajouter(car, chaine);
else if (car == ‘>’) etat = 10;
else if (isletter(car)) Ajouter(car, chaine); else etat = 4;
etat = 1; break;
case 4 : Reculer(1); Return(NB); case 6: Return(Oprel);
else if(isdigit(car)) Ajouter(car, chaine);
……………
etat = 3; case 13: Return(EOF);
Leila Ben Ayed
else if(car == EOF) etat = 13;Théorie des Langages }et Compilation 294
else Erreur();
II.4. Reconnaissance des unités lexicales
Code C d’un analyseur lexical (cas du retour d’un enregistrement dans une
variable globale symbole à deux champs (UL, Att))
Unilex AnalLex() /* Unilex est une chaine si Alalex retourne uniquement l’unité lexicale*/
{ /* Unilex est un entier si Analex retourne l’unité lexicale et chaque unité est définie comme une
constante*/ case 1: car = carsuiv();
While(1) if(isletter(car) || isdigit(car))
/* Unilex est un enregistrement si Analex ajouter(car, chaine);;
retourne l’unité lexicale et un attribut*/ else etat = 2;
{ break;
case 2: Reculer(1); symbole.att = RangerId();
Switch(etat)
symbole.UL = UniLexId(); Return(Symbole);
{ ………….
case 0: Init(Chaine)car = carsuivant();
if(car == ‘ ‘ || car == ‘\t’ || car = ‘\n’) case 3: car = carsuiv();
{ etat = 0; debutlex ++; } if(isdigit(car)) ajouter(car, chaine);
else if( car == ‘<‘) etat = 5;
else etat = 4;
else if (car == ‘=‘) etat = 9;
break;
else if (car == ‘>’) etat = 10; case 4 : Reculer(1); symbole.UL=NB; symbole.Att =
else if (isletter(car)) etat = 1; toupper(chaine)); Return(symbole);
else if(isdigit(car)) etat = 3; case 6: symbole.UL = Oprel; symbole.att = PPE;
else if(car == EOF) etat = 13; Return(symbole); ……………
else Erreur(); case 13: symbole.UL = EOF; symbole.att = 0;
Return(symbole);}
Leila Ben Ayed Théorie des Langages On
et Compilation
peut retourner des numériques. 295
II.4. Reconnaissance des unités lexicales
Code C d’un analyseur lexical qui élimine les espaces et collecte les nombres
#include <stdio.h>
#include <ctype.h>
Int NumLigne = 1;
Int Vallex = RIEN;
INST est l’axiome de la grammaire. Un mot est généré par la grammaire si en partant
de l’axiome (le symbole de départ) et en appliquant successivement des règles de
production, nous obtenons le mot (formé par une séquence de terminaux)
Parce que on a:
INST id := EXP;
id := EXP + EXP ;
id := id + EXP ;
id := id + (EXP) ;
id := id + (EXP * EXP) ;
id := id + (id * EXP) ;
id := id + (id * nb) ;
Parce que on a:
LISTE_INST INST LISTE_INST
id := EXP; LISTE_INST
id := EXP + EXP ; LISTE_INST
id := id + EXP ; LISTE_INST
id := id + (EXP) ; LISTE_INST
id := id + (EXP * EXP) ; LISTE_INST
id := id + (id * EXP) ; LISTE_INST
id := id + (id * nb) ; LISTE_INST
id := id + (id * nb) ; INST
id := id + (id * nb) ; id := EXP;
id := id + (id * nb) ; id := nb;
UL Traducteur Programme
Programme Analyseur dirigé par la
source lexical syntaxe
en LI
Données
Producteur Consommateur
• L’analyseur lexical (AL) joue le rôle de producteur et le traducteur dirigé par la syntaxe (TDS) joue le rôle de
consommateur
• L’AL produit une unité lexicale avec ses attributs et le TDS consomme cette unité et demande l’unité suivante (fait appel à
symbole_suivant())
( Exp ) 2
Lorsque la règle de
production Exp 5
Exp + Exp est appliquée,
l’attribut t est calculé
par l’application de
la règle sémantique
et Exp.t prend la
5 9 valeur 5
Leila Ben Ayed Théorie des Langages et Compilation 310
II.4. Un traducteur pour les expressions
(5+9)*2
Exp.t:=59+2*
Est traduite par
5 9 + 2 * Exp.t:= 59+ * Exp.t:=2
( Exp.t:=5 9 + ) 2
Lorsque la règle de
production Exp 5
Exp.t := 5 + Exp.t :=9 est appliquée,
l’attribut t est calculé
par l’application de
la règle sémantique
et Exp.t prend la
5 9 valeur 5
Leila Ben Ayed Théorie des Langages et Compilation 311
II.4. Un traducteur pour les expressions
II.4.3. Schéma de traduction des expression
Exp Exp1 + Exp2{Imprimer(+)}
Exp (Exp1)
Exp 0 {Imprimer(0)}
Exp 1 {Imprimer(1)}
Exp 2 {Imprimer(2)}
Exp 3 {Imprimer(3)}
Exp 4 {Imprimer(4)}
Exp 5 {Imprimer(5)}
Exp 6 {Imprimer(6)}
Exp 7 {Imprimer(7)}
Leila Ben Ayed Exp 8 Théorie
{Imprimer(8)}
des Langages et Compilation 312
II.4. Un traducteur pour les expressions
(5+9)*2
Exp
Est traduite par
5 Exp
9 + 2 ** Exp I(*)
( Exp ) 2 I(2)
En exécutant les
Exp + Exp I(+) Instructions
d’impression de
gauche à droite :
I(5)I(9)I(+)I(2)I(*)
5 Nous obtenons
I(5) 9 I(9) La forme post fixée :
59+2*
Leila Ben Ayed Théorie des Langages et Compilation 313
II.5. Analyse lexicale
• L’analyse lexicale consiste en la conversion du flot de caractères d’entrée en un flot
d’unités lexicales qui devient l’entrée pour les phases suivantes d’analyse (syntaxique,
sémantique et traduction en code intermédiaire) ou bien pour le traducteur dirigé par
la syntaxe dans le cas d’un compilateur en une seule passe. Un analyseur lexical est
basé sur les systèmes de transition (ou bien les automates finis)
Début > =
0 1 2 return(oprel, PGE)
autre
3 *
return(oprel, PGQ)
Nous distinguons:
(b) Type
(c) Type
nb 2points nb
(d) Type
nb 2points nb Type_simple
(e) Type
nb 2points nb Type_simple
integer
Exemple
• La grammaire suivante est récursive à gauche
Exp Exp op Exp | (Exp) | id | nb
Elle est transformée en une grammaire non
récursive à gauche avec les règles suivantes:
Exp (Exp) E’ | id E’ | nb E’
E’ op Exp E’ |
L_I I | I L_I
I id := Exp;
Exp id |nb| (Exp) | Exp op Exp
1) En éliminant la récursivité à gauche, on obtient:
L_I I | I L_I
I id := Exp;
Exp id E’|nb E’| (Exp) E’
E’ op Exp E’ |
2) En éliminant l’ambiguité, on obtient :
L_I I S
S | L_I
I id := Exp;
Exp id E’|nb E’| (Exp) E’
E’ op Exp E’ |