Académique Documents
Professionnel Documents
Culture Documents
1/36
Introduction
lanalyse ascendante (ou par d ecalage-r eduction) construit
droites
si S w , r eduire ` aA Aw rm rm
cha ne aabbc
S aabbc Aabbc Abbc AbBc ABc ABC rm rm rm rm rm rm r eduire a ` a A, puis Aa ` a A, ... probl` eme : quel b r eduire ` a B ; clairement pas le 1er, car on
2/36
d ecale (avance et empile) dans le texte reprenons avec S aabbc Aabbc Abbc AbBc ABc ABC rm rm rm rm rm rm
pile a A Aa A Ab Abb AbB texte restant aabbc abbc abbc bbc bbc bc c c action d ecaler r eduire a ` aA d ecaler r eduire Aa ` aA d ecaler r eduire b ` a B ? non car ABb ne serait pas un pr exe viable d ecaler r eduire b ` a B ? oui car AbB est un pr exe viable r eduire bB ` a B , etc...
3/36
4/36
Principes de lanalyse LR
un th eor` eme important : les pr exes viables appartiennent ` a
un langage r egulier
ces pr exes peuvent etre regroup es en un nombre ni de
classes d equivalences (par exemple la classe des pr exes correspondant ` a une certaine poign ee) on peut donc reconna tre les pr exes viables et les poign ees par un automate ni qui explore la pile
en fait pas besoin dexplorer la pile : si on met dans la pile les
etats de lautomate ni, chaque etat correspond ` a la reconnaissance dun ensemble de pr exes le sommet de pile synth etise la classe d equivalence du pr exe pr esent dans la pile (ou, autrement dit, repr esente leur classe d equivalence)
5/36
une poign ee (les k symboles de fen etre permettant au besoin de choisir quelle r eduction eectuer)
en LL, la pile ne permet pas de savoir selon quelle r` egle
6/36
Analyse LR(0)
la construction dun analyseur LR(0) ressemble fortement ` a la
8/36
sommet de pile :
r eduire selon une r` egle, dans les etats avec un item de la forme
(A si on r eduit selon A), une table de saut permet dempiler un nouvel etat si un etat contient des items d ecidant dactions di erentes, on a un conit LR(0)
conit d ecalage-r eduction (shift-reduce) si [A] et
[ B a ]
conit r eduction-r eduction (reduce-reduce) si [A] et
[B ], (A = B ou = )
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 9/36
T q6
q4
q5 q3
q7 q9
q8
q6
Analyse SLR(1)
prenons maintenant la grammaire
G2 = {E E + T | T , T T F | F , F i }
il est facile de voir que les items [E T ] et [T T F ] de
suivants de E on obtient un automate SLR(1), soit simple LR(1) (la notion peut s etendre ` a SLR(k )) :
[A] d ecide une r eduction uniquement sur les suivants de A [Aa ] d ecide un d ecalage uniquement sur a
12/36
Tables SLR(1)
la table dactions de lanalyseur SLR(1) regarde l etat en
table de saut E T q1 q6
q5
q6
(LR, SLR, LALR), avec action et saut les tables daction et de saur respectivement
initialement, la pile contient q0 r ep eter ni := faux soit s l etat en sommet de pile et c le prochain symbole si action[s,c] = qi alors empiler qi et avancer dans le texte sinon si action[s,c] = rA alors d epiler || etats de la pile soit s l etat qui est maintenant en sommet de pile empiler saut[s,A] sinon si action[s,c] = accepter alors ni := vrai sinon erreur() tantque non ni
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 14/36
ne permet pas de r esoudre le conit en q3 pourtant, ac suivi de a commande clairement Ac , et suivi de b il commande B c (et inversement pour le pr exe bc )
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 15/36
Analyse LR(1)
la faiblesse de lanalyse SLR(1) est quelle ne tient pas compte
de ce qui a et e reconnu (synth etis e dans la pile) pour pr edire les suivants quon peut attendre dans ce contexte lanalyse LR y r em edie en ajoutant aux items LR(0) les suivants attendus
un item LR(1) est de la forme : [A, t ], o` u t est un
dans la fermeture :
pour les items de la forme [AB , t ], on ajoute les items
[B , u ] o` u u Prem( t ) : B , dans ce contexte, ne peut etre suivi que dun premier de , ou de t si est vide ou produit le vide l etat q0 est la fermeture de [S S , ]
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 16/36
q2
q4 [Ac , b ] [B c , a]
17/36
pour la table de saut pour un etat qi transitant pas A (A non terminal) sur qj , saut [qi , A] = qj
18/36
soit |G | la taille dune grammaire (le nombre total de symboles apparaissant dans les r` egles) ` a une r` egle A correspondent |A| items LR(0), donc le nombre total ditems LR(0) di erents est |G | un etat est un sous-ensemble ditems LR(0) : on peut avoir au plus 2 |G | etats LR(0) (puisque le nombre de sous-ensembles dun ensemble de
n el ements est 2n )
on a |G | |T | items LR(1) possibles (` a cause de lintroduction des suivants), donc 2|G ||T | etats possibles : en pratique, lautomate LR(1) peut facilement etre 10 ` a 100 fois plus gros que le LR(0) !
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 19/36
m emes noyaux LR(0) ditems, mais pas les m emes suivants, puissent etre fusionn es sans cr eer de conit
par exemple, qi = {[A, t ], [B , u ]} et
LR(0), tout en conservant en grande partie le b en ece du calcul plus pr ecis des suivants de la m ethode LR(1)
toutefois, lid ee de construire un automate LR(1) et de
fusionner des etats quand cest possible, m eme si elle est correcte dun point de vue th eorique, pose le probl` eme de la complexit e (en temps et en espace) de la construction dun automate LR(1)
il existe un moyen plus ecace pour calculer les suivants
21/36
(il y a evidemment un conit LALR(1) si un m eme t d ecide plusieurs actions di erentes) calcul de SC (A, qi ) : pour tout qj transitant par sur qi , soit qk atteint de qj par A SC (A, qi ) = {t | qk transite par t sur un autre etat, t T } si qk contient [B A], ajouter SC (B A, qk ) ` a SC (A, qi ), et ceci r ecursivement
22/36
V i (E ), E V , F i (E )
et soit le fragment de son automate LR(0) et les suivants
contextuels LALR(1)
q5 let q0 [S S ] [S let F = E ] [S F ] [S V = E ] [F i (E )] [V i ] [V i (E )] S q4 [S S ] V q6 [S F ] q3 [S V = E ] = = [S let F = E ] [F i (E )] q1 i [F i (E )] (E ) F [V i ] r eduire sur = [V i (E )] [V i (E )] r eduire sur =
eduire sur [F i (E )] r
F i
q2
un suivant de F)
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 23/36
24/36
dajouter des actions s emantiques et dindiquer comment r eparer les erreurs Forme g en erale dune grammaire pour Bison
[d efinitions] %% [r` egles] [%% code C ]
sauf le premier %%, tout ce qui est indiqu e entre [ ] est optionnel.
Les espaces (blanc, n de ligne, tabulation) ne sont pas
R` egles
Elles sont de la forme g en erale (forme EBNF non accept ee) :
NT : S1 S2 ... { action en C } | ... ;
Si est un ident de non terminal, ou de terminal (d eclar e par %token et reconnu par lanalyseur lexical), ou une cha ne de 1 seul caract` ere
ambigu es notamment)
%nonassoc %left + %left * %% exp : exp EQU < > NEQ LEQ GEQ - / * exp
a * b * c ambigu (et conit d/r), mais lassociativit e gauche permet de r esoudre le conit en faveur de la r eduction a * b ` a expr modication locale de la priorit e dans une r` egle exp : - exp %prec * - a * b ambigu (et conit d/r), mais -a r eduit ` a expr car ce prend lassociativit e de *
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 27/36
Le couple Flex-Bison
xxx.l Flex y.tab.h xxx.y main () xxx.c Bison yyparse () xxx.tab.c compilateur C xxx lex.yy.c yylex ()
flex xxx.l produit un programme C dans lex.yy.c bison xxx.y produit un programme C dans xxx.tab.c
Interface Flex-Bison
les d eclarations de token dans Bison donnent une macro (dans xxx.tab.h), par exemple %token ID donne #define ID 256 inclure xxx.tab.h dans le source ex les actions dans ex doivent retourner le code du token [A-Za-z]+ return ID; les tokens peuvent calculer des attributs, par exemple en Bison %union { int ival; ... %token<ival> NB
en Flex, lattribut dun token est calcul e dans la variable globale yylval
[0-9]+ { yylval.ival = atoi (yytext); return NB; }
29/36
Automate LALR
il est produit sur xxx.output par loption -v exemple avec la grammaire nonlalr.y expr : var = expr | var | ( expr ) ; var : ID | var [ expr ] | * expr ; appel ` a Bison : bison -v nonlalr.y conflicts: 2 shift/reduce
30/36
Automate LALR 1
automate : conit dans l etat 2 (le des items LR est not e ) 2: shift/reduce conflict (shift 6, redn 2) on = 2: shift/reduce conflict (shift 7, redn 2) on [ state 2 expr : var_= expr expr : var_ (2) var : var_[ expr ] = [ . shift 6 shift 7 reduce 2
d ecaler
le d ecalage (action par d efaut) semble correct ici (on peut
Automate LALR 2
mais l etat 5, qui marque la rencontre de *, va sur l etat 2 state 5 var : *_expr ID shift 4 ( shift 3 * shift 5 . error expr goto 9 var goto 2 donc * t[x] sera analys e comme * (t[x]) (correct), mais *p = x sera analys e comme * (p = x) (incorrect)
32/36
Automate LALR 3
il faut soit changer la grammaire
expr : var = expr | var ; var : v | * var ; /* r eduction avec = en fen^ etre */ v : ID | ( expr ) | v [ expr ] ; /* d ecalage avec [ en fen^ etre */
soit garder la grammaire originale avec : %right = %right * %left [ %% expr : var = expr | var %prec * | ( expr ) ; var : ID | var [ expr ] | * expr ;
Universit e de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 33/36
sont :
conit d ecalage/r eduction (shift/reduce) : eectuer le shift. conit r eduction/r eduction (reduce/reduce) : eectuer la
r eduction par la r` egle d enie la premi` ere parmi les r` egles en conit. exp : exp - exp | exp * exp | NOMBRE
lex` emes
%left - %left * /* plus prioritaire que + car d eclar e apr` es */
34/36
35/36
est appel ee
par d efaut, le param` etre est "parse error" Bison permet davoir des messages plus pr ecis en d enissant
sarr ete
reprise derreur = mode panique : on avance dans la phrase
36/36