Vous êtes sur la page 1sur 34

Chapitre N°02 : L'analyse syntaxique

Programme Analyse Entités Analyse


Source Lexicale lexicales syntaxique

L'analyse lexicale a pour but , à partir du programme source, suite de caractères, de former
des entités lexicales. L'analyse syntaxique a pour rôle la vérification de la forme ou encore de
l'écriture de la suite des entités lexicales, on parlera alors de la syntaxe du langage .
La vérification est faite à l'aide de la grammaire spécifique au langage appelée grammaire
syntaxique .

I. Définitions :

Définition d'une grammaire syntaxique :


C'est une grammaire formée de règles de production permettant d'engendrer tous les
programmes écrits dans un langage donné .

Exemple : Soit la grammaire des expériences arithmétiques :


<Prg>  <Exp> #
<Exp>  <Term> / <Exp>+<Term>
<Term>  <Fact> / <Term>+ <Fact>
<Fact>  i / (<Exp>)

Remarques :
• L'entité entre < > est appelée NON TERMINAL.
• Chacune des règles de type .

Notion de dérivation :
Les opérations consistent à remplacer au fur et à mesure en partant de l'axiome des
non-terminaux par leurs MDP sont appelées Dérivations .

Exemple : Soit la chaine : i + i * i #

<Prg>

<Exp> #

<Exp> + <Term>

<Term> <Term> * <Fact>

<Fact> <Fact> i

i i

-1- OpenMindStudents.org 2009


Notion de réduction :
C'est l'inverse de la dérivation , elle consiste à remplacer , une fois que l'on reconnaît un
MDP par la partie gauche (MGP), ainsi jusqu'à arriver à l'axiome .

Notion d'arbre syntaxique :


C'est un arbre dont la racine est l'axiome de la grammaire syntaxique, les nœuds
représentent les MDP et les feuilles terminales, la chaine à analyser syntaxiquement
Deux méthodes sont utilisées pour la construction d'un arbre syntaxique :
1. À partir de l'axiome, on effectue une série de dérivations jusqu'à atteindre la chaine à
analyser, c'est le cas descendant .
2. À partir de la chaine à analyser, on effectue des réductions jusqu'à arriver à l'axiome,
c'est le cas ascendant .

Remarque : Un arbre qui a deux fis est dit binaire .

Notion d'ambiguïté :
On dit qu'une grammaire est ambiguë s'il existe deux arbres syntaxiques correspondant à
une même chaine à analyser .

Exemple : Soit : E  E+E / E*E / i et i*i+i la chaine à analyser .

E E

E + E E * E

E * E i i E + E

i i i i

Remarque :
Dans notre cas , nous nous intéressons qu'aux grammaire non ambiguë .

Récursivité gauche directe ou indirecte :

• Une grammaire est dite récursive à gauche, de façon directe, si elle s'écrit de la manière
suivante :

A  A /  Avec : A  N et  ,  (T N)*

• Et elle est récursive gauche indirectement si elle s'écrit comme suit :

A B 1 /  1
B  A 2 /  2 Avec : A  N et  1 , 1,  2,  2  (T N)*

Remarque :
Si la grammaire de la forme A A , on parlera de la récursivité droite .

-2- OpenMindStudents.org 2009


Transformation d'une grammaire récursive en une grammaire non récursive :
Une analyse descendante ne peut pas se refaire sur une grammaire récursive gauche
(directe ou indirecte) . Si dans la grammaire , il existe une production de type A  A  .
L'identification de la chaine à analyser avec un des MDP sera bloquée (boucle infinie).
Pour cela une transformation de la grammaire est nécessaire .

• Cas de récursivité gauche directe :


