Vous êtes sur la page 1sur 14

CH.

2 L'ANALYSE SYNTAXIQUE
2.1 Le rle de lanalyseur syntaxique
2.2 Les grammaires
2.3 Lanalyse descendante
2.4 Lanalyse ascendante

Traduction ch2 1

2.1 Le rle de lanalyseur syntaxique


programme
source

unit lexicale
analyseur
analyseur
lexical
syntaxique
(sur requte)

arbre
danalyse

table des symboles

Rle central de la partie frontale :


active lanalyseur lexical;
vrifie la conformit syntaxique;
construit larbre danalyse ;
prpare ou anticipe la traduction ;
gre les erreurs communes de syntaxe.

Traduction ch2 2

Types danalyseurs syntaxiques :


mthodes universelles (Cocke-Younger-Kasami),
permettent une analyse de nimporte quelle
grammaire algbrique, mais performance en O(n3) ;
mthodes linaires en O(n), sur certaines grammaires :
analyse ascendante, la plus intuitive, se prte bien
certains types de traductions ;
analyse descendante, plus sophistique, la plus utilise
par les gnrateurs automatiques danalyseurs syntaxiques,
car ne ncessite que peu dadaptations de la grammaire.
Traitement des erreurs :
diagnostic (messages) ;
redmarrage :
mode panique, jusqu resynchronisation ;
correction, difficile si lerreur est antrieure sa dtection ;
rgles derreurs, intgres la grammaire.
Traduction ch2 3

2.2 Les grammaires


Syntaxe spcifie par des rgles de grammaire.
Symboles terminaux (= units lexicales) alphabet A ;
Symboles intermdiaires ou variables (= catgories
grammaticales) alphabet X ;
Rgles de grammaire x w , o x X et o w (A X)*
w est un mot quelconque, mme vide.
Exemples :
instr si expr alors instr sinon instr
phrase gsujet gverbe gcomplment
Axiome (= programme)
Langage engendr = mots terminaux drivant de laxiome.
Traduction ch2 4

Exemple : Expressions arithmtiques


E
E
E
E
E
E

nombre
(E)
E+E
EE
E*E
E/E

Arbre danalyse de 3*(6+2)


E
E

3 nombre
E

6 nombre

2 nombre

Les valeurs explicites sont des attributs des units lexicales.


Lassociation aux units lexicales est ralise par lanalyseur
lexical.
Traduction ch2 5

Grammaire prcdente ambigu


Grammaire non ambigu pour expressions arithmtiques suffixes :
E EE + | EE | EE * | EE / | nombre
Grammaire non ambigu pour les expressions arithmtiques :
E E +T | E T | T
T T *F | T /F | F
F ( E ) | nombre

Choix : associativit gauche


priorit de * et / sur + et

Traduction ch2 6

Analyse syntaxique :
tant donn un mot terminal, dterminer sil est ou non engendr
par la grammaire ; si oui, en donner un arbre danalyse.
Mthode universelle : essayer toutes les drivations partir de
laxiome, jusqu trouver le mot. Des rgles de longueur (aprs
modifications) permettent dliminer les impasses.
Mthode descendante (descente rcursive) : une procdure par
variable, les terminaux servant choisir la drivation (prvision)
et la validation.
Mthode ascendante : on lit le mot (dcalage) jusqu identifier
des drivation, quon rduit et empile (rduction).
Traduction ch2 7

2.3 Lanalyse descendante


Une procdure par terme.
Problme : rcursivit directe gauche ;
ncessit dune transformation pour lliminer.
Grammaire de dpart
E E +T | T
T T *F | F
F (E ) | nombre

A
E
G
T
U
F

Grammaire modifie
E$
(production augmente)
TG
+TG |
FU
*FU |
(E ) | nombre

Procdures correspondantes : deux procdures supposes crites :


prevision retourne lunit lexicale suivante sans lenlever ;
correspond(x) lit lunit lexicale suivante, lenlve et signale une
erreur si elle ne vaut pas x. Ici plus, nombre, etc. sont les
codes dunits lexicales renvoys par lanalyseur lexical.
Traduction ch2 8

