Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Définition :
PDA
a a
X Z
A A
Contrôle Contrôle
.
Z0 Z0
(s, a, X) = (q, X)
(s, a, X) = (q, ε)
Théorème
a, X/Z
s q
(s, ε, X) = (q, X)
Exemple :
S→ab /asb
Cette grammaire reconnait le langage L = {a nbn, n≥1}. Ce langage n’est pas régulier et ne
peut pas être reconnu par un automate d’état fini. Mais ce langage est reconnu par le langage a
pile suivant :
∑ = {a, b}
Γ = {a, b, $} Z0 = $
q0 qF
q1
Pour se convaincre que cet automate reconnait bien le langage {a nbn / n≥1} on peut montrer
que : [q0, an, $] * [q0, ε, an$]
Exercice
ii. L2 = {ꞷ ⸦ ῶ / ꞷ ϵ {a,b}*}
iii. L3 = {ꞷ / ꞷ=ῶ ϵ {a,b}*}
Algorithme de décision :
état : = initial ;
pile[0] : = $
sommet : =0
C : = car-suivant ;
Fin
Exemple :
état : =q0
pile [0] : = $
Tq c ≠ $ et ⅂erreur faire
Début
b : erreur :=vrai
sommet : = sommet +1 }
a :
Fin
ANALYSE SYNTAXIQUE
Etant donné une grammaire algébrique G = (V N, VT, ⅋, S), construire un analyseur
syntaxique de G revient à construire un PDA qui accepte (par pile vide) le langage généré par
G. On ajoute des actions aux transitions de cet automate qui permettent de construire une
dérivation gauche d’un mot accepté.
a,$/a$ b, a/ε
a,$ / a$ b, a/ ε $,$/ $
0 1 $
a,a /aa
Cet automate reconnait juste un mot sans construire un arbre de dérivation du mot reconnu.
On peut remarquer qu’étant donné un PDA, on peut construire un PDA qui reconnait le même
langage mais dont les états indiquent le symbole qui se trouve au sommet de la pile.
a,a/aa
a, $ / a$ b, a$ / $ $, $$
$1 a $2 qF
b, aa/a
L’écriture de l’analyseur devient plus simple :
Tq C ≠ $ et ⅂erreur faire
Début
Début
sommet ← sommet + 1}
$ :
Fin
C : =car-suivant
Fin
Exemple :
S → aA/ bB
B→cbbAb / bBb
Remarque
L’analyseur qui ne lit qu’un seul car à la fois doit décider à l’aide de ce caractère, de la
dérivation à faire. On peut simuler une dérivation à l’aide d’une pile.
S→aA→abBa
$S abaacaaba$ S→aA
$A baacaaba$ A→bBa
$aba aba$ ….
$ab ba$ ….
$a a$ …
$ $ accepté
A→aAa
a,A/Aa a, aa/a
c, A / a
S→aA A
a
a, S /A a, a$ / $
b, A / Ba a,ab / b b/ ba /a
b→aAb $
S A→bBa
A
a,B/Ab
b, S / B b, b / $
S→bB
B b
c, B / b
b,B/Bb b, bb/b
Entrée
a b c $
Sommet S S→aA S→bB X X
Début
Selon le cas de pile[sommet] faire
Sinon
A : …....
Pile[sommet+1] ←B
Sommet : = sommet + 1 }
Sinon dsfefedf
b :
$ :
Remarques :
Nous avons dit que les grammaires non contextuelles (algébrique) sont gérées avec des
automates a pile. Dans le cas de notre étude de l’analyse syntaxique, nous effectuons une
analyse descendante (c’est-à-dire l’axiome vers les feuilles). Nous construisons des analyseurs
descendants, sans rebroussement (récursivité à gauche), appelé analyseur prédictifs.
L’exemple précèdent est un prototype de grammaire algébrique sans ambiguïté et sans
récursivité, qui nous a amené à écrire un analyseur descendant à partir de la table d’analyse.
Toute fois une table d’analyse descendante peut avoir des conflits, dans ce cas la
grammaire n’est pas LL(1) (est donc ambiguë). Une grammaire est dite LL(k) s’il faut un
maximum de k caractères à partir du symbole courant pour résoudre tous les conflits
d’analyse.
Exemple : une table d’analyse qui a des entrées multiples. Considérons la grammaire
S→abS / aSb
La table est
a b $
S→ab X X
S
S→aSb X X
Cette grammaire n’est pas LL(1) mais est LL(2), car qui suffit de consulter le caractère qui
suit ‘a’ pour résoudre le conflit. Cette grammaire est donc ambiguë.
Exemple 1 :
S→aA
A→bS/ Sb
S→aAbB / bB S→aAbB / bB
B→b B’ B→b B’
B’→b / ε B’→bB’ / ε
Pour analyser une grammaire récursive à gauche avec la méthode descendante, il faut d’abord
transformer la grammaire.
T→T*F | F E’→*TE’ | ε
F→(E) | a T→FT’
T’→*FT’ | ε
F→(E) | a
Ensemble premier:
On calcule les ensembles premiers et suivant sur les non terminaux de G (bien que l’on
puisse aussi le faire sur des terminaux inutile)
Ensemble suivant :
1- Mettre $ dans suivant (S), S l’axiome de la grammaire. $ le marqueur de fin du texte à
analyser.
2- Si X→αYβ alors premier(β) –{ε} ⸦ suivant(Y)
3- Si X→αY et si β *ε alors suivant (X) ⸦ suivant (Y)
A→a (A / ε)
B→ b (B / ε)
S→aAbB / bB
A→aA’
A’→aA’ / ε
B→bB’
B’→bB’ / ε
$S aabb$ S→aAbB
$BbA’ bb$ A’ →ε
$B b$ B→b B’
$B’ $ B’→ε
$ $ accepté
Remarque:
Premier(A) = à l’ensemble de tous les terminaux qui peuvent être produits par A
Suivant(A) = ensemble de tous les terminaux qui peuvent suivrent un mot généré par A
Exemple3 :
Exemple: A→aBDc
D→bD / ε
Exemple 4:
+ * ( ) a $
E E→TE’ E→TE’
T T→FT’ T→FT’
F F→(E) F→a
La grammaire est LL(1)
Begin
c := car-suivant ;
tq c ≠ $ et ⅂erreur faire
Début
Début
Ecrire(E→TE’)
Pile[sommet] = E’
Pile[sommet+1] : = T
Sommet : = sommet +1
Fin
Sommet : = sommet + 1
Si c=’+’ alors
Début
Ecrire(E’→TE’)
Pile[sommet] : = E’
Pile[sommet+1] : = T
Sommet : = sommet +1
c :=car-suivant
Fin
Début
Ecrire(F→a) ;
Sommet : = sommet-1
c : =car-suivant
Fin
Sinon
Si c= ‘ (‘ alors
Début
écrire (F→(E))
Fin
+ :
* :
( :
) :
Fin
Fincas
Exercice
1- S→Ad / BF 2- S→AS / AB
F→f F / ε A→aA / ε
A→aA / ε B→bB / b
B’→bB
B→bB / ε
D→ aD /b
G→gGK
< I >::= < A > / if < I > then < I > else < I >
Vérifier si ces grammaires sont LL(1). Auquel cas écrire les analyseurs.
S→AB/A
A→Da / eD
B→b / bB
D→ε / dB
Exercice2 :
Quel est le langage généré par chacune des grammaires suivantes. Justifiez
a- S→0S1 / 01
b- S→ +SS / -SS /a
c- S→S(S)S / ε
d- S→ aSbS / bSaS / ε
e- S→ a/S + S/SS/ S * / (S)
Exercice 4 : Montrer que toute chaine binaire généré par la grammaire a une valeur divisible
par 3.