Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Définition : Une grammaire hors contexte (context free grammar, CFG) est un quadruplet
G = (T,NT, S, P) où :
– T est l’ensemble des symboles terminaux du langage. Les symboles terminaux correspondent aux
mots découvert par l’analyseur lexical « unité lexicale ».if ,else sont des terminaux.
– NT est l’ensemble des symboles non-terminaux du langage. Ces symboles n’apparaissent pas dans le
langage mais dans les règles de la grammaire définissant le langage, ils permettent d’exprimer la
structure des règles grammaticales.
– S ϵ NT est appelé l’élément de départ de G (ou axiome de G). Le langage que G décrit (noté L(G))
correspond `a l’ensemble des phrases qui peuvent être dérivées `a partir de S par les règles de la
grammaire.
– P est un ensemble de production (ou règles de réécriture) de la forme N α1 α2… αn avec
αi ϵ (T UNT)*. C’est à dire que chaque élément de P associe un non terminal à une suite de terminaux
et non terminaux. Le fait que les parties gauches des règles ne contiennent qu’un seul non terminal
donne la propriété ”hors contexte” `a la grammaire.
Exemple G = (T,NT, S, P) avec
VT = { il, elle, parle, est, devient, court, reste, sympa, vite }
VN ={ PHRASE, PRONOM, VERBE, COMPLEMENT, VERBETAT, VERBACTION }
S = PHRASE
P = { PHRASE PRONOM VERBE COMPLEMENT
PRONOM il / elle
VERBE VERBETAT / VERBACTION
VERBETAT est / devient/ reste
VERBACTION parle / court
COMPLEMENT sympa / vite }
Page
17
SAOUDI Lalia Analyse Syntaxique 2007/2008
Si une phrase d’un langage L(G) possède deux arbres de dérivations distincts,
alors cette phrase est ambiguë et la grammaire associée est elle-aussi ambiguë.
Exemple d’une grammaire ambiguë
La grammaire de l’expression suivantes est ambiguë ; il ya deux arbres syntaxiques
possibles pour x+x*x
E E+E / E*E /x
2. ANALYSE DESCENDANTE :
L’analyse descendante, dans laquelle on construit l’arbre en descendant de la racine vers
les feuilles. Cette analyse correspond à un parcours descendant gauche (parce qu’on lit de
gauche à droite). Il s’agit de deviner à chaque étape quelle est la règle qui sert à engendrer le
mot que l’on lit.
Les méthodes déterministes les plus efficaces connues à l’heure actuelle sont : l’analyse
prédictive et la descente récursive ; lorsque le langage d’implémentation dispose de la
Page
18
SAOUDI Lalia Analyse Syntaxique 2007/2008
récursivité, il est souhaitable d’utiliser la descente récursive dans le cas contraire, l’analyse
prédictive affirmera son existence.
2.1-Analyse prédictive :
Cette analyse utilise une table appelée table prédictive, les lignes de cette table sont
indicées par les symboles non terminaux du langage, par contre les colonnes sont indicées par
les symboles terminaux et le symbole #.
Les cases de la table contiennent éventuellement des règles de la grammaire, pour la
construction de cette table deux notions qui sont suivant et début sont nécessaires.
Intuitivement le DEBUT d’une chaine de symboles de la grammaire contient tous les
terminaux et éventuellement ϵ si la chaine est vide qui peuvent apparaitre en tête d’une
chaine de terminaux dérivée à partir de la chaine initiale.
Le SUIVANT d’un Non terminal est un ensemble comportant tous les terminaux ( #
l’indicateur de la fin de chaine inclus) qui peuvent suivre ce Non terminal dans toute chaine
de symboles .
2.1.1 Calcul de DEBUT(X)
Pour toute chaine composée de symboles terminaux et non_terminaux, on cherche PREMIER( α)
l’ensemble de tous les terminaux qui peuvent commencer une chaine qui se dérive de α .
1-si X est un terminal alors DEBUT(X)=X
2- DEBUT (X) = {a | X a} {FIRST(Yi) | X Y1,..Yk et Y1,..,Yi-1 * }
{ si X ou si X Y1,..Yk et FIRST(Yi) Yi
2.1.2 Calcul de SUIVANT(X)
Pour tout non_terminal A, on cherche SUIVANT(A), l’ensemble de tous les symboles terminaux a
qui peuvent apparaitre immédiatement à droite de A dans une dérivation
SUIVANT(X)= DEBUT () si Y X et /*
SUIVANT (Y) si Y X ou (Y X et DEBUT ())
{#} si X = S (l‘axiome).
Exemple : p={ SBa B cP / bP /P/ P dS }
S B P
Début c,b,a,d c,b,d, d
Suivant #, a a a
E TE’
Page
19
SAOUDI Lalia Analyse Syntaxique 2007/2008
E’ +TE’ |
T FT’
T’ *FT’ |
F (E) | Id
FIRST(E) = FIRST(T) = FIRST(F) = { (, Id}
FIRST(E') = {+,}
FIRST(T') = {*,}
FOLLOW(E) = FOLLOW(E') = { ), #}
FOLLOW(T) = FOLLOW(T') = {+,),#}
FOLLOW(F) = {+, *, ), #}
Le tableau obtenu est le suivant:
Id + * ( ) #
E E TE' E TE'
T T FT' T FT'
F F Id F (E)
Page
20
SAOUDI Lalia Analyse Syntaxique 2007/2008
Sinon
Si X =a alors
Enlever X de la pile
Avancer ps
sinon
ERREUR
finsi
finsi
finsi
jusqu’à ERREUR ou ACCEPTER
Page
21
SAOUDI Lalia Analyse Syntaxique 2007/2008
Si la table prédictive est multi définie c à d que si une case occupée par plus d’une règle on dit que la
grammaire n’est pas LL(1) Left-to-right scanning, Leftmost derivation, use 1 symbol lookahea
Définition : Une grammaire G est dite LL(1) si ses règles de production vérifient les conditions
suivantes :
3-si Aα et Aβ sont deux règles de G et si β*ϵ alors SUIVANT(A)∩ DEBUT(α) =Ø
Ces conditions entrainent l’unicité de l’existence d’une règle dans une case de la table prédictive.
Nous avons Premier (S)= {a } , Premier (A)= {c } , Suivant (S)= {# } , Suivant (A)= {b } , ce qui
donne la table d’analyse :
Page
22
SAOUDI Lalia Analyse Syntaxique 2007/2008
Il y a deux réductions pour la case M[A, c], donc ce n’est pas une grammaire LL(1) On ne peut pas
utiliser cette méthode d ‘analyse, pour pouvoir choisir entre la production A cd et la production
A c, il faut lire la lettre qui suit celle que l’on pointe (donc deux symboles de prévision sont
nécessaires).
Conditions nécessaires pour q’une Grammaire Soit LL(1) :
Théorème : Une grammaire ambiguë ou récursive à gauche ou non factorisée à gauche n‘est pas LL(1)
La récursivité à gauche
Une grammaire est récursive à gauche si elle contient un non terminal A tel qu’il existe une dérivation
A Aα où α est une chaine quelconque.
Elimination de la récursivité à gauche : On peut transformer mécaniquement des grammaires pour
enlever toute récursivité à gauche en autorisant les règles du type A .ϵ
----------
Lorsque la récursivité est indirecte, on déroule les règles jusqu’à ce que l’on rencontre une récursivité directe
et on utilise le même processus :
Exemple :
E TE’
Soit G la grammaire suivante : E’ +TE’ |
E- E+T / T T FT’
T T* F / F T’ *FT’ |
F( E) / id
F (E) | Id
Cette grammaire est récursive à gauche :
Factorisation :
Le bactrack arrive lorsque l’algorithme choisi une mauvaise règle à appliquer. Si l’algorithme
choisissait systématiquement la bonne règle, il n’y aurait jamais besoin de bactracker. C’est à dire que
lorsqu’on aura plusieurs productions pour le même non-terminal qui ont le même préfixe, on va
introduire un nouveau non-terminal pour tous les suffixes suivant ce préfixe, ce qui permettra de
choisir une et une seule règle lorsqu’on veut démarrer par ce préfixe. Par exemple, si on a les règles :
Page
23
SAOUDI Lalia Analyse Syntaxique 2007/2008
Conclusion
Si notre grammaire est LL( l) , l’analyse syntaxique peut se faire par l’analyse descendante vue
précédemment . Mais comment savoir que notre grammaire est LL(1) ?
Etant donnée une grammaire
1- la rendre non ambigüe.
Il n’y a pas de méthodes. Une grammaire ambigüe est une grammaire qui a été mal conçue.
2- éliminer la récursivité à gauche si nécessaire
3- la factoriser à gauche si nécessaire
4- construire la table d’analyse
Il ne reste plus qu’a espérer que ça soit LL(1), Sinon il faut concevoir une autre méthode pour
l’analyse syntaxique.
Exemple : grammaire des expressions arithmétiques avec les opérateurs + - / et *
E E+E / E – E / E *E / E/E / (E) / nb
Mais elle est ambiguë. Pour lever l’ambigüité, on considère les priorités classiques des opérateurs et
on obtient ma grammaire non ambigüe :
{E E + T / E – T / T T T * F / T / F / F F ( E ) / nb }
Après suppression de la récursivité à gauche, on obtient :
{E TE’
E’ +TE’ |-TE’ |
T FT’
T’ *FT’ |/ FT’ |
F (E) | nb
Elle est déjà factorisée.
Un analyseur par descente récursive est un type d'analyseur descendant dans lequel le programme de
l'analyseur est étroitement lié à la grammaire analysée. Voici les principes de l'écriture d'un tel
analyseur :
1. Chaque groupe de productions ayant le même membre gauche donne lieu à une procédure.
2. Lorsque plusieurs productions ont le même membre gauche, le corps de la procédure
correspondante est une conditionnelle (instruction if ) ou un aiguillage (instruction switch) qui, d'après
le symbole terminal pointé, sélectionne l'exécution des actions correspondant au membre droit de la
production pertinente.
3. Une séquence de symboles S1S2 : : : Sn dans le membre droit d'une production donne lieu, dans la
fonction correspondante, à une séquence d'instructions traduisant les actions reconnaissance de S1 ,
reconnaissance de S2 ,, . . ., reconnaissance de Sn.
4. Si S est un symbole non terminal, l'action « reconnaissance de S » se réduit à l'appel de procédure
S().
5. Si α est un symbole terminal, l'action « reconnaissance de α » consiste à considérer le symbole
terminal de lecture :
Page
24
SAOUDI Lalia Analyse Syntaxique 2007/2008
3. ANALYSE ASCENDANTE :
Principe: construire un arbre de dérivation du bas (les feuilles, les unités lexicales) vers le haut (la
racine l’axiome de départ)
Le modèle général utilisé est le modèle par décalages réductions
- décalage (shift) : décaler d’une lettre le pointeur sur le mot en entrée.
- réduction (reduce) : réduire une chaine par un non terminal en utilisant une des règles de
production.
Nous présentons quatre techniques pour construire la table d’analyse LR pour une grammaire.
Ces méthodes utilisent un programme identique appelé conducteur, cependant le contenu de la table
d’analyse est différent pour chacune des méthodes.
Le programme conducteur :
Programme
Chaine à analyser Table
Conducteur d’analyse
Page
25
SAOUDI Lalia Analyse Syntaxique 2007/2008
Arbre syntaxique
Il utilise une pile dont le contenu spécifie l’état de l’analyse et un vecteur contenant le reste de la
chaine à analyser. Au départ la configuration de l’analyse est la suivante :
S0 a1,a2 …….an #
Etat initial chaine à analyser
Au cours de l’analyse, la configuration varie et devient :
(S0 X1S1X2S2……….. X mSm ai,ai+1,…..an # ) où Sm est au sommet . Chaque Xi est un symbole
de la grammaire et chaque Si est un symbole appelé état , pour passer à la configuration suivante,
l’analyseur consulte la table d’analyse.
La table d’analyse contient deux parties, ACTION et GOTO.
Les types d’action que le simulateur peut rencontrer dans la table sont :
- Décaler ou empiler j ( noté dj )
- Réduire j ( noté rj)
- Accepter ( noté acc)
- Erreur : une erreur est indiquée par une case vide.
Les lignes de la table sont des états de l’automate
Les colonnes sont les symboles de la grammaire avec le #
La case ( sp , ai) indique l’action à entreprendre , si l’action est :
1- Dj : l’analyseur doit empiler l’élément ai ensuite j qui est le numéro de l’état suivant par la
transition j= goto ( sp , ai).
2- Rj : j indique un numéro de règle de la grammaire , à ce moment la partie droite de cette
production apparait au sommet de la pile, il faut substituer la partie droite , par la partie
gauche de la règle, à la suite de cette opération, l’analyseur empile le numéro de l’état de
transition trouvé dans la deuxième partie de la table c.à.d k= goto( spr , A) , où A est le non
terminal apparaissant au sommet de la pile et spr se trouve juste avant A dans la pile
3- Acc , l’analyseur est arrivé à une situation de succés
4- Une case vide : l’analyseur a abouti à un echec.
Algorithme d’analyse LR :
Donnée : une chaine d’entrée w et des tables d’analyse LR .
Résultat : si w est dans L(G), une analyse ascendante de w, sinon, une indication d’erreur
Méthode : Initialement, l’analyseur a S0 en pile, où S0 est l’état initial et w# dans son tampon ,
l’analyseur doit exécuter le programme ci-dessous jusqu’à ce qu’il rencontre soit, ne action accepter
soit erreur.
Initialiser le pointeur source ps sur le premier symbole de w# ;
Répéter indéfiniment début
Soit S l’état en sommet de pile et a le symbole pointé par ps ;
Si action [ S ,a]= décaler S’ alors début
Empiler a puis S’
Avancer ps sur le prochain symbole en entrée
Fin
Page
26
SAOUDI Lalia Analyse Syntaxique 2007/2008
Dans cette analyse nous construisons un automate AFD spécifiant les différents états d’avancement
d’analyse.
Un état de l’automate contient un ensemble d’éléments décrivant ce que l’analyse anticipe de
rencontrer à partir de l’instant où l’analyse transite vers cet état
Un élément de cet ensemble est appelé Item LR(0), une fois l’automate élaboré, nous
procédons à la construction de la table d’analyse.
Item LR( 0) :
Un Item LR(0) d’une grammaire G est une production de G avec un point repérant une
position de sa partie droite par conséquent, la production A XYZ fournit les quatre Items :
A.XYZ AX.YZ AXY.Z AXYZ.
La production Aϵfournit uniquement l’Item A.
Intuitivement un item indique la quantité de partie droite qui a été reconnue, à un moment donné.
Par exemple, le premier item ci-dessus indique l’on espère voir en entrée une chaine dérivable depuis
XYZ. Le second Item indique que nous venons de voir en entrée une chaine dérivée de X et que nous
espérons maintenant voir une chaine dérivée de YZ.
Une collection d’ensembles d’items LR(0), fournit la base de la construction des analyseurs SLR.
Pour construire une collection LR(0) nous définissons une grammaire augmentée et deux fonctions,
fermeture (closure) et transition (GOTO).
Page
27
SAOUDI Lalia Analyse Syntaxique 2007/2008
Si G est une grammaire d’axiome S, alors G’, la grammaire augmentée de G, est G avec un nouvel
axiome S‘ et une nouvelle production S’S , la chaine d’entrée est acceptée quand et seulement
quand l’analyseur est sur le point de réduire S’S.
La Fermeture d’un Item LR( 0 )
La closure d’un item [ A α . β] est un ensemble d’items LR (0) déterminé comme suit :
1- L’item LR (0 ) A α . β appartient à la closure.
2- Si [ X α . β] est un item LR( 0) de la closure, si β= BY où B λ est une règle de la
grammaire alors l’item LR(0) [B .λ] doit être ajouté à cette closure.
3- Répéter le pas 2 jusqu’à ce qu’aucun nouvel item LR( 0 )ne soit créé et ajouté à l’ensemble
Exemple 1: considérons la grammaire augmentée des expressions :
E’E
E- E+T / T
T T* F / F
F( E) / id
Si I est l’ensemble formé de l’unique Item [ E’E]alors :Fermeture(I) contient les Items : E’.E
E- .E+T / .T
T .T* F / .F
F.( E) / .id
L’opération transition :
La deuxième fonction utile est GOTO( I,X) où I est un ensemble d’items et X est un symbole de la
grammaire . GOTO( I,X) est définie comme la fermeture de l’ensemble de tous les items A α X. β
tels que A α . Xβ appartienne à I
GOTO( Ii,X)=closure( [A α X. β ])
Exemple2: Si I est l’ensemble des deux Items [E’ E. ], [E E.+ T], alors GOTO( I ,+) consiste
en : EE+. T T.T*F T .F F . (E) F .id
Construction des ensembles d’items
L’algorithme décrit ci-dessous représente la méthode de construction de la collection canonique
d’ensembles d’items LR(0) pour une grammaire augmentée G’ :
Procédure Items(G’) ;
Début
C :={ fermeture ({[S’S]})} ;
Répéter
Pour chaque ensemble d’items I de Cet pour chaque symbole de la grammaire X tel que
GOTO(I,X) soit non vide et non encore dans C faire
Ajouter GOTO(I,X) à C
Jusqu’à ce qu’aucun nouvel ensemble d’items ne puisse plus être ajouté à C
Fin
Exemple 3:La collection canonique d’ensembles d’items LR(0) pour la grammaire de l’exemple 1 est :
I0 :E’.E I5 : Fid. GOTO(I6,F)=I3
E- .E+T / .T I6 : GOTO(I1 ;+) GOTO(I6,( )=I4
T .T* F / .F E- E+.T GOTO(I6,id )= I5
F.( E) / .id T .T* F / .F I10: GOTO(I7,F )
Page
28
SAOUDI Lalia Analyse Syntaxique 2007/2008
Page
29
SAOUDI Lalia Analyse Syntaxique 2007/2008
11 R5 R5 R5 R5
2.2 Analyse LR(1)
Items valide:
Nous disons que l’item A β1.β2 est valide pour un préfixe viable αβ1 s’il existe une dérivation
S’ αAw αβ1β2w
Rappelons que dans la méthode SLR, l’état I indique une action réduire par A α à la vue du terminal
a si l’ensemble des items Ii, contient l’item A α. Et a appartient à SUINANT(A). Cependant, dans
certains cas, quand l’état i apparait en sommet de la pile, le préfixe viable β α de la pile est tel que βA
ne peut être suivi par a dans aucune proto-phrase. Par conséquent, réduire par A α est invalide à la
vue de a
On va mettre plus d’informations dans les Items de manière à mieux contrôler les caractères qui
peuvent être arrivés après.
On incorpore l’information supplémentaire dans l’état en redéfinissons les items de façon qu’ils
incluent un symbole terminal comme second composant.
La forme générale d’item devient [Aα.β , a] où A αβ est une règle de la grammaire et ‘a’ un
terminal. ‘a’ est appelé lookhead ou entité de prelecture de l’item LR(1) ; 1 indiquant la longueur du
second composant appelé prévision de l’item.la prévision n’a aucun effet dans un item de la forme
[A α.β , a]avec β≠ϵ, mais un item de la forme [A α. , a] implique une action réduire par Aα
uniquement lorsque le prochain symbole en entrée est a.
La méthode pour construire la collection des ensembles d’items LR(1) valides est essentiellement la
même que celle utilisée pour construire la collection canonique des ensembles d’items LR(0). Nous
avons uniquement besoin de modifier deux procédures Fermeture « closure »et transition « GOTO »
Fermeture :
2-si β= Bγ où B est un non terminal et si Bδ ajouter l’item [B.δ ,b] où b est un terminal de
PREMIER(γa).
Transition :
[A α.Xβ , a]et dans ce cas elle est égale à la closure de l’item [A αX.β , a]
Exemple :
Page
30
SAOUDI Lalia Analyse Syntaxique 2007/2008
2. L’état i de l’analyseur est construit à partir de Ii, les actions d’analyse pour l’état i sont
déterminées de la façon suivante :
a. Si [A α.aβ , b] est dans Ii, remplir Action [i,a] avec dj où j est tel que GOTO(Ii,a)=Ij
b. Si [A α ., a] est dans Ii, A≠S’ remplir Action[i,a] avec rj où j est le num de la règle
A α dans la grammaire.
3.les transitions GOTO pour l’état i sont déterminées comme suit : si GOTO(Ii,A)= Ij alors placer
dans la case (i,A) le numéro j.
4. toutes les entrées non définies par les règles 2 et 3 sont remplies avec erreur.
0 D3 D4 1 2
1 ACC
2 D6 D7 5
3 D3 D4 8
4 R3 R3
5 R1
6 D6 D7 9
7 R3
8 R2 R2
9 R2
Page
31
SAOUDI Lalia Analyse Syntaxique 2007/2008
Nous introduisons la dernière méthode pour construire des analyseurs, la technique LALR( Look A
head LR), cette méthode est souvent utilisée en pratique, parce que les tables obtenues sont
considérablement plus petites que les tables LR canoniques, et satisfait une grande classe de
grammaire.
Page
32
SAOUDI Lalia Analyse Syntaxique 2007/2008
Ces deux décalages proviennent des ensembles LR(1) qui ont le même cœur d’items, il y aurait conflit
dans ce cas, lorsque les états de transition ne seront pas identiques ou équivalents, or, l’état suivant est
défini comme étant la closure de transition par l’élément se trouvant après le point dans l’item ( qui est
le même dans les deux items LR(1)). D’après la définition de la closure, les états de transition seront
identiques.
Cas 2 : présence d’un décalage et d’une réduction dans une même case.
Ces deux actions proviennent de deux items LR(1) de deux états LR(1) différents ayant les mêmes
cœurs. Mais dans la case de la table LR(1) qui contient la réduction, on aurait eu aussi un décalage
puisque le cœur de l’itemLR(1) provoquant cette réduction est le même que celui qui a provoqué le
décalage dans la case symétrique.
Cette case serait donc multi définie dans la table LR(1) et par conséquent la grammaire ne serait pas
LR(1).
Le seul conflit possible qui peut se présenter est la présence dans une même case de deux réductions
différentes.
En effet, deux items LR(1) ayant respectivement la forme [AC. ,x] et [ B.C, x] peuvent exister
dans un même ensemble. Maintenant, si on essaye de superposer deux ensembles ayant ces deux
items, il y aurait conflit entre deux réductions dans une même case
Cas 4 : présence d’une erreur et d’une autre action dans une même case .
Le cas (erreur, décalage) ne peut pas se présenter car si on a un décalage dans une case, on aurait eu un
autre décalage dans la case symétrique pour la même raison évoquée dans le cas 1.
Dans ce cas ; si la chaine est correcte syntaxiquement, l’analyse LR(1) et l’analyse LALR (1)
progresseront exactement de la même façon . La seule chose qui diffère réside dans les appellations ou
numérotage des états de transition.
Page
33
SAOUDI Lalia Analyse Syntaxique 2007/2008
36 D36 D47 89
47 R3 R3 R3
5 R1
89 R2 R2 R2
Table d’analyse LALR(1)
Note : lorsqu’il ya une erreur dans la chaine à analyser , l’analyse LR(1) détectera plus rapidement
cette erreur alors que l’analyse LALR procédera une série de réduction avant de rencontre l’erreur.
4.Analyse par précédence d’opérateurs :
Cette technique peut analyser une petite classe de grammaire, ces grammaires ont la propriété de ne pas avoir de
production dont la partie droite est ni d’avoir deux non terminaux adjacents. Une grammaire vérifiant la dernière
propriété est une grammaire d’opérateurs.
.
Dans
. l’analyse par précédence d’opérateurs, nous définissons trois relations de précédence disjointes < . ,= ,
>, entre certains couples de terminaux.
a <. b : a cède la précédence à b
A=. b : a la même précédence que b
a>. b : a prend la précédence sur b
La seconde méthode consiste à construire d’abord une grammaire non ambiguë pour le
langage qui reflète l’associativité et la priorité correcte dans ses arbres d’analyse, il existe une
méthode mécanique pour en dériver les relations de précédence d’opérateurs.
Le but des relations de précédence est de délimiter le manche d’une proto-phrase droite avec
<. Marquant l’extrémité gauche, =. Apparaissant à l’intérieur du manche et .> marquant
l’extrémité droite.
Page
34
SAOUDI Lalia Analyse Syntaxique 2007/2008
Par exemple considérons la prot-phrase droite id+id*id et supposons que les relations de
précédence sont les suivantes :
Id + * #
Id .> .> .>
+ <. .> <. .>
* <. .> .> .>
# <. <. <.
Alors , la chaine dans laquelle les relations de précédence ont été insérées est :
#<. Id .> + <. Id .> * <. Id .> #, on peut déterminer le manche en appliquant le procédé suivant :
1. Parcourir la chaine à partir de l’extrémité gauche jusqu’à rencontrer le premier.>, dans notre
exemple cela se produit entre le premier id et +.
2. Parcourir alors en sens inverse(vers la gauche)en sautant les =. Jusqu’à rencontrer un<. « dans
l’exemple en revient jusqu’au # ».
3. le manche contient tout ce qui se trouve à gauche du premier .> et à droite du <.rencontré à l’étape
2, y compris les non-terminaux intérieurs ou situés aux extrémités , dans notre exemple le manche est
le premier id, donc on peut le remplacer(réduire) par E . A ce point nous avons la proto-phrase droite
E+id*id, après avoir réduit vers E, par un procédé analogue, les id restants, on obtient la proto-phrase
droite E+E*E, considérant maintenant la chaine # +*# obtenue on supprimant les non terminaux. En
insérant les relations de précédence, nous obtenons : #<. +<.*.># qui indique que l’extrémité gauche
du manche se trouve entre + et * et que son extrémité droite se trouve entre * et #, alors le manche est
E*E.
La présentation ci-dessus peut sembler impliquer que la proto phrase droite doit etre parcourue en
entier chaque fois que l’on recherche un manche , ce n’est pas le cas si on utilise une pile pour
mémoriser les symboles d’entrée déjà lus et si les relations de précédence sont utilisées pour guider les
actions de l’analyseur par décalage-réduction.l’idée est peut être formalisée par l’algorithme suivant
Algorithme
Donnée : une chaine d’entrée w et une table de relation de précédence.
Résultat : si w est bien formé, un squelette d’arbre d’analyse
Page
35
SAOUDI Lalia Analyse Syntaxique 2007/2008
Certains types de grammaires ambiguës sont cependant utiles pour spécifier et implanter les langages.
Page
36
SAOUDI Lalia Analyse Syntaxique 2007/2008
Avec une grammaire ambiguë, nous pouvons spécifier les constructions de cas particuliers en ajoutant
prudemment de nouvelles productions à la grammaire.
Précisons que bien que les grammaires que nous utilisons soient ambiguës, nous spécifions dans tous
les cas des règles pour lever ces ambigüités et permettre ainsi un arbre d’analyse unique pour chaque
phrase
Utilisation des priorités et des associativités pour résoudre les actions conflictuelles d’analyse :
Est ambiguë car elle ne spécifie pas ni l’associativité ni la priorité des opérateurs + et *, la grammaire
non ambiguë est :
Engendre le même langage mais donne à + une priorité plus faible que celle de * et définit une
associativité à gauche pour ces deux opérateurs.
Nous pourrions vouloir utiliser la grammaire 1 plutôt que 2 pour deux raisons :
1. Nous pouvons facilement changer les niveaux d’associativité et de priorités des opérateurs +
et * sans toucher aux productions de 1ni au nombre d’état d’analyseur résultant.
2. L’analyseur pour 2 passe une part substantielle de son temps ) réduire par les productions
ET et TF dont la seule fonction est d’imposer l’associativité et la priorité, l’analyseur
pour 1 ne perdre aucun temps à réduire par ces productions simples.
- La seconde consiste à analyser la grammaire sans relever son ambigüité et dans une
deuxième étape à résoudre les conflits se trouvant dans la table d’analyse, cette dernière
approche est préférable pour les raisons citées précédemment.
Considérons la collection des ensembles d’items LR(0) de la grammaire (1) augmentée par E’E
I0 : E’ .E
E.E+E
E . E*E
E.(E)/ .id
I1 : E’ E.
Page
37
SAOUDI Lalia Analyse Syntaxique 2007/2008
EE.+E
EE.*E
I2 : E(.E)
E.E+E
E.(E)/ .id
E . E*E
La table SLR(1) générée est la suivante :
Id + * ( ) # E
0 D3 D2 1
1 D4 D5 ACC
2 D3 D2 6
3 R4 R4 R4 R4
4 D3 D2 7
5 D3 D2 8
6 D4 D5 D9
7 R1/D4 R1/D5 R1 R1 R1
8 R2/D4 R2/D5 R2 R2
9 R3 R3 R3 R3
Prenons comme exemple Le conflit engendré par I7 entre réduire par EE+E…R1 et décaler + ou *
Essayons de résoudre le conflit apparaissant dans la case (7,+) et ceci en considérant la précédence ou
l’associativité des opérateurs de la grammaire, dans la case indiquée nous avons deux actions r1 et d4,
la présence de r1 signifie qu’au sommet de la pile la chaine E+E qui est la partie droite de la 1iere
règle est présente la présence de d4 signifie qu’il faut empiler le + se trouvant en tête de la chaine.
Nous somme donc devant d’une expression du genre a +b+c, cette expression peut être interprétée
comme (a+b)+c ou a+(b+c) selon l’associativité de l’opérateur +
Passons maintenant à la case (7,*), dans cette case nous avons une réduction par r1 et un décalage d5,
nous somme donc en présence d’une opération du genre a+b*c ; d’après l’ordre de précédence des
opérateurs + et *, a+b*c = a+(b*c ), par conséquent le conflit est résolut en faveur de d5.
Des raisonnements analogues peuvent se produire pour supprimer les conflits apparaissant dans les 2
autres cases.
6.Erreurs syntaxiques
Beaucoup d’erreurs sont par nature syntaxique, Le gestionnaire d’erreur doit :
-indiquer la présence de l’erreur de façon claire et précise.
-traiter l’erreur rapidement pour continuer l’analyse.
-traiter l’erreur le plus efficacement possible de manière à ne pas en créer de nouvelles.
Page
38
SAOUDI Lalia Analyse Syntaxique 2007/2008
Heureusement les erreurs communes (confusion entre deux séparateurs par exemple entre, et ; oubli
de ;) sont simples et un mécanisme simple de traitement suffit en général.
Il existe plusieurs stratégies de récupération sur erreur : mode panique, au niveau du syntagme
, productions d’erreur, correction globale.
Récupération en mode panique :
C’est la méthode la plus simple à implanter. Quand il découvre une erreur, l’analyseur syntaxique
élimine les symboles d’entrée les un après les autres jusqu’à en rencontrer un qui appartienne à un
ensemble d’unités lexicales de synchronisation.
Bien que cette méthode saute en générale une partie considérable du texte source sans en vérifier la
validité, elle a l’avantage de la simplicité et ne peut pas entrer dans une boucle infinie.
Page
39
SAOUDI Lalia Analyse Syntaxique 2007/2008
e1 : (routine appelée depuis les états 0,2,4 et 5 lorsque l on rencontre un opérateur ou la fin de chaine
d’entrée alors qu’on attend un opérande ou une parenthèse ouvrante)
Emettre le diagnostic opérande manquant
Empiler un nombre quelconque et aller dans l’état 3
e2 :( routine appelée depuis les états 0,1,2,4 et 5 à la vue d’une parenthèse fermante)
Emettre le diagnostic parenthèse fermante excédentaire
Ignorer cette parenthèse fermante
e3 : (routine appelée depuis les états 1ou 6 lorsque l’on rencontre un nombre ou une parenthèse
ouvrante alors que l’on attend un opérateur)
Emettre le diagnostic operateur manquant
Empiler +(par exemple) et aller à l’état 4
e4 : (routine appelée depuis l’état qui attend un opérateur ou une parenthèse fermante lorsque l on
rencontre la fin de chaine)
Emettre le diagnostic parenthèse fermante oubliée
Empiler une parenthèse fermante et aller à l’état 9 .
Exemple : sur l’entrée erronnée : id + ) voici la séquence de configurations :
0 id +)#
0 id 3 +) #
Productions d’erreur :
Si l’on a une idée assez précise des erreurs courantes qui peuvent être rencontrées, il est possible
d’augmenter la grammaire du langage avec des productions qui engendrent les constructions erronés.
Par exemple (pour un compilateur C) :
I if E I (erreur : il manque les parenthèses)
I if ( E ) then I
(erreur : il n’ y a de then en C ).
Correction globale:
Dans l’idéal, il est souhaitable que le compilateur effectue aussi peu de changements que possible. Il
existe des algorithmes qui permettent de choisir une séquence minimale de changements
correspondant globalement au cout de correction le plus faible. Malheureusement, ces méthodes sont
trop couteuses en temps et en espace pour être implantées en pratique et ont donc uniquement un
intérêt théorique. En outre, le programme correct le plus proche n’est pas forcément celui que le
programmeur avait en tète ….
Page
40
SAOUDI Lalia Analyse Syntaxique 2007/2008
L’utilisateur aura simplement à fournir une source de spécification qui contiendra principalement le
description de la grammaire du langage à compiler
Yacc est un constructeur d’analyseurs LALR qui est largement disponible, Yacc est l’acronyme de «
Yet another compiler-compiler », reflétant la popularité des constructeurs d’analyseurs au début des
années 70 , Yacc est disponible en tant que commande sur le système UNIX et il a été utilisé pour
faciliter l’implantation de certaines de compilateurs.
On prépare tout d’abord un fichier, par exemple traduire.y, qui contient une spécification du traducteur
pour Yacc. La commande système UNIX : yacc traduire.y produit à partir du fichier traduire.y un
programme C appelé y.tab.c en utilisant la méthode LALR. Le programme y.tab.c est une
implantation d’analyseur LALR écrite en C , complétée par d’autres routines C que l’utilisateurs a
éventuellement écrites, les tables d’analyse LALR sont compressées .
Ces entités représentent les symboles terminaux de la grammaire, aussi d’autres informations telles
que la précédence et l’associativité des opérateurs.
Page
41
SAOUDI Lalia Analyse Syntaxique 2007/2008
* Les symboles non terminaux sont les caractères ou les chaines de caractères non déclarées comme
unités
lexicales
yacc fait la différence entre majuscules et minuscules : SI et si ne désignent pas le même objet.
La deuxième zone est utilisée pour la description de la grammaire du langage à compiler. Elle est
constituée de règles de traduction attachée une action de traduction qui est un fragment de programme
écrit dans le langage d’écriture de l’analyseur syntaxique appelé le langage hote. Cette action est
exécutée par l’analyseur à chaque fois qu’il procède à une réduction par la règle correspondante.
A :: = BCD { action} la barre de sheffer est utilisée pour séparer deux productions d’un même non
terminal
Exemple : A :: = BC {action1}
| CD{action2}
Enfin la troisième zone est utilisée pour l’écriture des procédures de l’utilisateur dont l’appel se fait
dans les actions attachées aux règles de production de la deuxième partie.
- La section du bloc principal doit contenir une fonction yylex,() effectuant l’analyse lexicale du texte,
car
L’analyseur syntaxique l’appelle chaque fois qu’il a besoin du terminal suivant.
Conflit shift-reduce et reduce-reduce :
Lorsque l’analyseur est confronté à des conflits, il rend compte du type et du nombre de conflits
rencontrés :
>bison exempl.y
Conflicts: 6 shift/reduce ,2 reduce_reduce
Il y a un conflit reduce/reduce lorsque le compilateur a le choix entre (au moins) deux productions
pour réduire une chaine. Les coflits shift/reduce apparaissent lorsque le compilateur a le choix entre
réduire par une production et décaler le pointeur sur la chaine d’entrée.
yacc_résoud les conflits de la manière suivante :
conflit reduc/reduce : la production choisie est celle apparaissant en premier dans la
spécifications.
coflit shift/reduce : c’est le shift qui est effectué.
Récupération des erreurs :
Lorsque l’analyseur rencontre une erreur, il appelle par défaut la fonction yyerror(char *) qui se
contente d’afficher le message parse error, puis il s’arrête.
Cette fonction peut être redéfinie par l’utilisateur .
Il est possible de traiter de manière plus explicite les erreurs en utilisant le mot clé error.
On peut rajouter dans toute production de la forme A B1|B2…. Une production
A error B
Page
42
SAOUDI Lalia Analyse Syntaxique 2007/2008
Dans ce cas, une production d’erreur sera traitée comme une production classique. On pourra donc lui
associer une action sémantique contenant un message d ‘erreur.
Dés qu’une erreur est rencontrée, tous les caractères sont avalées jusqu’à rencontrer le caractère
correspondant à B.
Page
43