procedure expression ;
begin writeln(E->TG) ;
terme ; encoreterme
end ;
procedure encoreterme ;
begin
if prevision = plus then
begin writeln(G->+TG) ;
correspond(plus) ;
terme ; encoreterme
end
else writeln(G->epsilon)
end ;

procedure expression ;
begin writeln(E->TG) ;
terme ;
while prevision = plus do
begin
writeln(G->+TG) ;
correspond(plus) ;
terme
end ;
writeln(G->epsilon)
end ;

En liminant la rcursivit
terminale et en regroupant
Traduction ch2 9

procedure facteur ;
begin
if prevision = ouvrante then
begin writeln(F->(E)) ;
correspond(ouvrante) ;
expression ;
correspond(fermante)
end
else if prevision = nombre then
begin writeln(F->nombre);
correspond(nombre)
end
else writeln(erreur syntaxique)
procedure analyse ;
end
;
begin writeln(A->E$) ;
expression ; correspond(dollar) ; writeln(analyse reussie)
end ;

procedure terme ;
begin writeln(T->FU);
facteur ;
while prevision = mult do
begin writeln(U->*FU) ;
correspond(mult) ;
facteur
end ;
writeln(U->epsilon)
end ;

Lchec de lanalyse est aussi pris en charge par correspond(x).


Traduction ch2 10

Fonctions PREMIER et SUIVANT

PREMIER(x)

SUIVANT(x)

PREMIER(x) = ensemble des terminaux pouvant apparatre


au dbut dune drivation de x.
SUIVANT(x) = ensemble des terminaux pouvant suivre x dans
une drivation
Traduction ch2 11

Calcul de PREMIER :
On construit un graphe entre tous les symboles grammaticaux.
Flche de x vers y ssi x y , et est annulable.
Ici, ne peut contenir que des variables, est quelconque.
PREMIER(x) = { a terminal | il existe un chemin de x a } ;
si x est annulable, il faut y ajouter .
Exemple de la grammaire prcdente : Annulables : G et U
Graphe :

(
G
nombre

PREMIER(A) = PREMIER(E) = PREMIER(T) = PREMIER(F) = { (, nombre }


PREMIER(G) = {+, } PREMIER(U) = { *, }

Traduction ch2 12

Calcul de SUIVANT :
On construit un graphe entre tous les symboles grammaticaux.
Flche de x vers y ssi ou bien
il existe z x , y est terminal et y PREMIER() ;
il existe y x et est annulable.
Ici, et sont quelconques, mme vides, et y .
SUIVANT(x) = { a terminal | il existe un chemin de x a }.
Exemple de la grammaire prcdente :
F
*
Graphe :
SUIVANT na pas de sens pour laxiome
A de la production augmente.
U T
+
G

SUIVANT(G) = SUIVANT(E) = { $, ) }
SUIVANT(U) = SUIVANT(T) = { +, $, ) }
SUIVANT(F) = { *, +, $, ) }

$
)

Traduction ch2 13

PREMIER et SUIVANT permettent de caractriser les


grammaires analysables de faon descendantes, avec un seul
symbole de prvision a :
a
partie dj
analyse

symbole de
prvision

partie restant
analyser

Grammaires LL(1).
Si non annulable,rgle x applique lorsque a PREMIER() ;
Si annulable,rgle x applique lorsque a SUIVANT(x).
La grammaire est LL(1) lorsqu chaque tape, une seule rgle
satisfait aux critres prcdents.
Traduction ch2 14

Table danalyse LL(1) :


+ *
E
G 2
T
U 6
F