Après
A  A 1 / A 2 /... / A n /1 /.../ m
Transformation
{ A 1 /... /m /1 A' /... /m A'
A'  1 /.../ n / 1 A' /.../n A'


Avec : i et  j ∈T ∪ N 

Exemple :

{
S aS /b/ Ac
{S  aS /b / Ac
A Aa/c
≡ A c /c A'
A'  a/aA'

• Cas de récursivité gauche indirecte :


Pour la transformation d'une grammaire récursive gauche indirecte , on utilise
«la substitution» :

On a : {
A B 1 /1
B  A 2 /2
On substitue B dans A , ce qui donne : A  A 2 1 /1
On substitue A dans B , on aura : B  B 1 2 /1
Et on aura, une grammaire récursive gauche directe, après transformation (vu juste
avant) , on obtient :

{
'
A  1 / 1 A
' '
A   2 1 /  2  1 A
'
B 2 / 2 B
' '
B 1  2 /1 1 B

Factorisation d'une grammaire :


Une des conditions permettant de faire une analyse syntaxique descendante déterministe
est la factorisation .
Une grammaire G= <T, N,S,P> n'est pas factorisée s'il existe dans P une production de la
forme :
 ∗
A   x / y / z / /  avec : , x , y , z ∈T ∪N  et  , ∈T ∪N 

devient :

{AB xB/ //


y/ z

-3- OpenMindStudents.org 2009


Exemple :

{
G : S aS / bA
A aA/ab /c
G n' est pas factorisée.

{
S  aS / bA
'
G : A  aB / c
B  A/ b

Grammaire − libre :
Une grammaire est  − libre Ssi :
Il n'existe pas dans P des productions de la forme : A  ou bien : S   (axiome)
et il n'existe pas de MDP de la forme  S  et il n'existe pas une règle de la forme
A  pour A≠S .

Une grammaire peut être transformée en une grammaire équivalente

Transformation d'une grammaire en une grammaire − libre :


1. Pour chaque règle de la forme A  avec A≠S
Faire
Pour chaque règle de la forme B  A 
Faire
Ajouter la production B  
Fait
Éliminer la règle A 
Fait

2. Si S   et ∃ MDP de la forme  S 
'
Alors Introduire un non-terminal S' ; nouvel axiome de la grammaire S  S /
Refaire l'étape 1 avec S  

Exemple :
1)

{ {
S a / A S  a/ A/ 
G: A  AB/  ≡ G' : A AB / B Cette grammaire est −libre
B aAbB/ b B aAbB / abB/b

2)

{
S ' /S

{ {
S  c/aSb / AB S  c/ aSb/ab / A/ B/
' '' S  c /aSb/ab /B / A
G : A a/ ≡ G : A a ≡ G :
A a
B b/ B b
B b

-4- OpenMindStudents.org 2009


II. Les méthodes d'analyse syntaxique descendante non déterministe :

A) Analyse descendante parallèle :


C'est une analyse descendante dans laquelle il y a construction d'un ensemble d'arbre de
dérivation en même temps. Les arbres qui ne peuvent pas correspondre à la chaine d'entrée
sont abandonnés .A chaque dérivation d'un non-terminal en même temps pas tous ses MDP .

{
< Bloc début < LD; < LI  fin
Exemple : Soit G : < LD d /d ; < LD
< LI i/i ; < LI 
Chaine : début d ; d ; i ; i fin#

Pas Cible Chaine Action


1 <Bloc> Début d;d;i;i fin# Remplacer <Bloc> par ses MDP
2 Début <LD>;<LI> fin Début d;d;i;i fin# Égalité : avancer .
3 <LD>;<LI> fin d;d;i;i fin# Remplacer <LD> par ses MDP
4 d;<LI> fin d;d;i;i fin# Égalité : avancer
d;<LD> ; <LI> fin d;d;i;i fin# Égalité : avancer
5 ;<LI> fin ;d;i;i fin# Égalité : avancer
;<LD> ; <LI> fin ;d;i;i fin# Égalité : avancer
6 <LI> fin d;i;i fin# Remplacer <LI> par ses MDP
<LD> ; <LI> fin d;i;i fin# Remplacer <LD> par ses MDP
7 i fin d;i;i fin# Blocage
i ; <LI> fin d;i;i fin# Blocage
d;<LI> fin d;i;i fin# Égalité : avancer
d;<LD> ; <LI> fin d;i;i fin# Égalité : avancer
8 ;<LI> fin ;i;i fin# Égalité : avancer
;<LD> ; <LI> fin ;i;i fin# Égalité : avancer
9 <LI> fin i;i fin# Remplacer <LI> par ses MDP
<LD> ; <LI> fin i;i fin# Remplacer <LD> par ses MDP
10 i fin i;i fin# Égalité : avancer
i ; <LI> fin i;i fin# Égalité : avancer
d;<LI> fin i;i fin# Blocage
d;<LD> ; <LI> fin i;i fin# Blocage
11 Fin ;i fin# Blocage
; <LI> fin ;i fin# égalité : avancer
12 <LI> fin i fin # Remplacer <LI>par ses MDP
13 i fin i fin # Égalité : avancer
i ; <LI> fin i fin # Égalité : avancer
14 fin Fin # Égalité : avancer
; <LI> fin fin # Blocage
15 Vide # Chaine ∈ langage

-5- OpenMindStudents.org 2009


Alogorithme :
Début
Tant que Cible ≠vide
Faire
Si tête.cible = non-terminal
Alors Remplacer non-terminal par ses MDP
Sinon Si tête.cible =TC
Alors Avancer dans la chaine et la cible
Sinon Blocage
Fsi;
Fsi;
Fait;
Si (cible = vide) et (TC = #)
Alors chaine ∈ langage
Sinon chaine ∉ langage
Fsi;
Fin.

Remarque :
1. Cette technique n'est pas efficace car elle nécessite l'examen de plusieurs arbres en
parallèle, ce qui est couteux en temps et en espace mémoire.
2. Pour appliquer cette méthode, il faut que la grammaire soit non récursive gauche.

B) Analyse prédictive avec retour arrière :


L'analyseur cherche partant de l'axiome à atteindre la chaine en effectuant une série de
dérivation. Si l'analyseur parvient à construire une tel arbre, on conclut que la chaine
appartient au langage , sinon l'analyseur effectue des retours arrières pour essayer une autre
possibilité de dérivation.

Exemple : G : {
S  ca/b /cSA
Ac /b
et la chaine à analyser est ccab

S S S S

c a b c S A c S A

∥ ∤ ∤ ∥ ∥
c c c c c a c c c a b
∥ ∥ ∤ ∥ ∥ ∥
c a b c a b

ECHEC: ECHEC : ECHEC :


Effectuer un retour arrière retour arrière
retour arrière

⇒ La chaine ccab appartient au langage .

-6- OpenMindStudents.org 2009


Algorithme :
Début
Pour un non-terminal donné: essayer les alternatives dans l'ordre
Si TC = terminal du MDP
Alors Avancer
Sinon Pour le même terminal : passer à l'alternative suivante
Si aucune alternative ne marche
Alors Revenir au sous arbre précédent
Fsi;
Fsi;
Si aucune alternative ne marche et le non-terminal de retour est l'axiome
Alors chaine n'appartient pas au langage
Fsi;
Fin.

Remarque :
1. Les dérivations se font de gauche à droite et de haut en bas, les retours arrières se font
dans le sens inverse.
2. Il faut que la grammaire soit non récursive gauche.

III.Les méthodes d'analyse déterministe :


Contrairement aux méthodes précédentes, ces méthodes sont déterministes i.e : sans
retour arrière , seule l'alternative susceptible de correspondre est choisie .

• Grammaire LL(1) :
Définition: Une grammaire est LL(1) Ssi pour chaque couple de productions

A  / avec :  , ∈T ∪N  et A∈ N , on a :
∗ ∗
1. Si  ⇒ a 1 alors ¬⇒ a 2
TC = a : S S
∗ ∗
w 1 A1 w 1 A 1
 ou bien : 
 
∗ ∗
TC: a 1 TC : a 2
∗ ∗
2. Si  ⇒  alors ¬⇒ 
∗ ∗ ∗
3. Si  ⇒ et  ⇒ a  alors ¬∃ S  wAa 1

Terminologie :

Si  ⇒ a 1 alors a est un symbole directeur de alpha.

Ensemble Début :
∗ ∗
Deb ={ a∈T / ⇒ a  , ∈T ∪N  } ∪ {t∈∪T / ⇒ t }
∈ T ∪N  ∗

-7- OpenMindStudents.org 2009


Étape de construction de l'ensemble début :

1. Si A  1 /2 /..../n Alors Deb A=deb 1 ∪deb 2 ....∪ Debn 
2. Deb a={a }
3. Deb a ={a }
4. Deb ={ }
5. Deb  Bx 1 ... x n  ⊃Deb B−{ }

x1 ∈T ∪ N 
Si ∈Deb B alors Deb Bx 1 ... x n ⊃Deb x 1−{ }
Si ∈Deb x1  alors Deb Bx 1 ... x n ⊃Deb x 2−{ }

Si ∈Deb x n−1  alors Deb Bx 1 ... x n ⊃Deb x n−{ }
Si∈ Deb x n  alors ∈ Deb Bx 1 ... x n 
Fsi ;
Fsi ;
Fsi ;

{
S  ABc /aSc
A / aAB
Exemple : G:
B bC /
C  Bc /aC /

Début Suivant
S a b c # c
A  a b c
B b  c b
C a b c  c b

Deb S =Deb  ABc∪Deb aSc={ a , b , c }∪{ a }


Deb A= Deb∪Deb aAB={}∪{ a }
Deb B= DebbC ∪Deb ={b }∪{ }
DebC =Deb  Bc∪Deb aC ∪Deb={ b , c }∪{ a }∪{ }

Ensemble suivant :

Suiv A={ a∈T ∪{ # }/ Z ⇒ wA avec a∈ Deb # et w , ∈T ∪ N  ∗ }
A∈ N

Étapes de construction :
1. Si ∃ MDP  Aa  avec  , ∈T ∪N  ∗ a∈T et A∈N alors a∈Suiv  A
2. Si ∃ MDP  A B  avec  , ∈T ∪N  ∗ et A , B∈ N Alors Deb  B −{ }⊂suiv  A
3. Si ∃ une production A x 1 ... x n B avec : x i ∈T ∪N  alors Suiv  A⊂Suiv  B
Si ∈ Deb B alors Suiv  A⊂Suiv x n

Si ∈ Deb x 2  alors Suiv  A⊂Suiv  x 1 
Fsi
Fsi
Fsi

-8- OpenMindStudents.org 2009


Suite exemple :

1.  A a  2.  A B  3. A x 1 x 2 B
S c  A Bc A a A B
ABc a A B B b C
Bc CaC
aSc

• Analyse par les procédures récursives (descente récursive) :


Elle consiste à associer à chaque non-terminal une procédure qui traite tous les
MDP du non-terminal .

Soit A  x 1 ... x n avec x i ∈T ∪N 


Si x i ∈T alors Si x i≠Tc Alors Erreur
SinonTc  Tc1
Passer au traitement de x i 1
FSi
Sinon − Appel de la procédure associée à x i
−Passer au traitement de x i1
FSi

Exemple :

{
ZS#
S  aB/ Aa
G:
A BA/ b
B c

Procédure Z( )
Début
Tc := 1er terme de la chaine ;
Erreur := Faux ;
Si Tc∈Deb S  Alors S ( ) ;
Si Tc≠# Alors Erreur := Vrai ; Fsi ;
Sinon Erreur := Faux ;
Fsi;
Si ¬ Erreur Alors '' Chaine correcte ''
Sinon ''Chaine incorrecte ''
Fsi;

-9- OpenMindStudents.org 2009


Procédure S ( )
Début
Si Tc∈Deb aBalors Tc  Tc1
SiTc ∈Deb B alors B  ;
Sinon Erreur :=vrai ;
Fsi;
Sinon A ( ) ;
Si Tc≠a alors Erreur :=vrai
Sinon Si ¬ Erreur alors Tc Tc1
Fsi;
Fsi;
Fsi;
Fin

Procedure A ( )
Début
Si Tc ∈ Deb BA alors B  ;
Si Tc ∈ Deb Aet ¬ Erreur Alors A ;
Sinon Erreur :=Vrai ;
Fsi;
Fsi;
Fin.

Procédure B ( )
Début
Tc Tc1
Fin.

Tc Chaine Action
Z c cba# Appel S
ZS c cba# Appel A
ZSA c cba# Appel B
ZSAB c cba# Fin de B
ZSA b ba# Appel A
ZSAA b ba# Fin A et Tc := Tc+1
ZSA a a# Fin A et Tc := Tc+1
ZS a a# Fin S et Tc:=Tc+1
Z # # Chaine correcte

Remarques :
1. Si la grammaire est récursive gauche , il y a nécessité de la transformer .
2. Si on veut faire une analyse déterministe, il faut factoriser la grammaire.
3. Pour faire une analyse par la descente récursive, il faut que la grammaire soit
LL(1).
4. La méthode présente un inconvénient, car elle est liée à la grammaire.
5. Méthode simple à implémenter et efficace.

-10- OpenMindStudents.org 2009


• L'analyseur LL(1) :
Il est possible de construire un analyseur non récursif en utilisant une pile de
façon explicite. Le problème est en ayant une grammaire et une chaine d'entrée, de
déterminer les productions à appliquer,en partant de l'axiome afin d'arriver à la
chaine. L'analyseur fait la recherche dans la table, appelée Table d'analyse LL(1).
La table d'analyse LL(1) est à deux dimensions, les lignes contiennent les non-
terminaux et les colonnes, les terminaux .
 T [ 1..∣N∣ , 1..∣T ∪{ # }∣] 
T[A, a] :donne le N° de la règle, si elle existe à utiliser pour dériver A afin
d'atteindre a.

• Algorithme de construction d'une table d'analyse LL(1) :


Début
Pour chaque non-terminal A de N
Faire
Pour chaque a∈Deb −{  }
Faire
T [ A , a]:=N ° A
Fait;
Si ∈Deb alors Pour chaque a∈ Suiv A
Faire
T [ A , a] :=N ° A
Fait;
Fsi;
Fait;
Fin.

Remarque :
1. Chaque entrée de la table d'analyse LL(1) correspond à une erreur .
2. Une table d'analyse doit être monodéfinie (au plus une règle par entrée).

Définition N°02 :
Une condition nécessaire et suffisante pour qu'une grammaire soit LL(1) et
qu'elle soit :
• Non récursive gauche.
• Factorisée.
• Table d'analyse LL(1) monodéfinie.
Définition N°03 :
Une grammaire est LL(1) si :
• Non récursive gauche.
• Factorisée.
• Pour chaque production A 1 /2 /..../n
➢ Debi ∩Deb  j =∅ ∀ i , j i≠ j
* *
➢ Sii ⇒  alors  j ¬⇒  ∀ j j≠i
*
➢ Sii ⇒  alors Deb j ∩Suiv A=∅

-11- OpenMindStudents.org 2009


Fonctionnement de l'analyseur :
Nous disposons de la chaine d'entrée d'une table d'analyse LL(1), la chaine
d'entrée comporte une marque de fin (#).La pile à un instant donné contient des
symboles de la grammaire avec #, aussi comme marque de fond. Initialement la pile
contient l'axiome de la grammaire au dessus de '' # ''.

Algorithme :
Début
Tc := 1er terme de la chaine ;
Empiler (#S) ;
Fin Analyse := Faux;
Tant que non fin analyse
Faire
Si sommetpile ∈ T
Alors Si Tc = sommetpile
Alors Tc := Tc+1 ;
Dépiler ;
Sinon 'Chaine incorrecte'
Fin Analyse := vrai ;
Fsi;
Sinon Si sommetpile ∈ N
Alors Si T[sommetpile,Tc] = ∅
Alors 'chaine incorrecte' ;
Finanalyse := Vrai ;
Sinon A:= Sommetpile ;
Dépiler ;
Empiler l'image miroir de la
règle T[A, Tc] ;
Fsi;
Sinon Si Tc = #
Alors 'Chaine correcte' ;
Finanalyse = vrai ;
Sinon 'Chaine incorrecte'
Finanalyse = vrai;
Fsi;
Fsi;
Fsi;
Fait;
Fin.

-12- OpenMindStudents.org 2009


Exemple :

{
ZE#
E T E '
E ' TE ' /
G:
T  FT '
T ' * FT ' /
F i/ E

1. G est elle LL(1) ?


2. Analyser la chaine i + i # .

Solution :
1. G est elle LL(1) ?

• Non récursive gauche .


• Factorisée.

Début Suivant
E i ( # )
E' +  # )
T i ( + # )
T' *  + # )
F i ( * + )

• Table d'analyse :

+ * i ( ) #
E 1 1
E' 2 3 3
T 4 4
T' 6 5 6 6
F 7 8

La table d'analyse LL(1) est monodéfinie ⇒ G est LL(1).

-13- OpenMindStudents.org 2009


• Analyse de la chaine i + i # :

Pile Chaine Action


#E i+i# Dépiler Empiler Miroir de T TE '
#E' T i+i# Depiler, Empiler T  FT '
#E'T'F i+i# Dépiler , avancer
#E' T' +i# Dépiler, empiler T ' 
# E' +i# Dépiler, empiler E ' TE '
#E' T+ +i# égalité, dépiler, avancer
#E' T i# dépiler, empiler T  FT '
# E' T' F i# dépiler, empiler F i
#E' T' i i# égalité, dépiler, avancer
#E' T' # dépiler, empiler F  E
#E' # dépiler, empiler T ' 
# # chaine correcte.

• Grammaires LL(k) :
Une grammaire est LL(k) si k caractères du début de la chaine à analyser
suffisent pour faire une analyse déterministe.
De façon formelle si on a une règle : A  / , il faut que :
Deb k . SUiv k  A ∩ Debk . Suiv k  A=∅

Ensemble Début k :
∗ ∗
Deb k  ={ w∈T k / ⇒ w  , ∈T ∪N  ∗ }∪{ w∈T l , lk / ⇒ w }

 ∈T ∪ N 

Étapes de construction de l'ensemble Début k :


1. Si A 1 /2 /.../n Alors Debk  A=Debk 1∪...∪Debk n 
2. Deb k ={}

3. Deb k w =
w ∈T
{
{ w } Si w∈T l et l≤k
{ w ' } Si w=w' w ' ' ∈T l et lk et w' ∈T k
+

4. Deb k  =Debk  Deb k   . Deb k 

Ensemble Suivant k :

Suiv k  A={ w /Z ⇒  A  # k , w ∈ Deb # k  et ∣w∣=k }
A∈ N

Étapes de construction :

1. Si B  A  Alors Deb k bêta.Suiv k  B⊂Suiv k  A Avec : , ∈T ∪ N 
2. Si A x 1 ... x n B Alors Idem L L 1

Exemple :

{
ZS #
G : S  aAaa/bAba
A bA/

-14- OpenMindStudents.org 2009


Deb1 Suiv1 Deb2 Suiv2 Deb3 Suiv3
S a b # aa ab bb ## aaa bba aba bbb abb ###
A b  a b  bb b aa ba  0b bbb bb aa# ba#

Algorithme de construction de la table d'analyse LL(k) :


Début
Pour chaque non-terminal A de N
Faire
Pour chaque règle A 
Faire
Pour chaque w ∈Deb k  . Suiv k  A
Faire
T [ A , w]:=N ° A
Fait;
Fait;
Fait;
Fin.

Remarques:
• Si une grammaire G est LL(k) alors G est LL(k+1).
• Si la table d'analyse LL(k) est monodéfinie alors la grammaire est LL(k) .

aa ab bb ba
S 1 1 2
A 4 3 3 4

Table multi-définie , donc la grammaire n'est pas LL(2) .

Diagramme de transition pour analyseur déterministe :


Comme nous avons vu l'utilisation d'un diagramme de transition lors de l'analyse
lexicale, nous allons montrer que l'on peut créer un diagramme de transition pour
garder l'analyseur syntaxique déterministe.

Remarque :
Avant de construire le diagramme de transition d'un analyseur déterministe, il faut
vérifier les propriétés LL(1) .

Algorithme de construction :
• Pour chaque non-terminal A , créer un état initial et un état final (Pour le retour).
• Pour chaque production de tye A  x 1 x 2 ... x n : créer un chemin de l'état initial
à l'état final, dont les arcs sont étiquetés par x 1 , x 2 ,... , x n. .

-15- OpenMindStudents.org 2009


Fonctionnement :
• Démarrer par l'axiome.
• Si le passage de l'état i à l'état j se fait à l'aide d'un terminal, égal au terminal
courant de la chaine
Alors Avancer dans la chaine
Passer à l'état j
Sinon Si le passage se fait par un non-terminal A
Alors L'analyseur syntaxique se positionne dans l'état de départ
du diagramme associé à A
Si l'état final de A est atteint
Alors passage à l'état j
Fsi;
Sinon Si la passage se fait à l'aide de 
Alors Aller à l'état j
Fsi;
Fsi;
Fsi;

Remarque:
Pour simuler le fonctionnement du diagramme de transition, on utilisera une pile.
On empilera l'état i à chaque fois qu'un appel à un non-terminal est fait, on dépilera
lorsque l'état final est atteint.

Exemple:

{
E T E '
E ' TE ' /
G : T  FT '
T ' * FT ' /
F id /  E 

T E'
E: 0 1 2

+ T E'
E': 3 4 5 6

T: 7 8 9
F T'

-16- OpenMindStudents.org 2009


* F T'
T': 10 11 12 13


Id
F: 14 17

( 16
15 )
F

Pile Chaine Action


# (E,0) i+i# Appel de T
# (E,0) (T,7) i+i# Appel de F
# (E,0) (T,7) (F,14) i+i# Tc := Tc+1 , Aller à 7
# (E,0) (T,7) (F,17) +i# Fin de F , Aller à 8
# (E,0) (T,8) +i# Appel T'
# (E,0) (T,8) (T',10) +i# Aller à 13
# (E,0) (T,8) (T',13) +i# Fin de T', Aller à 9
# (E,0) (T,9) +i# Fin de T, aller à 1
# (E,1) +i# Appel E'
# (E,1) (E',3) i# Tc := Tc+1 , Aller à 4
# (E,1) (E',4) i# Appel de T
# (E,1) (E',4) (T,7) i# Appel de F
# (E,1) (E',4) (T,7) (F,14) i# Tc := Tc+1 , Aller à 17
# (E,1) (E',4) (T,7) (F,17) # Fin de F, Aller à 8
# (E,1) (E',4) (T,8) # Appel de T'
# (E,1) (E',4) (T,8) (T',10) # Aller à 13
# (E,1) (E',4) (T,8) (T',13) # Fin de T', Aller à 9
# (E,1) (E',4) (T,9) # Fin de T, aller à 5
# (E,1) (E',5) # Appel de E'
# (E,1) (E',5) (E',3) # Aller à 6
# (E,1) (E',5) (E',6) # Fin de E', aller à 6
# (E,1) (E',6) # Fin de E , aller à 2
# (E,2) # Fin de E
# # Chaine correcte

-17- OpenMindStudents.org 2009


Remarque:
Les méthodes d'analyse descendante sont simples à implémenter et efficaces mais en
réalité, il existe un ensemble minimal de grammaire LL(k) avec k≥1 .

IV. Analyse ascendante:


Dans l'analyse ascendante, contrairement à la descendante, à partir de la chaine
d'entrée , par une série de réduction, on atteint l'axiome de la grammaire.
Dans l'algorithme d'analyse ascendante sont souvent plus compliqués que ceux de
l'analyse descendante. Ils s'appliquent toutes fois à un nombre plus grand de
grammaire. C'est pour cette raison qu'ils sont très souvent utilisés, le problème de
l'analyse ascendante est de reconnaître une entité dans la partie droite pour réduire
par la partie gauche.

Définition N°01 :
Soit une grammaire G =<T,N,S,P> , une chaine x est une forme sentencielle. Si

x peut être obtenue par dérivation à partir de l'axiome. S ⇒ x x∈T ∪N 

Définition N°02 :
Soit une grammaire G =<T,N,S,P> et w= x  y une forme sentencielle,
 est une phrase simple de la forme sentencielle w, relativement au non -terminal

U , si : S ⇒ x U y  x  y  MDP de U :U 

Définition N°03:
Une réduction consiste à remplacer une phrase simple  dans une forme
sentencielle w= x  y par U pour avoir x U y  MDP de U  .

Remarques :
1. La forme sentencielle initiale est la chaine d'entrée.
2. Les réductions sont de gauche à droite, ce sont les phrases les plus à gauche qui
sont réduites avant les autres.
3. À la réduction de  par U, x ne doit pas contenir de phrase simple.

Le problème de l'analyse ascendante est de délimiter ou de déterminer le phrase


simple la plus à gauche dans la chaine à analyser, afin de faire une réduction.

Exemple:

{
< Prog  débutLD;LI  fin .
< LDLD ; d /d
< LI  LI ; i/ i
• Analyser la chaine : début d ; d ; i ; i fin.

-18- OpenMindStudents.org 2009


Solution :

Pile Chaine Action


# début d ; d ; i ; i fin.# Décaler
# début . d ; d ; i ; i fin.# Décaler
# début d ; d ; i ; i fin.# Réduire d par <LD>
# début <LD> ; d ; i ; i fin.# Décaler
# début <LD> ; d ; i ; i fin.# Décaler
# début <LD> ;d ; i ; i fin.# Réduire <LD>; d par <LD>
# début <LD> ; i ; i fin.# Décaler
# début <LD> ; i ; i fin.# Décaler
# début <LD> ; i ; i fin.# Réduire i par <LI>
# début <LD> ; <LI> ; i fin.# Décaler
# début <LD> ; <LI> ; i fin.# Décaler
# début <LD> ; <LI> ; i Fin .# Réduire <LI>; i par <LI>
# début <LD> ; <LI> Fin .# Décaler
# début <LD> ; <LI> fin .# Décaler
# début <LD> ; <LI> fin. # Réduire par <Prog>
# <Prog> # Chaine correcte

Priorité des opérations associatives :


On considère la grammaire : E  EE / E∗E /i/ E  .
À la chaine i+i*i, il y correspond deux arbres syntaxiques, c'est donc une grammaire
ambiguë. Si on adoptes les conventions suivantes :

• '' * '' plus prioritaire que '' + '' , on obtient la grammaire suivante :

{
E  E T / T
T T ∗F / F
F  i / E 
• Soit U une expression i+i+i , on remarque que c'est le même opérateur, il faut
donc préciser si l'on effectue d'abord le premier '' + '' ou le second : Associativité
de gauche à droite ou associativité de droite à gauche.

{ {
E  E T /T E T E /T
T T ∗F / F T  F∗T / F
F i / E  F i / E 

Associativité Associativité
de gauche à droite. de droite à gauche.

-19- OpenMindStudents.org 2009


A) Méthode d'analyse LR :
L'analyse LR est une méthode d'analyse efficace déterministe. C'est une
méthode d'analyse ascendante de gauche à droite. Elle utilise une pile et une
table d'analyse LR. Pour construire une table d'analyse LR , on dispose de deux
méthodes :
➢ Méthodes des contextes.
➢ Méthodes des items.
● Méthode des contextes :
Définition des contextes gauches et contextes droits:
 , w respectivement contexte gauche et contexte droit de la règle A  :

{

S ⇒  
Si et avec  ne peut être réduit avant.

⇒ w
Avec : ∈T ∪N  ∗ et w∈T ∗
 :contenu de la pile à la réduction de  en A
w : Reste de la chaine à la réduction de  en A

 A 

 w

Exemple :

{
Z#S#
S  ABc
Aa
B b

Règle Contexte gauche Contexte droit


S  ABc #ABc #
A a #a bc#
B b #Ab c#

Remarque :
#ab n'est pas un contexte gauche de la règle B b .

-20- OpenMindStudents.org 2009


Exemple:

{
S  Ab/ Bc
A As/
B  bB /
Z S

Règles CG CD
S  Ab #Ab #
S  Bc #Bc #
A  Aa #Aa a*b#
A  # a*b#
B  bB #b* b B c#
B  #b+ c#

Définition N°01 :
Une grammaire est dite LR(0), si le contexte gauche (contenu de ma pile)
suffit pour décider de l'action à exécuter.

Définition N°02:
Une grammaire est LR(k), si on regardant k caractères du contexte droit
(ce qui reste à analyser), on décide de l'action à exécuter.

Définition N°03:
Le contexte LR(k) de la règle A  est obtenue en concaténant le
contexte gauche et les k premiers du contexte droit de la règle A  .

Suite exemple :
Construction du contexte LR(1) :

S  Ab #Ab#
S  Bc #Bc#
A  Aa #Aaa , #Aab
A  #a , #b
B bB #b* bBc
B  #b* c
Z S #S#
Cette grammaire n'est pas LR(1) ⇒ Voir définition N°04 (à venir)
-Conséquence- : {
A ⇒ # b Avec # b≡ et c≡w d ' où : w≠
B ⇒ # bc

-21- OpenMindStudents.org 2009


Définition N°04:
Soit G =<T,N,S,P>, G est dite LR(k) Ssi :
Si ∈ contexte LR k  de A.
 w∈ contexte LR k  de B 
Alors w= , A=B , = Avec :  ,  , ∈T ∪N  ∗ et w∈T ∗

-Conséquence- : Si ∈ contexte LR k  de A.


et  w∈ contexte LR k  de B 
et  A≠B ou≠ou w≠
Alors G n'est pas LR(k).

Implémentation de la méthode des contextes:


• Construction des contextes gauches et droits, déduire si la grammaire est LR(k).
• Construire l'automate déterministe reconnaissant les contextes LR(k).
• Déduire la table LR(k), en appliquant ce qui suit:
w
(1) Si S i ⇒ S j ∈ F Avec : w∈ Deb k  ∗ , # k 
Alors T [ S i , w]=R N ° A 
/*Réduire en utilisant la règle A  associée au contexte
reconnu en Sj */
Fsi;
a w
(2) Si Si ⇒ Sl ⇒ S j∉ F
Alors T [ S i , aw]:=D , S l Avec : ∣aw∣=k
Fsi;
A ∈N
(3) Si Si ⇒ S j
Alors T [ S i , A]:=S j
Fsi;

Exemple :

{
ZS
S CbBA
G : A Aab/ab
BCB /
C b
Questions :
1. G est-elle LR(k) ?
2. Construire la table d'analyse LR(k).
3. Analyser la chaine bbbabab# .

-22- OpenMindStudents.org 2009


Solution :

Règles CG CD
Z S #S #
S  CbBA #CbBA #
A  Aab #CbBAab (ab)* #
A ab #CbBab (ab)* #
B CB #CbC*CB (ab)+ #
B  #CbC* (ab)+ #
Cb #b #CbC*b bb*(ab)+# b*(ab)+#

Cette grammaire n'est pas LR(0) .

{ {
S CbBA # CbBA
Voir : A Aab  ab
# CbBA 
 w

Avec : S≠ A et CbBA≠ Aab et w≠

Les contextes LR(1) :

Z S #S#
S  CbBA #CbBA#
A  Aab #CbBAaba# #CbBAab#
A  ab #CbBaba #CbBab#
B CB #CbC*CBa
B  #CbC*a
Cb #bb #CbC*bb #CbC*ba

G est LR(1), car en examinant les contextes LR(1), il n'existe pas de contexte
LR(1) sous mot initial d'un autre mot contexte LR(1).

-23- OpenMindStudents.org 2009


Construction de l'automate correspondant aux contextes LR(1):

#
1 R4
S

0 C
b
2
b B
3 A #
b 4
5 R1
12 a
13 a a
C
b R4
6
b, a 8 b
a
b C b
R4 7
a, #
10
B 9
a, # R2
11
a
R3
R4
Table d'analyse LR(1) :

a b # S A B C
0 D,12 1 2
1 Acc
2 D,3
3 R,5 D,13 4 10
4 D,8 5
5 D,6 R1
6 D,7
7 R,2 R,2
8 D,9
9 R,3 R,3
10 R,5 D,13 11 10
11 R,4
12 R,6
13 R,6 R,6

-24- OpenMindStudents.org 2009


Analyse de la chaine bbbabab# :

Pile Chaine Action


#0 bbbabab# D,12
#0 b 12 bbabab# R,6
#0C 2 bbabab# D,3
#0C2b 3 babab# D,13
# 0 C 2 b 3 b 13 abab# R,6
# 0 C 2 b 3 c 10 abab# R,5
# 0 C 2 b 3 c 10 B 11 abab# R,4
#0C2b3B4 abab# D,8
#0C2b3B4a8 bab# D,9
#0C2b3B4a8b9 ab# R,3
# 0 C 2 b 3 B 4A5 ab# D,6
# 0 C 2 b 3 B 4A5 a 6 b# D,7
# 0 C 2 b 3 B 4A5 a 6 b 7 # R,2
# 0 C 2 b 3 B 4A5 # R,1
#0S1 # Chaine acceptée

Remarque :
• Une grammaire récursive gauche directe en S n'est pas LR(0).
• Une grammaire est LR (k) alors elle est LR(k+1).
• Une grammaire est LR(k) Ssi la table d'analyse LR(k) est monodéfinie.

● Méthode des items :


Une méthode pratique d'analyse LR est la méthode des items. Un item est une
production de la grammaire, avec un point séparant une position de son MDP. La
partie à gauche du point représente le sous arbre de la grammaire ayant été déjà
réduit à un moment donné, au cours de l'analyse et la partie à droite représente ce qui
reste à analyser.

Définition N°01 :
Un item LR(k) est de la forme [ A .  , w ]
Avec :  :constitue ce qui a été déjà réduit.
Où : A∈ N ,  , ∈T ∪N  ∗ et w ∈ Debk T * . # k 
A   est une règle de la grammaire.
Pour la construction des ensembles des items d'une grammaire, nous avons besoin de
deux fonctions :
• La fermeture d'un ensemble d'items.
• La fonction GOTO.

-25- OpenMindStudents.org 2009


Fermeture d'un ensemble d'items LR(k) :

Fonction Fermeture (I)


Début
Répéter
Pour chaque item de la forme [ A . B  , w ] de l'ensemble des items I
Faire
Pour chaque règle B 
Faire
Pour chaque w ' ∈ Debk   w
Faire
Ajouter dans I, l'item [ B  .  , w ' ]
Fait;
Fait;
Fait;
Jusqu'à ce qu'il n'y ait plus d'items à rajouter dans I
Fermeture (I) := I ;
Fin.

Exemple:
G : S Sbc /a
Item LR(0):
I 0={[ Z . S ] }
I 0={[ Z . S ] ,[ S  . Sbc ] ,[ S  . a ] }

Item LR(1):
I 0={[ Z  . S , # ] }
I 0={[ Z . S , # ] , [ S . Sbc , # ] , [ S . a , # ] ,[ s . Sbc , b ] , [ S . a ,b ] }

Focntion GOTO:
GOTO (I,X)

I: ensemble d'item.
X: symbole de la grammaire, X ∈T ∪N 

Fonction Goto (I,X) :


Début
J:= ∅ ;
Pour chaque item de I de la forme [ A . X  , w ]
Faire
J := J ∪[ A  x.  , w ]
Fait;
Goto (I,X) := Fermeture (J) ;
Fin.

-26- OpenMindStudents.org 2009


Suite Exemple:

I 1=Goto I 0, S ={[ Z  S. , # ] , [ S  S.bc , # ] , [ S  S.bc , b ] }


I 2=Goto I 0, a={ [ S  a. , # ] ,[ S  a. , b ] }

Construction de l'ensemble canonique des items :

C: ensemble des états de l'automate.


Début
k
I 0={[ Z 0 . S , # ] }
C = {Fermeture de (I0)}
Répéter
Pour chaque ensemble d'items I de C
Faire
Pour chaque x ∈T ∪ N
Faire
J:= Goto(I,X);
Si j ≠∅ alors ajouter j dans C Fsi;
Fait;
Fait;
Jusqu'à ce qu'il n'y ait plus d'élément à ajouter dans C
Fin.

Implémentation de la méthode LR pour les items :

Construction de l'ensemble C
(1) Si I j=Goto  I i , A , A∈N alors T [ I i , A]=I j
(2) Si I j =Goto I i , a , a∈T
Alors Pour chaque item de Ii de la forme [ A . a  , w ]
Faire
Pour chaque aw ' ∈ Debk  a  w
Faire
T [ I i , aw ' ] :=DI j ; ∣aw '∣=k
Fait;
Fait;
Fsi;
(3) Si dans Ii, , on a un item de la forme [ A . , w ]
Alors T [ I i , w ]:=R N ° A 
Fsi;

Définition N°02 :
G est LR(k) ssi la table LR(k) déduite de l'ensemble canonique des items C est
monodéfinie.

-27- OpenMindStudents.org 2009


Exemple:
G : S  Sbc /a

Item LR(1):
I 0={[ Z . S , # ] , [ S . Sbc , # ] , [ S . a , # ] ,[ s . Sbc , b ] , [ S . a ,b ] }
I 1=Goto I 0, S ={ [ Z S. , # ] , [ S S.bc , # ] ,[ S  S.bc , b ] }
I 2=Goto I 0, a={ [ S  a. , # ] ,[ S  a. , b ] }
I 3=Goto I 1, b={[ S  Sb.c , # ] , [ S Sb.c , b ] }
I 4=Goto  I 3, c ={[ S Sbc. , # ] , [ S Sbc. , b ] }

a b c # S
I0 D,I2 I1
I1 D,I3 Acc
I2 R1 R2
I3 D,I4
I4 R1 R1

La table est mono-définie , donc la grammaire est LR(1).

Étude des multi-définitions dans LR(1) :

1er cas: Décalage/Réduction:


1. T [ I i , a ]:=D , I j ⇒ ∃ dans I i , un item de la forme [ B  . a  , t ] .
2. T [ I i , a ]:=R N ° A   ⇒ ∃ dans I i , un item de la forme [ A . , a ] .

2éme cas: Réduction/Réduction :


1. T [ I i , a ]:=R N ° B   ⇒ ∃ dans I i , un item de la forme [ B . , a] .
2. T [ I i , a ]:=R N ° A  ⇒ ∃ dans I i , un item de la forme [ A . , a] .

Remarque :
Le cas Décalage/décalage ne peut pas se présenter :
• T [ I i , a ]=D , I j
• t [ I i , a]=D , I l ⇒ I j= I l

Conclusion:
Les analyseurs LR sont construits pour reconnaître tous les langages de
programmation, ils sont très performants, mais leurs tables d'analyse contiennent des
milliers d'états, de ce fait elles sont couteuses à implémenter. Pour cela, on a pensé
aux SLR et LALR qui permettent d'optimiser les grammaires LR.

-28- OpenMindStudents.org 2009


Grammaires SLR:
Le problème majeur associé à l'analyse LR(k) est la taille de la table d'analyse.
Pour cela une méthode d'analyse plus simple, et dont la table est plus réduite a été
conçu, analyse SLR. Cependant peu de grammaires sont SLR.

Définition d'un contexte SLR(k) d'une règle :


Soit la règle A  et  est un contexte gauche de la règle A .  w tel
que w est élément de Suivk (A) est un contexte SLR(k) de la règle A  .

Définition d'une grammaire SLR(k) :


Une grammaire G est SLR(k) Ssi , il existe  contexte gauche SLR(k) d'une
règle A  et il existe  w contexte SLR(k) d'une règle B 
⇒ A=B , = et w=

Construction de la table SLR(k):


• Construction des contextes gauches et droits.
• Construction des contextes SLR(k).
• Vérifier si G est SLR(k).
• Construire l'automate déterministe des contextes SLR(k).
• Déduire la table d'analyse SLR(k), en appliquant ce qui suit :
A
(1) Si S i  S j Alors T [ S i , A]:=S j Avec A∈ N Fsi ; .
a ∗
Si S i  S l ⇒ S j ∉ F Avec :w ∈Deb k−1 T ∗ , # k  et a∈T
(2) .
Alors T [S i , aw ]:= D , S l avec ∣aw∣=k
w
, #k 

Si S i ⇒ S j ∈ F Avec w∈Deb k T
(3)
Alors T [S i , w ] := RN ° Sj

Exemple:

{
G : S  Sbc /a
Z S

CG CD Contexte SLR(1)
Z S #S # #S#
S  Sbc #Sbc (bc)* # #Sbc# #Sbcb
Sa #a (bc)* # #a# #ab

Remarque:
G est SLR(1) car en examinant les contextes SLR(1), il n'existe pas de contexte
SLR(1) sous mot initial d'un autre contexte SLR(1).

-29- OpenMindStudents.org 2009


Automate des contextes SLR(1):

# Acc

S 1

0 b c
2 #/b
3 R1
a

# /b R2

La table d'analyse SLR(1):

a b c # S
0 D,4 1
1 D,2 Acc
2 D,3
3 R1 R1
4 R2 R2

Construction de la table SLR(1) par la méthode des items LR(0):


• Construction de l'ensemble canonique C des items LR(0).
• Réduire la table d'analyse SLR(k) à partir de C en appliquant :
(1) SiGoto  I i , A=I j Avec A∈ N Alors T [ I i , A]:= I j
(2) Si I j=Goto  I i , a
Alors Pour chaque item de Ii de la forme [ A . a ] Avec  , ∈T ∪ N  ∗
Faire
Pour chaque aw∈ Deb k a . Suiv k  A
Faire
T [ S i , aw] :=D , I j
Fait;
Fait;
Fsi;
(3) Si ∃ dans I i , un item de la forme [ A .]
Alors Pour chaque w ∈Suiv k  A
Faire
T [ I i , w ]:=R N ° A 
Fait;
Fsi;

-30- OpenMindStudents.org 2009


Définition:
G est SLR(k) ssi la table SLR(k) déduit de l'ensemble canonique d'items C est
monodéfinie.

Remarques :
1. Si G est SLR(k) alors G est SLR(k+1).
2. Si G est SLR(k) ; la table SLR(k) et LR(k) sont équivalentes.

Exemple:

G: {S Z aSb/
S

Items LR(0):

I 0={[ Z . S ] ,[ S . aSb ] , [ S . ]}
I 1=Goto I 0, S ={ [ Z . S ] }
I 2=Goto I 0, a={ [ S  a.Sb ] ,[ S . aSb ] , [ S .] }
I 3=Goto I 2, S ={[ S aS.b ] }
I 2=Goto I 2, a
I 4=Goto  I 3, b={[ S aSb.]}

Table SLR(1):

a b # S
I0 D,I2 R2 R2 I1
I1 Acc
I2 D,I2 R2 R2 I3
I3 D,I4
I4 R1 R1

Table SLR(1) mono-définie ⇒ G est SLR k  ∀ k≥1 .

Grammaires LALR :

L'analyse SLR est une méthode optimale, facile à implémenter, mais cependant
peu de grammaires sont SLR.
C'est pour cela que la méthode LALR a été conçue, c'est une méthode intermédiaire
du point de vue puissance. Elle est souvent suffisante et produit des tables de même
importance que SLR.

-31- OpenMindStudents.org 2009


Méthode de construction des tables LALR:
1. Construire l'ensemble canonique d'items:
C = {I0, .....,In }, Item LR(k) pour la grammaire G.
2. Pour chaque cœur présent dans C, trouver tous les items ayant ce même cœur et
remplacer ces items par leur union.
3. Soit C'= {J0,J1, .....,Jn}la collection des ensembles LR(k) résultante ( m≤n ).
Pour chacun de ceux-ci, construire la table LALR(k).

Si ces conditions conduisent à un conflit, la grammaire est non LALR(k).

I i =Z . S , # I j =Z . S , #
S  . AB , a S . AB , d /a
A. a , # A. a , c /#
B. b , # B . b , b /#

Exemple:

{
ZS #
G= S  CC
C  cC /d
G est-elle LR(1) ??

Les items LR(1):


I 0 =[ Z . S , # ]
[S . CC , #]
[C . cC , c /d ]
[C . d , c /d ]

I 1=Goto I 0, S =[ Z S. , # ]


I 2=Goto I 0, C =[ S  C.C , # ]=[C . cC , #]=[C  . d , #]
I 3=Goto I 0, c=[C  c.C , c /d ]=[C . cC , c /d ]=[C . d , c / d ]
I 4=Goto  I 0, d =[C  d. , c/ d ]
I 5=Goto I 2, C =[S  CC., # ]
: I 6=Goto I 2, c =[C  c.C , #]=[C . cC , # ]=[C . d , # ]
I 7=Goto I 2, d =[C  d. , #]
I 3=Goto I 3, c
I 4=Goto  I 3 , d 
I 8=Goto I 3, C=[C  cC. , c /d ]
I 9=Goto I 6 , C =[C cC. , # ]
I 6=Goto I 6, c
I 7=Goto I 6, d 

C={ I 0, I 1, I 2, I 3, I 4, I 5, I 6, I 7, I 8, I 9 }

-32- OpenMindStudents.org 2009


Table LR(1) :

c d # S C
0 D,3 D,4 1 2
1 Acc
2 D,6 D,7 5
3 D,3 D,4 8
4 R3 R3
5 R1
6 D,6 D,7 9
7 R3
8 R2 R2
9 R2

Table monodéfinie ⇒ G est LR 1 ⇒ G est LRk  ∀ k ≥1

G est-elle LALR(1) ?

I 36=[C c.C , c/ d / #]=[C . cC , c /d /# ]=[C . d , c /d /#]


I 47=[C d. , c /d / #]
I 89=[C  cC. , c /d /# ]

C ' ={ I 0, I 1, I 2, I 36, I 47, I 89, I 5 }

Table LALR(1):

c d # S C
I0 D,3 D,4 1 2
I1 Acc
I2 D,6 D,7 5
I36 D,36 D,47 8,9
I47 R3 R3 R3
I5 R1
I89 R2 R2 R2

Table monodéfinie ⇒ G est LALR1 ⇒ G est LALR k  ∀ K ≥1

-33- OpenMindStudents.org 2009


Remarques :
• G est LALR (k) ⇒ G est LALR(k+1).
• G est SLR(k) ⇒ G est LR(k).
• Une grammaire ambiguë n'est pas LR(k) , SLR(k) et n'est pas LL(k),LALR (k)

Pour reconnaître les mots d'un tel langage, on a deux possibilités:


➢ Transformer la grammaire en une grammaire équivalente LL(1) ou LR(1).
➢ Construire la table d'analyse de la grammaire ambiguë et essayer d'éliminer les
multi-définitions en adoptant certaines conventions.

-34- OpenMindStudents.org 2009

Vous aimerez peut-être aussi