(
1
4

5
7

n $
1
3
3
4
6
6
8

0A
1E
2G
3G
4T
5U
6U
7F
8F

E$
TG
+TG

FU
*FU

(E)
nombre

Les case vides de la table correspondent des erreurs syntaxiques.


La table commande les branchements dans les procdures de
lanalyse par descente rcursive.
On peut lutiliser comme donne dun programme universel danalyse descendante non rcursive.
Traduction ch2 15

2.4 Lanalyse ascendante


On utilise une pile, et une table de transition entre tats.
(Automate dterministe une pile)
En fonction du symbole de prvision,
on empile un tat en lisant un caractre de lentre (dcalage) ;
on dpile autant de symboles que la longueur de la rgle
quon a reconnue, et on empile un nouvel tat (rduction).

pile

partie analyse partie non analyse

Traduction ch2 16

Exemple : expressions arithmtiques


0A
1E
2E
3T
4T
5F
6F

E$
E +T
T
T *F
F
(E )
n

PREMIER :
A

(
n

SUIVANT :
F

$
+

Calcul des tats : ensembles de rgles marques (items) ;


Si un tat contient x u yv, il contient aussi tous les y w
(clture) ;
Si un tat contient x u yv, on a une transition par y sur un
tat contenant x uy v.
Traduction ch2 17

tat 0
A
E
E
T
T
F
F

tat 1
E

E$
E +T
T
T *F
F
(E )
n

A E $
E E +T

$
+

tat 2
T
F

E T
T T *F
tat 3

T F

n
(

tat 5

tat 4

F n
n

F
E
E
T
T
F
F

(E )
E +T
T
T *F
F
(E )
n

E
T
F

ACCEPT
tat 6
E
T
T
F
F

E + T
T *F
F
( E )
n

T
F
(
n

tat 7

T T * F
F (E )
F n

(
n

tat 8
F (E )
E E +T

tat 9
E E +T
T T *F
3

4
5
tat 10
T T *F
4
5
tat 11

)
+

F (E )
6

2
3
Traduction ch2 18

Fonctionnement de lanalyseur :
Au dbut, la pile contient ltat 0.
On lit la lettre courante du mot analyser ; avec ltat du
sommet de pile, elle spcifie ltat empiler (dcalage).
Lorsquun tat contient un item du type x u , on peut
enlever de la pile les |u| tats au sommet, et empiler ltat
spcifi par le nouveau sommet et x (rduction).
Parfois des conflits se produisent : dcalagerduction ou
rductionrduction ; cas gnral, x u , y v ,
z r st, o s est est terminale. Le conflit peut tre
tranch lorsque SUIVANT(x), SUIVANT(y) et s sont
disjoints, en examinant le caractre de pr-vision.
Une telle grammaire est dite SLR(1).
Traduction ch2 19

La suite des rductions constitue une drivation du mot


analyser, partir de la fin, et de droite gauche.
Tableau danalyse SLR(1) des expressions arithmtiques
0
1
2
3
4
5
6
7
8
9
10
11

n
d5

d6
r2
r4

d7
r4

r6

r6

d5

(
d4

r2
r4

A
r2
r4

r6

r6

d4

d5
d5

d4
d4
d6
r1
r3
r5

d7
r3
r5

d11
r1
r3
r5

E
d1

T
d2

F
d3

d8

d2

d3

d9

d3
d10

r1
r3
r5

Traduction ch2 20

Exemple : (3 + 2) * 4 $
Pile

Mot restant

0
04
045
043
042
048
0486
04865
04863
04869
048
0 4 8 11
03
02

(3 + 2) * 4 $
3 + 2) * 4 $
+ 2) * 4 $
+ 2) * 4 $
+ 2) * 4 $
+ 2) * 4 $
2) * 4 $
)*4$
)*4$
)*4$
)*4$
*4$
*4$
*4$

Rgle

Pile

Mot restant

027
0275
0 2 7 10
02
01

4$
$
$
$
$

F n
T F
E T

Rgle

F n
T T *F
E T
ACCEPT

Drivation obtenue :
F n
T F
E E +T
F (E )
T F

T T *F T * 4 F * 4
(E) * 4 (E + T) * 4
(E + F) * 4 (E + 2) * 4
(T + 2) * 4 (F + 2) * 4
(3 + 2) * 4

Traduction ch2 21

Parfois, les conflits ne peuvent pas tre levs par lexamen


des ensembles SUIVANT. On tient alors compte des
caractres pouvant suivre une variable pendant la construction.
Si lautomate ainsi construit na plus de conflits, on a une
grammaire LR(1).
Inconvnient : trs grand nombre dtats.
Solution de compromis : directement sur lautomate simple
prcdent, tudier la propagation des caractres pouvant
suivre une variable. Dans le cas des rductions, cet ensemble
joue le rle des ensembles SUIVANT du cas SLR(1). Si
les conflits sont ainsi rgls, la grammaire est LALR(1).
Mthode adopte par YACC.
LR(1) LALR(1) SLR(1)
Traduction ch2 22

Rgle de propagation du contexte :


item x u yv (z) donnant par clture y w (PREMIER(vz))
par transition x uy v (z)
On construit le graphe de dpendance des items. On tablit alors
le contexte en suivant les flches. Il peut y avoir des boucles.
tat 0
A
E
E
T
T
F
F

E$
E +T
T
T *F
F
(E )
n

()
($, +)
($, +)
($, +, *)
($, +, *)
($, +, *)
($, +, *)

tat 2
E T
($, +)
T T *F ($, +, *)

conflit lev

Dans lexemple, le rsultat est le mme que par SLR(1).


Traduction ch2 23

Utilisation de lambigut :
0A
1E
2E
3E
4E

E$
E +E
E *E
(E )
n

Grammaire ambigu pour


expressions arithmtiques
SUIVANT(E ) = {$, +, *, )}

Ne peut tre analyse par un analyseur dterministe,


car ambigu.
Nanmoins, des rgles de priorit permettent de lever les
conflits.
Traduction ch2 24

tat 0
A
E
E
E
E

tat 1

E
E$
E +E
E *E
(E )
(
n

tat 9
E n

A E $
E E +E
E E *E
tat 2
E
E
E
E
E

tat 3

E
E
E
E
E

(E )
E +E
E *E
(E )
n

E
E
E
E
E

E + E
E +E
E *E
(E )
n

tat 4

E * E
E +E
E *E
(E )
n

(
n

E E +E
E E +E
E E *E

+
*

3
4

2
9
tat 7

E E *E
E E +E
E E *E
(
n

+
*

3
4

2
9

tat 8

tat 5
E (E )
E E +E
E E *E

tat 6

ACCEPT

)
+
*

E (E )
3
4
Traduction ch2 25

tat 6
E E +E
E E +E
E E *E

Conflits dcalage-rduction
Sur $, ), pas de conflit, rduire
Sur +, rduire car + associatif gauche
Sur *, dcaler car * prioritaire sur +

tat 7
E E *E
E E +E
E E *E

Sur $, ), pas de conflit, rduire


Sur +, rduire car * prioritaire sur +
Sur *, rduire car * associatif gauche

Si conflit entre x u op1y et x u op2y :


1) op1 prioritaire sur op2, rduire ;
2) op2 prioritaire sur op1, dcaler ;
3) op1 et op2 ont mme priorit :
3.1) associativit gauche, rduire ;
3.2) associativit droite, dcaler ;
3.3) pas dassociativit, signaler une erreur.
Traduction ch2 26

Rcupration sur erreurs : Grammaire ambigu prcdente


Exemple de correction. Entres corriges en italique.
0
1
2
3
4
5
6
7
8
9

n
d9
3
d9
d9
d9
3
r1
r2
r3
r4

+
1
d3
1
1
1
d3
r1
r2
r3
r4

*
1
d4
1
1
1
d4
d4
r2
r3
r4

(
d2
3
d2
d2
d2
3
r1
r2
r3
r4

)
2
2
2
2
2
d8
r1
r2
r3
r4

$
1
A
1
1
1
4
r1
r2
r3
r4

E
d1
d5
d6
d7

1 Empiler 9 (un n imaginaire) et signaler oprande manquant


2 Enlever ) de lentre et signaler parenthse fermante en trop
3 Empiler 3 (un + imaginaire) et signaler oprateur manquant
4 Empiler 8 et signaler parenthse fermante manquante
Les rductions sur erreur repoussent la dtection de lerreur.
Traduction ch2 27