600 likes | 994 Vues
Transparent 2. Sommaire. 1. Introduction
E N D
1. 1 Compilation Analyses Lexicale, Syntaxique, et Smantique
Introduction
Les techniques d'analyse syntaxique utilisables dans la construction pratique des compilateurs sont principalement issues de deux grandes familles de grammaires, les LL(k) et les LR(k), pour lesquelles la thorie fournit des rsultats quasi optimaux.
Introduction
Les techniques d'analyse syntaxique utilisables dans la construction pratique des compilateurs sont principalement issues de deux grandes familles de grammaires, les LL(k) et les LR(k), pour lesquelles la thorie fournit des rsultats quasi optimaux.
2. Transparent 2 Sommaire 1. Introduction la compilation
2. Analyse lexicale
3. Rappels sur les langages formels
4. Analyse syntaxique non dterministe
5. Analyse syntaxique descendante
mthodes LL()
6. Analyse syntaxique ascendante
mthodes LR()
7. Traduction dirige par la syntaxe
8. Gnrateurs LR()
9. Smantique statique des L.P.
10. Traitements source to source Rfrences bibliographiques
Compilateurs: Principes, techniques et outils, A. Aho, R. Sethi, J. Ullman; InterEditions (1991)
Lex & Yacc, JR Lewine, T. Mason, D. Brown; OReilly & Associates, Inc (1992)
A first course using ANSI C, LEX and YACC, J. P. Bennett,
2nd edition, McGraw Hill (1996)
Modern Compilation Implementation, A. Appel; Cambridge University Press (1998)
The Essence of Compilers, R. Hunter, Prentice hall (1999)
Compilateurs, D.Grune et all, Dunod (2002)
Crafting a Compiler, C.Fischer, R.LeBlanc, Benjamin Cummings Series (1988)
Autres Cours ESSI
Petit Prcis de Lex. J. Farr; Notes de TP ESSI-2 (1998)
Petit Prcis de Yacc. J. Farr; Notes de TP ESSI-2 (1998)
Cours de Compilation du MIT (format .ppt en Anglais)
lecture3: grammaires, arbres, langages, analyseurs
lecture4: construction SLR
lecture5: construction LR(1)
lecture6: construction LALR(1)
lecture7: smantique statique.
Rfrences bibliographiques
Compilateurs: Principes, techniques et outils, A. Aho, R. Sethi, J. Ullman; InterEditions (1991)
Lex & Yacc, JR Lewine, T. Mason, D. Brown; OReilly & Associates, Inc (1992)
A first course using ANSI C, LEX and YACC, J. P. Bennett,
2nd edition, McGraw Hill (1996)
Modern Compilation Implementation, A. Appel; Cambridge University Press (1998)
The Essence of Compilers, R. Hunter, Prentice hall (1999)
Compilateurs, D.Grune et all, Dunod (2002)
Crafting a Compiler, C.Fischer, R.LeBlanc, Benjamin Cummings Series (1988)
Autres Cours ESSI
Petit Prcis de Lex. J. Farr; Notes de TP ESSI-2 (1998)
Petit Prcis de Yacc. J. Farr; Notes de TP ESSI-2 (1998)
Cours de Compilation du MIT (format .ppt en Anglais)
lecture3: grammaires, arbres, langages, analyseurs
lecture4: construction SLR
lecture5: construction LR(1)
lecture6: construction LALR(1)
lecture7: smantique statique.
3. 3 Chapitre 5Analyse syntaxique descendantemthodes LL(k) Proprit LL(k)
Dterminer si une grammaire est LL(1) ?
Analyseur LL(1)
Gnrateur syntaxique LL(1)
Quelques Environnments de Compilation (compiler- compiler)
Java Compiler Compiler [tm] (JavaCC [tm]) - The Java Parser Generator
http://javacc.java.net/
SYNTAX
http://syntax.gforge.inria.fr/
Free Compiler Construction Tools
http://www.thefreecountry.com/programming/compilerconstruction.shtml
ANTLR, ANother Tool for Language Recognition,
http://www.antlr.org/
The Compiler Generator Coco/R
http://www.ssw.uni-linz.ac.at/Coco/Quelques Environnments de Compilation (compiler- compiler)
Java Compiler Compiler [tm] (JavaCC [tm]) - The Java Parser Generator
http://javacc.java.net/
SYNTAX
http://syntax.gforge.inria.fr/
Free Compiler Construction Tools
http://www.thefreecountry.com/programming/compilerconstruction.shtml
ANTLR, ANother Tool for Language Recognition,
http://www.antlr.org/
The Compiler Generator Coco/R
http://www.ssw.uni-linz.ac.at/Coco/
4. Transparent 4 Proprit LL(k) il existe k? 0 dpendant uniquement de la grammaire tel que:
pour tout mot X analyser dans T*
pour tout A dans N
au plus une rgle A?? de P drive de S en: A?? *? y1 . . . yk T* LL(k)
Lecture du mot de gauche droite(Left to Right)
Drivations gauches (Leftmost)
Proprit LL(k) des grammaires
Notation: pour toute production {A??} d' une grammaire G, on note:
Vuek(A??)={y[k], S ??g uAv ?u?v ?? uyw ?T*,
avec v ?(N ? T)* } ?
Interprtation: Vuek(A??) est l'ensemble des prfixes de longueur k que l'on peut rellement obtenir dans un arbre de drivation, en drivant A??
Dfinition: une grammaire est LL(k) si pour tout non terminal A et pour toute paire de production A?? et A?? :
? ? ? => Vuek(A??) ? Vuek(A??) = ? ?
Proprit: une grammaire LL(k) est LL(k') pour k' > k ?
Grammaire LL(1)
Notation: pour k= 1, on note:
Vue(A??) = Vuek(A??) ?
Principe : Pour dcider si une grammaire est LL(1), il suffit de
savoir construire tous les ensembles Vue(A??) ? T , pour toutes les productions A??
vrifier la proprit de la dfinition ci-dessus.LL(k)
Lecture du mot de gauche droite(Left to Right)
Drivations gauches (Leftmost)
Proprit LL(k) des grammaires
Notation: pour toute production {A??} d' une grammaire G, on note:
Vuek(A??)={y[k], S ??g uAv ?u?v ?? uyw ?T*,
avec v ?(N ? T)* } ?
Interprtation: Vuek(A??) est l'ensemble des prfixes de longueur k que l'on peut rellement obtenir dans un arbre de drivation, en drivant A??
Dfinition: une grammaire est LL(k) si pour tout non terminal A et pour toute paire de production A?? et A?? :
? ? ? => Vuek(A??) ? Vuek(A??) = ? ?
Proprit: une grammaire LL(k) est LL(k') pour k' > k ?
Grammaire LL(1)
Notation: pour k= 1, on note:
Vue(A??) = Vuek(A??) ?
Principe : Pour dcider si une grammaire est LL(1), il suffit de
savoir construire tous les ensembles Vue(A??) ? T , pour toutes les productions A??
vrifier la proprit de la dfinition ci-dessus.
5. Transparent 5 Grammaire non LL() Grammaire INST
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst
endif (r2)
s_d_inst ::= inst ; s_d_inst | inst (r3 r4)
exp ::= var + exp | var = exp | var (r5 r6 r7)
Analyse non LL(k)
if v1= v2 then v3 := v4 + v5 ; if v3= v4 then v5 := v1 = v4 else v3 := v4 end if ; v7 := v8 else v3 := v4 endif
Grammaires LL()
Certaines proprits permettent de dcider facilement si une grammaire est ou n'est pas LL(k)?
Grammaires Rcursives Gauches
Thorme: Une grammaire LL(k) n'est pas rcursive gauche ?
Preuve en TD3
Simples LL(k)
Dfinition: Une grammaire est simple LL(k), not SLL(k), si
toutes les rgles de P sont de la forme Si ? a1.. an ui avec a1.. an ? T+ et ui ? (N u T) *
il existe k >= 0 tel que pour toute paire de rgles
Si ? a1.. an ui et Si ? b1.. bm vi
les mots a1.. an et b1.. bm n'ont pas de prfixe commun de longueur k ?
Thorme: Une grammaire SLL(k) est LL(k) ?
Analyse de la grammaire INST
La grammaire INST n'est pas RG;
Les drivations issues de INST sont SLL(1):
se dcident par "var" ou "if"
Les drivations issues de EXP sont LL(2) (pas SLL(2))
se dcident par "var" "+" ou "var" "=" ou "var" suivi d'un lexme ? diffrent de "+" ou "="
Les drivations issues de S_D_INST ne sont pas LL(k):
pour tout k, il existe des INST plus longues que k
Grammaires LL()
Certaines proprits permettent de dcider facilement si une grammaire est ou n'est pas LL(k)?
Grammaires Rcursives Gauches
Thorme: Une grammaire LL(k) n'est pas rcursive gauche ?
Preuve en TD3
Simples LL(k)
Dfinition: Une grammaire est simple LL(k), not SLL(k), si
toutes les rgles de P sont de la forme Si ? a1.. an ui avec a1.. an ? T+ et ui ? (N u T) *
il existe k >= 0 tel que pour toute paire de rgles
Si ? a1.. an ui et Si ? b1.. bm vi
les mots a1.. an et b1.. bm n'ont pas de prfixe commun de longueur k ?
Thorme: Une grammaire SLL(k) est LL(k) ?
Analyse de la grammaire INST
La grammaire INST n'est pas RG;
Les drivations issues de INST sont SLL(1):
se dcident par "var" ou "if"
Les drivations issues de EXP sont LL(2) (pas SLL(2))
se dcident par "var" "+" ou "var" "=" ou "var" suivi d'un lexme ? diffrent de "+" ou "="
Les drivations issues de S_D_INST ne sont pas LL(k):
pour tout k, il existe des INST plus longues que k
6. Transparent 6 Grammaire LL(1) Grammaire INST'
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_exp ::= + exp | = exp | ? (r7 r8 r9)
Analyse LL(1)
if v1 = v2 then v3 := v4 + v5 ; if v3= v4 then v5 := v1 = v4 else v3 := v4 end if ; v7 := v8 else v3 := v4 endif
Factorisation gauche de la grammaire INST
La grammaire INST' est obtenue par factorisation:
de inst en s_s_inst dans r3 et r4
de var en s_d_exp dans r5, r6, r7
Remarque: Une "bonne" grammaire (factorise gauche et non rcursive gauche) peut n'tre ni SLL(k), ni mme LL(k) pour aucun k ?
Analyse de la grammaire INST '
La grammaire INST n' est pas RG;
Les drivations issues de INST sont SLL(1):
se dcident par "var" ou "if"
Les drivations issues de EXP sont SLL(0)
Les drivations issues de S_D_EXP sont LL(1)
se dcident par "+" ou "=" ou un lexme diffrent de "+" ou "=" ?
Les drivations issues de S_D_INST sont LL(0)
Les drivations issues de S_S_INST sont LL(1)
se dcident par ";" ou un lexme diffrent de ";" ? Factorisation gauche de la grammaire INST
La grammaire INST' est obtenue par factorisation:
de inst en s_s_inst dans r3 et r4
de var en s_d_exp dans r5, r6, r7
Remarque: Une "bonne" grammaire (factorise gauche et non rcursive gauche) peut n'tre ni SLL(k), ni mme LL(k) pour aucun k ?
Analyse de la grammaire INST '
La grammaire INST n' est pas RG;
Les drivations issues de INST sont SLL(1):
se dcident par "var" ou "if"
Les drivations issues de EXP sont SLL(0)
Les drivations issues de S_D_EXP sont LL(1)
se dcident par "+" ou "=" ou un lexme diffrent de "+" ou "=" ?
Les drivations issues de S_D_INST sont LL(0)
Les drivations issues de S_S_INST sont LL(1)
se dcident par ";" ou un lexme diffrent de ";" ?
7. Transparent 7 Code Ada pour un analyseur LL(1) Analyseur pile pour INST'
Lex(ul);
while ul /= EOT() loop
case ul of
"var" => case Som() of
end case;
"if" => case Som() of
end case;
end case;
end loop; Analyseur pile pour une grammaire LL(1)
procedure Analyseur {
Lex(ul);
while ul /= EOT() loop
case ul of
"var" => voir cot
"if" => voir cot
";" => case Som() of
";" =>
S_S_INST => // r4
S_D_EXP => // r9
others => raise ERREUR_de_syntaxe;
end case;
"+" => case Som() of
"+" =>
S_D_EXP => // r7
others => raise ERREUR_de_syntaxe;
end case;
"=" | "then" => comme "+"
"else" | "endif" => comme ";"
end case;
end loop;
}
Analyseur pile pour une grammaire LL(1)
procedure Analyseur {
Lex(ul);
while ul /= EOT() loop
case ul of
"var" => voir cot
"if" => voir cot
";" => case Som() of
";" =>
S_S_INST => // r4
S_D_EXP => // r9
others => raise ERREUR_de_syntaxe;
end case;
"+" => case Som() of
"+" =>
S_D_EXP => // r7
others => raise ERREUR_de_syntaxe;
end case;
"=" | "then" => comme "+"
"else" | "endif" => comme ";"
end case;
end loop;
}
8. Transparent 8 Code Ada pour un analyseur LL(1) Analyseur pile pour INST'
Lex(ul);
while ul /= EOT() loop
case ul of
"var" => case Som() of
"var" => Dep() ; Lex(ul) ;
INST => Dep();Emp(EXP); Emp(":="); Emp("var"); // r1
S_D_INST => Dep(); Emp(S_S_INST); Emp(INST); // r3
EXP => Dep(); Emp(S_D_EXP);
Emp("var"); // r6
others => raise ERREUR_de_syntaxe;
end case;
"if" => case Som() of
"if" => Dep() ; Lex(ul) ;
"INST" => Dep(); Emp( "endif"); Emp(S_D_INST); Emp("else"); Emp(S_D_INST); Emp("then"); Emp(EXP); Emp( "if" ); // r2
S_D_INST => Dep(); Emp(S_S_INST) ; Emp(INST); // r3
others => raise ERREUR_de_syntaxe;
end case;
- - - - - - - Analyseur pile pour une grammaire LL(1)
procedure Analyseur {
Lex(ul);
while ul /= EOT() loop
case ul of
"var" => voir cot
"if" => voir cot
";" => case Som() of
";" =>
S_S_INST => // r4
S_D_EXP => // r9
others => raise ERREUR_de_syntaxe;
end case;
"+" => case Som() of
"+" =>
S_D_EXP => // r7
others => raise ERREUR_de_syntaxe;
end case;
"=" | "then" => comme "+"
"else" | "endif" => comme ";"
end case;
end loop;
}
Analyseur pile pour une grammaire LL(1)
procedure Analyseur {
Lex(ul);
while ul /= EOT() loop
case ul of
"var" => voir cot
"if" => voir cot
";" => case Som() of
";" =>
S_S_INST => // r4
S_D_EXP => // r9
others => raise ERREUR_de_syntaxe;
end case;
"+" => case Som() of
"+" =>
S_D_EXP => // r7
others => raise ERREUR_de_syntaxe;
end case;
"=" | "then" => comme "+"
"else" | "endif" => comme ";"
end case;
end loop;
}
9. Transparent 9 Code Java pour un analyseur LL(1) Analyseur pile pour INST'
Lex(ul) ;
while (ul != EOT() ) {
switch (ul) {
case "var": switch (Som() ) {
} ; break;
case "if" : switch (Som() ){
} ; break;
} } Analyseur pile pour une grammaire LL(1)
procedure Analyseur() {
Lex(ul);
while ( ul != EOT() ) {
switch (ul) {
case "var" : voir cot
case "if" : voir cot
case ";" : switch (Som() ) {
case ";" :
case S_S_INST: // r4
case S_D_EXP : // r9
default: throw new ErreurSyntaxe();
} ; break ;
case "+" : switch (Som() ) {
case "+" :
case S_D_EXP : // r7
default: throw new ErreurSyntaxe();
} ; break ;
case "=" : case "then" : comme "+"
case "else": case "endif" : comme ";"
}
}
}
Analyseur pile pour une grammaire LL(1)
procedure Analyseur() {
Lex(ul);
while ( ul != EOT() ) {
switch (ul) {
case "var" : voir cot
case "if" : voir cot
case ";" : switch (Som() ) {
case ";" :
case S_S_INST: // r4
case S_D_EXP : // r9
default: throw new ErreurSyntaxe();
} ; break ;
case "+" : switch (Som() ) {
case "+" :
case S_D_EXP : // r7
default: throw new ErreurSyntaxe();
} ; break ;
case "=" : case "then" : comme "+"
case "else": case "endif" : comme ";"
}
}
}
10. Transparent 10 Code Java pour un analyseur LL(1) Lex(ul) ;
while (ul != EOT() ) {
switch (ul) {
case "var": switch (Som() ) {
case "var": Dep() ; Lex(ul) ; break ;
case INST: Dep(); Emp(EXP); Emp(":="); Emp("var"); break ; // r1
case S_D_INST: Dep(); Emp(S_S_INST); Emp(INST); break; // r3
case EXP : Dep(); Emp(S_D_EXP); Emp("var"); break ; // r6
default : throw new ErreurSyntaxe();
} ; break;
case "if" : switch (Som() ) {
case "if" : Dep() ; Lex(ul) ; break ;
case "INST": Dep(); Emp( "endif"); Emp(S_D_INST); Emp("else"); Emp(S_D_INST); Emp("then"); Emp(EXP); Emp( "if" ); break ; // r2
case S_D_INST : Dep(); Emp(S_S_INST) ; Emp(INST); break ; // r3
default : throw new ErreurSyntaxe();
} ; break;
} } Analyseur pile pour une grammaire LL(1)
procedure Analyseur() {
Lex(ul);
while ( ul != EOT() ) {
switch (ul) {
case "var" : voir cot
case "if" : voir cot
case ";" : switch (Som() ) {
case ";" :
case S_S_INST: // r4
case S_D_EXP : // r9
default: throw new ErreurSyntaxe();
} ; break ;
case "+" : switch (Som() ) {
case "+" :
case S_D_EXP : // r7
default: throw new ErreurSyntaxe();
} ; break ;
case "=" : case "then" : comme "+"
case "else": case "endif" : comme ";"
}
}
}
Analyseur pile pour une grammaire LL(1)
procedure Analyseur() {
Lex(ul);
while ( ul != EOT() ) {
switch (ul) {
case "var" : voir cot
case "if" : voir cot
case ";" : switch (Som() ) {
case ";" :
case S_S_INST: // r4
case S_D_EXP : // r9
default: throw new ErreurSyntaxe();
} ; break ;
case "+" : switch (Som() ) {
case "+" :
case S_D_EXP : // r7
default: throw new ErreurSyntaxe();
} ; break ;
case "=" : case "then" : comme "+"
case "else": case "endif" : comme ";"
}
}
}
11. Transparent 11 Analyseur rcursif LL(1) proc INST(ul) {
switch( ul ) {
case "var" :
break;
case "if" :
break;
default : throw new ErreurSyntaxe();
} }
proc EXP(ul) {
switch( ul ) {
case "var" :
break;
default : throw new ErreurSyntaxe();
} }
proc S_D_INST(ul) {
switch( ul ) {
case "var" : case"if" :
break;
default : throw new ErreurSyntaxe();
} }
Analyseur pour une grammaire LL(1)
proc scan(ul, term) { if (ul = term) Lex(ul) ;
else throw new ErreurSyntaxe();}
proc INST(ul); voir cot
proc EXP(ul) ; voir cot
proc S_D_INST(ul) voir cot
proc S_S_INST(ul) {
switch ( ul) {
case ";": scan(ul, ";" ); S_D_INST(ul) ; break ; // r4
case"else": case "endif": case ";" : break; // r5
default: throw new ErreurSyntaxe();
}
}
proc S_D_EXP(ul) {
switch ( ul) {
case "+": scan(ul, "+" ); EXP(ul) ; break; // r7
case "=" : scan(ul, "=" ); EXP(ul) ; break; // r8
cas "then": case"else": case"endif": case";": break; // r9
default: throw new ErreurSyntaxe();
}
}
Analyseur pour une grammaire LL(1)
proc scan(ul, term) { if (ul = term) Lex(ul) ;
else throw new ErreurSyntaxe();}
proc INST(ul); voir cot
proc EXP(ul) ; voir cot
proc S_D_INST(ul) voir cot
proc S_S_INST(ul) {
switch ( ul) {
case ";": scan(ul, ";" ); S_D_INST(ul) ; break ; // r4
case"else": case "endif": case ";" : break; // r5
default: throw new ErreurSyntaxe();
}
}
proc S_D_EXP(ul) {
switch ( ul) {
case "+": scan(ul, "+" ); EXP(ul) ; break; // r7
case "=" : scan(ul, "=" ); EXP(ul) ; break; // r8
cas "then": case"else": case"endif": case";": break; // r9
default: throw new ErreurSyntaxe();
}
}
12. Transparent 12 Analyseur rcursif LL(1) proc INST(ul) {
switch( ul ) {
case "var" : scan(ul, "var" ); scan(ul, ":=" );
EXP(ul) ; break; // r1
case "if" : scan(ul, "if" ); EXP(ul) ;
scan(ul, "then" ); S_D_INST(ul);
scan(ul, "else" ); S_D_INST(ul);
scan(ul, "endif" ); break; // r2
default : throw new ErreurSyntaxe();
} }
proc EXP(ul) {
switch( ul ) {
case "var": scan(ul, "var" ); S_D_EXP(ul) ; break; // r6
default : throw new ErreurSyntaxe();
} }
proc S_D_INST(ul) {
switch( ul ) {
case "var": case"if": INST (ul); S_S_INST (ul); break; // r3
default : throw new ErreurSyntaxe();
} }
Analyseur pour une grammaire LL(1)
proc scan(ul, term) { if (ul = term) Lex(ul) ;
else throw new ErreurSyntaxe();}
proc INST(ul); voir cot
proc EXP(ul) ; voir cot
proc S_D_INST(ul) voir cot
proc S_S_INST(ul) {
switch ( ul) {
case ";": scan(ul, ";" ); S_D_INST(ul) ; break ; // r4
case"else": case "endif": case ";" : break; // r5
default: throw new ErreurSyntaxe();
}
}
proc S_D_EXP(ul) {
switch ( ul) {
case "+": scan(ul, "+" ); EXP(ul) ; break; // r7
case "=" : scan(ul, "=" ); EXP(ul) ; break; // r8
case"then": case"else": cas "endif": case";": break; // r9
default: throw new ErreurSyntaxe();
}
}
Analyseur pour une grammaire LL(1)
proc scan(ul, term) { if (ul = term) Lex(ul) ;
else throw new ErreurSyntaxe();}
proc INST(ul); voir cot
proc EXP(ul) ; voir cot
proc S_D_INST(ul) voir cot
proc S_S_INST(ul) {
switch ( ul) {
case ";": scan(ul, ";" ); S_D_INST(ul) ; break ; // r4
case"else": case "endif": case ";" : break; // r5
default: throw new ErreurSyntaxe();
}
}
proc S_D_EXP(ul) {
switch ( ul) {
case "+": scan(ul, "+" ); EXP(ul) ; break; // r7
case "=" : scan(ul, "=" ); EXP(ul) ; break; // r8
case"then": case"else": cas "endif": case";": break; // r9
default: throw new ErreurSyntaxe();
}
}
13. Transparent 13 PREMIER() Calcul de Prem(X)
si x ? T alors Prem(x) = {x}
si {X ? ?} ? P alors ? ? Prem(X)
si X ? N et {X ? Y1 ..Yi..Yn } ? P alors calculer la clture des rgles suivantes:
Prem(Y1) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1.. i-1
alors Prem(Yi) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1 .. n
alors ? ? Prem(X)
Calcul de Prem(X1 XjXn):
Prem(X1) - ? ? Prem(X1 XjXn)
si ? ? Prem(Xj) pour j = 1 .. i-1
alors Prem(Xj) - ? ? Prem(X1 XjXn)
si ? ? Prem(Xj) pour j = 1 .. n
alors ? ? Prem(X1 XjXn)
Les Premiers dans une grammaire (ici de longueur 1)
Notation: pour tout ? ?(N ?T)+, on note:
Prem(? ) = { a ?T si ? ?? a w
avec w ? (N ?T)?,
et ? si ? ?? ? } ?
Interprtation: Prem(?) est l'ensemble des premiers symboles terminaux de tous les mots que l'on peut driver partir de ? ( partir de l'axiome ou non !)
Proprit: si une grammaire G ne contient pas de ?-production (rgle A? ?):
Vue(A? ?) = Prem(?[1]) ?
Exemple: si ? = RSw et R?? ? P :
alors Vue(A? ? ) ? Prem(R) et Prem(S)
Gnralisation: Premiers de longueur k
Premk(? ) = { a ?Tk si ? ?? a w
avec w ? (N ?T)?,
et ? si ? ?? ? } ?
Les Premiers dans une grammaire (ici de longueur 1)
Notation: pour tout ? ?(N ?T)+, on note:
Prem(? ) = { a ?T si ? ?? a w
avec w ? (N ?T)?,
et ? si ? ?? ? } ?
Interprtation: Prem(?) est l'ensemble des premiers symboles terminaux de tous les mots que l'on peut driver partir de ? ( partir de l'axiome ou non !)
Proprit: si une grammaire G ne contient pas de ?-production (rgle A? ?):
Vue(A? ?) = Prem(?[1]) ?
Exemple: si ? = RSw et R?? ? P :
alors Vue(A? ? ) ? Prem(R) et Prem(S)
Gnralisation: Premiers de longueur k
Premk(? ) = { a ?Tk si ? ?? a w
avec w ? (N ?T)?,
et ? si ? ?? ? } ?
14. Transparent 14 PREMIERs de EE'TT'F
Cloture
Les premiers dans une grammaire
si {X ? Y1 ..Yi..Yn } ? P
Prem(Y1) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1.. i-1
alors Prem(Yi) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1 .. n
alors ? ? Prem(X)
Les Premiers pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | id
Les premiers dans une grammaire
si {X ? Y1 ..Yi..Yn } ? P
Prem(Y1) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1.. i-1
alors Prem(Yi) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1 .. n
alors ? ? Prem(X)
Les Premiers pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | id
15. Transparent 15 PREMIERs de EE'TT'F
Cloture
T ? FT'
E ? TE'
{X ? ?Y?}
et
??Prem(?) Les premiers dans une grammaire
si {X ? Y1 ..Yi..Yn } ? P
Prem(Y1) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1.. i-1
alors Prem(Yi) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1 .. n
alors ? ? Prem(X)
Les Premiers pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | var
Prem(F) = { ( ,var }
Prem(E') = { + , ? }
Prem(T') = { * , ? }
Prem(E, T, F) = { ( ,var }
Les premiers dans une grammaire
si {X ? Y1 ..Yi..Yn } ? P
Prem(Y1) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1.. i-1
alors Prem(Yi) - ? ? Prem(X)
si ? ? Prem(Yj) pour j = 1 .. n
alors ? ? Prem(X)
Les Premiers pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | var
Prem(F) = { ( ,var }
Prem(E') = { + , ? }
Prem(T') = { * , ? }
Prem(E, T, F) = { ( ,var }
16. Transparent 16 SUIVANT() Calcul de Suiv(X)
si S est l'axiome alors # ? Suiv(S)
si A et B ? N et x ? T et {A ? ?Bx} ? P
alors x ? Suiv(B)
si {A ? ?B?} ? P
alors Prem(?) - ? ? Suiv(B)
calculer la clture des rgles suivantes:
si {A ? ?B} ? P
alors Suiv(A) ? Suiv(B)
si {A ? ?B?} ? P et ? ? Prem(?)
alors Suiv(A) ? Suiv(B)
Les suivants dans une grammaire (ici de longueur 1)
Notation: pour tout A ?N, on note:
Suiv(A) = {a?T? #, S#??uAav avec uv?(N ? T)? } ?
Interprtation: Suiv(A) est l'ensemble des symboles terminaux qui peuvent suivre immdiatement A dans une drivation partir de l'axiome.
Proprit: soit A? ? une production d'une grammaire G:
Vue(A? ? ) =Prem(?) ? Suiv(A) si ? ?? ?
Vue(A? ? ) =Prem(?) sinon ?
Calcul des suivants dans une grammaire
Notation: pour tout ? ?(N ?T)+, on note:
Fin(? ) = {X ? N, ? ?? ? X avec ? ? (N ? T)? } ?
Interprtation: Fin(? ) est l'ensemble des non terminaux qui peuvent terminer une drivation issue de ?
Proprit: x ? T, x ? Suiv(A) <=> il existe X? ?? ? P
tel que A ? Fin(?) et x ? Prem(? ) ?
Dcidabilit de la proprit LL(1)
Thorme: Pour dcider si une grammaire est LL(1) il suffit de calculer les ensembles Prem() et Suiv() et de tester la proprit sur Vue sur l'ensemble des rgles de production :
pour toute paire de production A? ? et A? ? , ? ? ?
si ? ?? ? => ( Prem(?) ? Suiv(A) ) ? Prem(?) = ?
si ? ?? ? => Prem(?) ? ( Prem(?) ? Suiv(A) ) = ?
si ni ?, ni ? ?? ? => Prem(?) ? Prem(?) = ?
sinon ?, et ? ?? ? => pas LL(1) ?Les suivants dans une grammaire (ici de longueur 1)
Notation: pour tout A ?N, on note:
Suiv(A) = {a?T? #, S#??uAav avec uv?(N ? T)? } ?
Interprtation: Suiv(A) est l'ensemble des symboles terminaux qui peuvent suivre immdiatement A dans une drivation partir de l'axiome.
Proprit: soit A? ? une production d'une grammaire G:
Vue(A? ? ) =Prem(?) ? Suiv(A) si ? ?? ?
Vue(A? ? ) =Prem(?) sinon ?
Calcul des suivants dans une grammaire
Notation: pour tout ? ?(N ?T)+, on note:
Fin(? ) = {X ? N, ? ?? ? X avec ? ? (N ? T)? } ?
Interprtation: Fin(? ) est l'ensemble des non terminaux qui peuvent terminer une drivation issue de ?
Proprit: x ? T, x ? Suiv(A) <=> il existe X? ?? ? P
tel que A ? Fin(?) et x ? Prem(? ) ?
Dcidabilit de la proprit LL(1)
Thorme: Pour dcider si une grammaire est LL(1) il suffit de calculer les ensembles Prem() et Suiv() et de tester la proprit sur Vue sur l'ensemble des rgles de production :
pour toute paire de production A? ? et A? ? , ? ? ?
si ? ?? ? => ( Prem(?) ? Suiv(A) ) ? Prem(?) = ?
si ? ?? ? => Prem(?) ? ( Prem(?) ? Suiv(A) ) = ?
si ni ?, ni ? ?? ? => Prem(?) ? Prem(?) = ?
sinon ?, et ? ?? ? => pas LL(1) ?
17. Transparent 17 SUIVANTs de EE'TT'F
Cloture
E ? TE'
T ? FT'
E ? TE'
??Prem(E')
T ? FT'
??Prem(T') Suivant()
calculer la clture des rgles suivantes:
si {A ? ?B?} ? P
alors Prem(?) - ? ? Suiv(B)
si {A ? ?B} ? P
alors Suiv(A) ? Suiv(B)
si {A ? ?B?} ? P et ? ? Prem(?)
alors Suiv(A) ? Suiv(B)
Calcul de Suiv() pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | id
Prem(F) = { ( ,var }
Prem(E') = { + , ? }
Prem(T') = { * , ? }
Prem(E, T, F) = { ( ,var }
Suivant()
calculer la clture des rgles suivantes:
si {A ? ?B?} ? P
alors Prem(?) - ? ? Suiv(B)
si {A ? ?B} ? P
alors Suiv(A) ? Suiv(B)
si {A ? ?B?} ? P et ? ? Prem(?)
alors Suiv(A) ? Suiv(B)
Calcul de Suiv() pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | id
Prem(F) = { ( ,var }
Prem(E') = { + , ? }
Prem(T') = { * , ? }
Prem(E, T, F) = { ( ,var }
18. Transparent 18 SUIVANTs de EE'TT'F
Cloture
E ? TE'
T ? FT'
E ? TE'
??Prem(E')
T ? FT'
??Prem(T') Suivant()
calculer la clture des rgles suivantes:
si {A ? ?B?} ? P
alors Prem(?) - ? ? Suiv(B)
si {A ? ?B} ? P
alors Suiv(A) ? Suiv(B)
si {A ? ?B?} ? P et ? ? Prem(?)
alors Suiv(A) ? Suiv(B)
Calcul de Suiv() pour EE'TT'F:
(r0) E0 ? E #
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | id
Prem(F) = { ( ,var }
Prem(E') = { + , ? }
Prem(T') = { * , ? }
Prem(E, T, F) = { ( ,var }
Suiv(E) = Suiv(E') = { ) , # }
Suiv(T) = Suiv(T') = {+ ,) , # }
Suiv(F) = { *, + ,) , # } Suivant()
calculer la clture des rgles suivantes:
si {A ? ?B?} ? P
alors Prem(?) - ? ? Suiv(B)
si {A ? ?B} ? P
alors Suiv(A) ? Suiv(B)
si {A ? ?B?} ? P et ? ? Prem(?)
alors Suiv(A) ? Suiv(B)
Calcul de Suiv() pour EE'TT'F:
(r0) E0 ? E #
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | id
Prem(F) = { ( ,var }
Prem(E') = { + , ? }
Prem(T') = { * , ? }
Prem(E, T, F) = { ( ,var }
Suiv(E) = Suiv(E') = { ) , # }
Suiv(T) = Suiv(T') = {+ ,) , # }
Suiv(F) = { *, + ,) , # }
19. Transparent 19 Gnration des Tables LL(1)
pour chaque {A ? ?} ? P {
pour chaque a ? T, a ? Prem(?) {
M[A, a] += {A ? ?} }
si ? ? Prem(?) alors {
pour chaque b ? T, b ? Suiv(A) {
M[A, b] += {A ? ?} }
si # ? Suiv(A) alors M[A, #] += {A ? ?}
}
}
toute entre non dfinie dans M est une "erreur"
M[$, #] = "accepter"
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
20. Transparent 20 Table LL(1) pour EE'TT'F PREMIERS
SUIVANTS
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | var
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | var
21. Transparent 21 Table LL(1) pour EE'TT'F PREMIERS
Prem(E) = Prem(T) = Prem(F) = { var , ( }
Prem(E') = { +, ? }
Prem(T') = { *, ? }
SUIVANTS
Suiv(E) = Suiv(E') = { ) , # }
Suiv(T) = Suiv(T') = {+ ,) ,# }
Suiv(F) = { *, + ,) , #}
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | var
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour EE'TT'F:
(r1) E ? T E'
(r2, r3) E' ? + T E' | ?
(r4) T ? F T'
(r5, r6) T' ? * F T' | ?
(r7, r8) F ? ( E ) | var
22. Transparent 22 Table LL(1) pour INST'
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour INST'
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_exp ::= + exp | = exp | ? (r7 r8 r9)
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour INST'
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_exp ::= + exp | = exp | ? (r7 r8 r9)
23. Transparent 23 Table LL(1) pour INST'
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour INST'
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_exp ::= + exp | = exp | ? (r7 r8 r9)
Construction des Tables LL(1)
Donnes: une grammaire G, suppose LL(1).
La construction permet de vrifier la proprit
Rsultat: une table d'analyse LL(1) pour un analyseur prdictif
Mthode: Prem() et Suiv() permettent de construire une table d'analyse M pour un analyseur prdictif
M : (N ? {$}) x (T ? {#}) ? P ? {erreur, accepter}
Proprit: La grammaire est LL(1) ssi M[A, a] contient au plus une action pour tout A et a?
Table LL(1) pour INST'
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_exp ::= + exp | = exp | ? (r7 r8 r9)
24. Transparent 24 Analyse descendante LL(1) Source ?
if v1= v2 then v3 := v4 + v5 ; if v3= v4 then v5 := v1= v4 else v3 := v4 endif ; v7 := v8 else v3 := v4 endif #
Grammaire INST aprs factorisation gauche
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_ exp ::= + exp | = exp | ? (r7 r8 r9)
Analyse LL(1) du source
if v1= v2 then v3 := v4 + v5 ;
if v3= v4 then v5 := v1= v4 else v3 := v4 endif ;
v7 := v8 else v3 := v4 endif #Grammaire INST aprs factorisation gauche
inst ::= var := exp (r1)
inst ::= if exp then s_d_inst else s_d_inst endif (r2)
s_d_inst ::= inst s_s_inst (r3)
s_s_inst ::= ; s_d_inst | ? (r4 r5)
exp ::= var s_d_exp (r6)
s_d_ exp ::= + exp | = exp | ? (r7 r8 r9)
Analyse LL(1) du source
if v1= v2 then v3 := v4 + v5 ;
if v3= v4 then v5 := v1= v4 else v3 := v4 endif ;
v7 := v8 else v3 := v4 endif #
25. Transparent 25 Analyseur gnrique LL(1) Actions
procedure Action(u: LEX; X: N_ou_T) {
if (X = u ) { Dep(X) ; Lex(u) ; }
else switch (M(u, X)) {
case "A ? ? " : Dep(X) ; Emp(miroir(? )) ; break ;
case "A ? ?" : Dep(X) ; break ;
case "succs" : break ;
case "erreur" : throw new Erreur() ;
}
}
Analyseur
function Analyse() {
Lex(ul);
Emp(Axiome);
while (ul != "#") { Action(ul, Som()) ; }
return succes ;
} Dcidabilit sur les grammaires LL()
Thorme: La proprit LL(k) d'une grammaire est indcidable (pour k non fix) ?
Corollaire: Il n'existe pas d'algorithme permettant de transformer une grammaire quelconque en une grammaire quivalente LL(k) ; mais on peut toujours essayer sur une grammaire donne!
Thorme: Une grammaire LL(1) est non ambigu
preuve: d'aprs la proprit LL(1) il ne peut exister deux drivations distinctes pour deux mots identiques ?
gnralisation: ce rsultat est vrai pour les grammaires LL(k) ?
Complexit de l'analyse LL()
Thorme: Le test LL(1) et la construction de la table d'analyse est en O( |P|*|T|*|N| )
preuve: d'aprs le calcul de Prem() et Suiv() et la construction prcdente ?
gnralisation: ce rsultat est vrai pour l'analyse LL(k) ?
Thorme: L'analyse LL(1) d'un mot m est en O(|m|)
preuve: directement d'aprs le code ci-contre ?
gnralisation: ce rsultat est vrai pour l'analyse LL(k) ?
Langages LL()
Thorme: La proprit LL(k) d'un langage est indcidable (pour k non fix) ?
Thorme: LL(1) ?... ? LL(k) ? ALG DETERMINISTE ?
Dcidabilit sur les grammaires LL()
Thorme: La proprit LL(k) d'une grammaire est indcidable (pour k non fix) ?
Corollaire: Il n'existe pas d'algorithme permettant de transformer une grammaire quelconque en une grammaire quivalente LL(k) ; mais on peut toujours essayer sur une grammaire donne!
Thorme: Une grammaire LL(1) est non ambigu
preuve: d'aprs la proprit LL(1) il ne peut exister deux drivations distinctes pour deux mots identiques ?
gnralisation: ce rsultat est vrai pour les grammaires LL(k) ?
Complexit de l'analyse LL()
Thorme: Le test LL(1) et la construction de la table d'analyse est en O( |P|*|T|*|N| )
preuve: d'aprs le calcul de Prem() et Suiv() et la construction prcdente ?
gnralisation: ce rsultat est vrai pour l'analyse LL(k) ?
Thorme: L'analyse LL(1) d'un mot m est en O(|m|)
preuve: directement d'aprs le code ci-contre ?
gnralisation: ce rsultat est vrai pour l'analyse LL(k) ?
Langages LL()
Thorme: La proprit LL(k) d'un langage est indcidable (pour k non fix) ?
Thorme: LL(1) ?... ? LL(k) ? ALG DETERMINISTE ?
26. 26 Chapitre 6Analyse syntaxique ascendantemthodes LR(k) Analyse Ascendante
Proprit LR(k)
Grammaire SLR, LR(1), LALR(1)
Analyseur LR(1)
Gnrateur syntaxique LR(1)
27. Transparent 27 Analyse Ascendante Principe
le mot x analyser dans T* est lu une seule fois de gauche droite
on construit un arbre de drivation en montant des feuilles (= x ) vers la racine = axiome
Mthode par dcalage ou rduction
rduire par une drivation droite inverse
se dcaler sur X Principe de l'Analyse Ascendante
le mot X analyser dans T* est lu une seule fois de gauche droite
on construit un arbre de drivation en montant des feuilles (mot des feuilles = X) vers la racine=axiome en assemblant des sous arbres d'analyse
on "remonte" les drivations en utilisant les rgles A?? de P de la droite vers la gauche (Pile), cad ? (au Sommet) est rduit en A: on dit que l'on rduit ?
Mthode dcalage-rduction
on gre un mot w dans (N ? T)+ comme le mot des racines des sous arbres d'analyse dj construits pris de gauche droite
lorsque w = u o u ? (N ? T)* et P ne contient pas de rgle A?u , l'analyseur avance dans la lecture de X la lettre suivante x et donc w = u x
lorsque w = u? o u ? (N ? T)* et ? est une partie droite de rgles A?? dans P (plusieurs ? possibles, car dcomposition de w = u? non unique) , l'analyseur doit pouvoir dcider:
s'il y a lieu de rduire w en uA et par quelle rgle de P ?
s'il y a lieu d'avancer dans la lecture du mot X la lettre suivante x et donc w = u? x
Proprit: la suite de drivations utilises pour rduire un mot X correspond la suite inverse des drivations les + droites (Rightmost) pour produire XPrincipe de l'Analyse Ascendante
le mot X analyser dans T* est lu une seule fois de gauche droite
on construit un arbre de drivation en montant des feuilles (mot des feuilles = X) vers la racine=axiome en assemblant des sous arbres d'analyse
on "remonte" les drivations en utilisant les rgles A?? de P de la droite vers la gauche (Pile), cad ? (au Sommet) est rduit en A: on dit que l'on rduit ?
Mthode dcalage-rduction
on gre un mot w dans (N ? T)+ comme le mot des racines des sous arbres d'analyse dj construits pris de gauche droite
lorsque w = u o u ? (N ? T)* et P ne contient pas de rgle A?u , l'analyseur avance dans la lecture de X la lettre suivante x et donc w = u x
lorsque w = u? o u ? (N ? T)* et ? est une partie droite de rgles A?? dans P (plusieurs ? possibles, car dcomposition de w = u? non unique) , l'analyseur doit pouvoir dcider:
s'il y a lieu de rduire w en uA et par quelle rgle de P ?
s'il y a lieu d'avancer dans la lecture du mot X la lettre suivante x et donc w = u? x
Proprit: la suite de drivations utilises pour rduire un mot X correspond la suite inverse des drivations les + droites (Rightmost) pour produire X
28. Transparent 28 Analyse Ascendante Dterministe Grammaire ETF
E ::= E + T | T (r1 r2)
T ::= T * F | F (r3 r4)
F ::= var | ( E ) (r5 r6)
Analyse dterministe?
v1 + v2 * v3 v1 + v2 * v3 v1 + v2 * v3
Suite de drivations et Analyse
Drivations gauches:
E ?g E + T ?g T + T ?g F + T ?g v1 + T ?g
v1 + T * F ?g v1 + F * F ?g v1 + v2 * F ?g
v1 + v2 * v3
Drivations droites:
E ?d E + T ?d E + T * F ?d E + T * v3 ?d
E + F * v3 ?d E + v2 * v3 ?d
T + v2 * v3 ?d F + v2 * v3 ?d v1 + v2 * v3
Manche (traduction pour "handle")
Dfinition: ? ? (N ? T)* est une forme sententielle droite (fsd) dans une grammaire G si S *?d ? ?
Dfinition: ? ? (N ? T)* est appel manche dans une fsd ? si
? = g ? x o x ? T* et g A x est une fsd avec A?? ? P
Les Manches (des fsg et fsd) sont souligns dans les drivations ci-dessus ?
Gnration ou Analyse "descendante" d'un mot: on "descend" les drivations gauches; v1 est le premier manche ?T* produit et v3 le dernier ; en symtrisant la dfinition de manche pour d'une fsg: le manche est prcd d'un mot terminal ?T* et provient d'une fsg
Analyse "ascendante" d'un mot: on "remonte" les drivations droites o v3 est le premier manche ?T* rduit et v1 le dernier; le manche est suivi d'un mot terminal ?T* et provient d'une fsdSuite de drivations et Analyse
Drivations gauches:
E ?g E + T ?g T + T ?g F + T ?g v1 + T ?g
v1 + T * F ?g v1 + F * F ?g v1 + v2 * F ?g
v1 + v2 * v3
Drivations droites:
E ?d E + T ?d E + T * F ?d E + T * v3 ?d
E + F * v3 ?d E + v2 * v3 ?d
T + v2 * v3 ?d F + v2 * v3 ?d v1 + v2 * v3
Manche (traduction pour "handle")
Dfinition: ? ? (N ? T)* est une forme sententielle droite (fsd) dans une grammaire G si S *?d ? ?
Dfinition: ? ? (N ? T)* est appel manche dans une fsd ? si
? = g ? x o x ? T* et g A x est une fsd avec A?? ? P
Les Manches (des fsg et fsd) sont souligns dans les drivations ci-dessus ?
Gnration ou Analyse "descendante" d'un mot: on "descend" les drivations gauches; v1 est le premier manche ?T* produit et v3 le dernier ; en symtrisant la dfinition de manche pour d'une fsg: le manche est prcd d'un mot terminal ?T* et provient d'une fsg
Analyse "ascendante" d'un mot: on "remonte" les drivations droites o v3 est le premier manche ?T* rduit et v1 le dernier; le manche est suivi d'un mot terminal ?T* et provient d'une fsd
29. Transparent 29 Un manche ou LE manche ? Grammaire ambigu des expressions
E ::= E + E | E * E (r1 r2)
E ::= var | ( E ) (r3 r4)
Des Manches diffrents
v1 + v2 * v3 v1 + v2 * v3
Un Manche ou LE Manche ?
Proprit: si une grammaire est non ambigu, toute fsd a exactement un manche ?
Exemple d'ambigut: Deux Drivations droites distinctes:
E ?d E + E ?d E + E * E ?d E + E * v3 ?d
E + v2 * v3 ?d
v1 + v2 * v3
E ?d E * E ?d E * v3 ?d
E + E * v3 ?d E + v2 * v3 ?d
v1 + v2 * v3
Un Manche ou LE Manche ?
Proprit: si une grammaire est non ambigu, toute fsd a exactement un manche ?
Exemple d'ambigut: Deux Drivations droites distinctes:
E ?d E + E ?d E + E * E ?d E + E * v3 ?d
E + v2 * v3 ?d
v1 + v2 * v3
E ?d E * E ?d E * v3 ?d
E + E * v3 ?d E + v2 * v3 ?d
v1 + v2 * v3
30. Transparent 30 Analyseur par Dcalage-Rduction Schma simplifi Analyseur par Dcalage - Rduction
Dfinition: un ADR pour une grammaire G se compose de :
un tampon d'entre pour les lexmes dans T*, termin par #
une pile M de symboles dans (N ? T)*, initialement vide.
une sortie pour produire la drivation (ou l'arbre de)
une table A gnre pour G, avec 4 actions {M} ? { D, R, ac, er}
Dcaler "shift":
empile dans M le symbole courant de l'entre
avancer d'un symbole en entre
Rduire "reduce":
dpiler le manche dans M (p symboles en sommet de pile)
empile dans M le non terminal de la rduction du manche
Accepter:
si M contient l'axiome et que l'entre contient #
Erreur:
si pas d'action prvue dans A
un analyseur indpendant de la grammaire G excutant A en boucle, jusqu' Accepter ou Erreur ?
Conflits pour un ADR
L'implmentation d'un ADR consiste rgler deux sortes de choix :
conflit dcaler ou rduire ("shift/reduce" terminologie Yacc)
conflit rduire r1 ou rduire r2 ("reduce/reduce" sous Yacc)
Divers ADRs:
analyseurs LR(k), LALR(k) , SLR(k)
analyseurs par prcdence d'oprateurs
Analyseur par Dcalage - Rduction
Dfinition: un ADR pour une grammaire G se compose de :
un tampon d'entre pour les lexmes dans T*, termin par #
une pile M de symboles dans (N ? T)*, initialement vide.
une sortie pour produire la drivation (ou l'arbre de)
une table A gnre pour G, avec 4 actions {M} ? { D, R, ac, er}
Dcaler "shift":
empile dans M le symbole courant de l'entre
avancer d'un symbole en entre
Rduire "reduce":
dpiler le manche dans M (p symboles en sommet de pile)
empile dans M le non terminal de la rduction du manche
Accepter:
si M contient l'axiome et que l'entre contient #
Erreur:
si pas d'action prvue dans A
un analyseur indpendant de la grammaire G excutant A en boucle, jusqu' Accepter ou Erreur ?
Conflits pour un ADR
L'implmentation d'un ADR consiste rgler deux sortes de choix :
conflit dcaler ou rduire ("shift/reduce" terminologie Yacc)
conflit rduire r1 ou rduire r2 ("reduce/reduce" sous Yacc)
Divers ADRs:
analyseurs LR(k), LALR(k) , SLR(k)
analyseurs par prcdence d'oprateurs
31. Transparent 31 Analyse par dcalage-rduction dans ETF Source dans ETF
v1 + v2 * v3 #
Analyse ADR
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Analyse ADR
"remonter" la drivation droite:
E ?d E + T ?d E + T * F ?d
E + T * v3 ?d E + F * v3 ?d
E + v2 * v3 ?d T + v2 * v3 ?d F + v2 * v3 ?d
v1 + v2 * v3
Les conflits se rsolvent comme suit:
rduire v1 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var +
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F +
rduire T par r2 (au lieu de dcaler), car il n'existe pas de manche contenant T +
rduire v2 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var *
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F *
rduire v3 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var #
rduire T*F par r3 (au lieu de dcaler), car il n'existe pas de manche contenant T*F #
rduire E+T par r1 (au lieu de dcaler), car il n'existe pas de manche contenant E+T #
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Analyse ADR
"remonter" la drivation droite:
E ?d E + T ?d E + T * F ?d
E + T * v3 ?d E + F * v3 ?d
E + v2 * v3 ?d T + v2 * v3 ?d F + v2 * v3 ?d
v1 + v2 * v3
Les conflits se rsolvent comme suit:
rduire v1 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var +
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F +
rduire T par r2 (au lieu de dcaler), car il n'existe pas de manche contenant T +
rduire v2 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var *
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F *
rduire v3 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var #
rduire T*F par r3 (au lieu de dcaler), car il n'existe pas de manche contenant T*F #
rduire E+T par r1 (au lieu de dcaler), car il n'existe pas de manche contenant E+T #
32. Transparent 32 Analyse par dcalage-rduction dans ETF Source dans ETF
v1 + v2 * v3 #
Analyse ADR
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Analyse ADR
Le tableau ci-contre donne les tats successifs d'un analyseur ADR pour le mot : v1 + v2 * v3 # . On "remonte" la drivation droite:
E ?d E + T ?d E + T * F ?d
E + T * v3 ?d E + F * v3 ?d
E + v2 * v3 ?d T + v2 * v3 ?d F + v2 * v3 ?d
v1 + v2 * v3
Les conflits ont t rsolus comme suit:
rduire v1 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var +
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F +
rduire T par r2 (au lieu de dcaler), car il n'existe pas de manche contenant T +
rduire v2 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var *
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F *
rduire v3 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var #
rduire T*F par r3 (au lieu de dcaler), car il n'existe pas de manche contenant T*F #
rduire E+T par r1 (au lieu de dcaler), car il n'existe pas de manche contenant E+T #
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Analyse ADR
Le tableau ci-contre donne les tats successifs d'un analyseur ADR pour le mot : v1 + v2 * v3 # . On "remonte" la drivation droite:
E ?d E + T ?d E + T * F ?d
E + T * v3 ?d E + F * v3 ?d
E + v2 * v3 ?d T + v2 * v3 ?d F + v2 * v3 ?d
v1 + v2 * v3
Les conflits ont t rsolus comme suit:
rduire v1 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var +
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F +
rduire T par r2 (au lieu de dcaler), car il n'existe pas de manche contenant T +
rduire v2 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var *
rduire F par r4 (au lieu de dcaler), car il n'existe pas de manche contenant F *
rduire v3 par r5 (au lieu de dcaler), car il n'existe pas de manche contenant var #
rduire T*F par r3 (au lieu de dcaler), car il n'existe pas de manche contenant T*F #
rduire E+T par r1 (au lieu de dcaler), car il n'existe pas de manche contenant E+T #
33. Transparent 33 Proprit LR(k) il existe k? 0 dpendant uniquement de la grammaire tel que:
pour tout mot X analyser dans T*
pour toute fsd F= ? ? a w dans (N ? T)* et tout manche ?
il existe au plus une rgle A? ? dans P telle que ? A a w est une fsd Intitul LR(k)
Lecture du mot de gauche droite("Left to Right")
Drivations (les + ) droites ("Rightmost")
Proprit LR(k) des grammaires
Dfinition: une grammaire est LR(k) ssi pour
?, ?, ?, ? ?(N ? T)*; A, B ?N ; a ?Tk ; w, w'? T*
si S *?d ? A aw ?d ? ? a w
et si S *?d ? B w' ?d ? ?' w' = ? ? a ?
alors A=B , ? =?' , ? = ? et w'=a ?
Note: ? est un manche des deux fsd ? ? aw et ? ?' w' ?
Proprit: une grammaire LR(k) est LR(k') pour k' > k ?
Grammaire LR(1)
La dfinition prcdente donne celle des:
LR(0) en prenant a = ?
LR(1) en prenant a ?T ?
Intitul LR(k)
Lecture du mot de gauche droite("Left to Right")
Drivations (les + ) droites ("Rightmost")
Proprit LR(k) des grammaires
Dfinition: une grammaire est LR(k) ssi pour
?, ?, ?, ? ?(N ? T)*; A, B ?N ; a ?Tk ; w, w'? T*
si S *?d ? A aw ?d ? ? a w
et si S *?d ? B w' ?d ? ?' w' = ? ? a ?
alors A=B , ? =?' , ? = ? et w'=a ?
Note: ? est un manche des deux fsd ? ? aw et ? ?' w' ?
Proprit: une grammaire LR(k) est LR(k') pour k' > k ?
Grammaire LR(1)
La dfinition prcdente donne celle des:
LR(0) en prenant a = ?
LR(1) en prenant a ?T ?
34. Transparent 34 ETF est elle LR(0) ? Grammaire ETF
E ::= E + T | T (r1 r2)
T ::= T * F | F (r3 r4)
F ::= var | ( E ) (r5 r6)
pas LR(0) , mais LR(1) ?
La dcision peut dpendre du prochain terminal lire (look ahead)
v1 + v2 + v3 v1 + v2 * v3
Une grammaire est elle LR(k) ?
En pratique on considre les grammaires LR(0) ou LR(1)
Intuitivement, la proprit est vraie si la connaissance de k terminaux aprs le caractre courant (look-ahead) permet de dcider de manire unique comment traiter le manche.
La dfinition prcdente est difficile utiliser pour prouver la proprit; par contre, on peut exhiber un contre-exemple de drivations pour prouver l'absence de cette proprit.
La construction de l'analyseur LR(k) donne ci aprs permet de rpondre la mme question.
ETF est elle LR(0) ?
Intuitivement, la rponse est NON
Formellement: on considre deux drivations droites:
E ?d E + T ?d E + F ?d E + v3 ?d E + T + v3
avec ? =a= ? , A = E , ? = E+T, w = + v3
E ?d E + T ?dE + T * F
avec ? = E+, B = T, ?' = T*F, w'= ?
et ? ?' w' = ? ? a ? = E+T*F avec ? = *F
voir aussi l'analyse des items canoniques de l'analyseur SLR
Une grammaire est elle LR(k) ?
En pratique on considre les grammaires LR(0) ou LR(1)
Intuitivement, la proprit est vraie si la connaissance de k terminaux aprs le caractre courant (look-ahead) permet de dcider de manire unique comment traiter le manche.
La dfinition prcdente est difficile utiliser pour prouver la proprit; par contre, on peut exhiber un contre-exemple de drivations pour prouver l'absence de cette proprit.
La construction de l'analyseur LR(k) donne ci aprs permet de rpondre la mme question.
ETF est elle LR(0) ?
Intuitivement, la rponse est NON
Formellement: on considre deux drivations droites:
E ?d E + T ?d E + F ?d E + v3 ?d E + T + v3
avec ? =a= ? , A = E , ? = E+T, w = + v3
E ?d E + T ?dE + T * F
avec ? = E+, B = T, ?' = T*F, w'= ?
et ? ?' w' = ? ? a ? = E+T*F avec ? = *F
voir aussi l'analyse des items canoniques de l'analyseur SLR
35. Transparent 35 Les langages de mots de pile Grammaire Dyck des ()
D ::= D D (r1)
| a D b (r2)
| a b (r3)
Langage des Contextes Gauches
CG = {?, ? D est un prfixe viable de Dyck}
CG ::= CG D ( par r1)
| CG a ( par r2)
| ? ( par r3)
=> CG = (D | a)*
Langage des Prfixes Viables
PV est le langage des mots de pile ADR
PV ::= CG D + CG D D
| CG a + CG a D + CG a D b
| CG a + CG a b
=> PV ? RAT Comment trouver le Manche ?
Les analyseurs ADR utilisent pour reprer les manches une proprit fondamentale des grammaires algbriques: le langage des prfixes des fsd , cad les mots de pile d'un ADR, est rationnel.
Dfinition: Tout prfixe p= ? u de ? ? dans une fsd F= ? ? w o ? est le manche est dit prfixe viable de F
Remarque: p dborde le dbut du manche ?, mais pas la fin
Proprit: Les prfixes viables forment l'ensemble des mots qui peuvent apparatre dans la pile lors d'une ADR ?
Thorme: Le langage des prfixes viables d'une grammaire algbrique est un langage rationnel
Preuve: voir la construction de l'automate des prfixes viables SLR ?
Rsolution ADR: l'analyseur ADR utilise un automate d'tat fini pour reprer les manches.
Comment trouver le Manche ?
Les analyseurs ADR utilisent pour reprer les manches une proprit fondamentale des grammaires algbriques: le langage des prfixes des fsd , cad les mots de pile d'un ADR, est rationnel.
Dfinition: Tout prfixe p= ? u de ? ? dans une fsd F= ? ? w o ? est le manche est dit prfixe viable de F
Remarque: p dborde le dbut du manche ?, mais pas la fin
Proprit: Les prfixes viables forment l'ensemble des mots qui peuvent apparatre dans la pile lors d'une ADR ?
Thorme: Le langage des prfixes viables d'une grammaire algbrique est un langage rationnel
Preuve: voir la construction de l'automate des prfixes viables SLR ?
Rsolution ADR: l'analyseur ADR utilise un automate d'tat fini pour reprer les manches.
36. Transparent 36 Analyseur LR Schma conceptuel Analyseur LR
Dfinition: un ALR pour une grammaire G se compose de :
un tampon d'entre pour les lexmes analyser dans T*, termin par #
une pile M de symboles dans (N ? T)*, initialement vide.
une pile E d'tats de l'automate fini PV , initialement avec un tat initial
une sortie pour produire la drivation (ou l'arbre de)
une table de transition T[{e}, N ? T] ? {e} pour les tats de PV
une table A gnre pour G, avec 4 actions {M} ? { D, R, A, E}
Dcaler:
empile dans M le symbole courant de l'entre
empile dans E l'tat atteint = T[etat_courant, som(M)]
avancer d'un symbole en entre
Rduire:
dpiler le manche dans M (p symboles en sommet de pile)
dpiler p tats dans E
empile dans M le non terminal de la rduction du manche
empile dans E l'tat atteint = T[etat_courant, som(M)]
Accepter:
si M = {l'axiome} et que l'entre = {#}
Erreur:
si pas d'action prvue dans A
un analyseur indpendant de la grammaire G excutant A en boucle, jusqu' pile ou entre vide ?Analyseur LR
Dfinition: un ALR pour une grammaire G se compose de :
un tampon d'entre pour les lexmes analyser dans T*, termin par #
une pile M de symboles dans (N ? T)*, initialement vide.
une pile E d'tats de l'automate fini PV , initialement avec un tat initial
une sortie pour produire la drivation (ou l'arbre de)
une table de transition T[{e}, N ? T] ? {e} pour les tats de PV
une table A gnre pour G, avec 4 actions {M} ? { D, R, A, E}
Dcaler:
empile dans M le symbole courant de l'entre
empile dans E l'tat atteint = T[etat_courant, som(M)]
avancer d'un symbole en entre
Rduire:
dpiler le manche dans M (p symboles en sommet de pile)
dpiler p tats dans E
empile dans M le non terminal de la rduction du manche
empile dans E l'tat atteint = T[etat_courant, som(M)]
Accepter:
si M = {l'axiome} et que l'entre = {#}
Erreur:
si pas d'action prvue dans A
un analyseur indpendant de la grammaire G excutant A en boucle, jusqu' pile ou entre vide ?
37. Transparent 37 Analyseur gnrique LR(1) Actions
boolean Action(LEX u) {
Etat e = som().etat() ;
switch (A[e, u] ){
"dcaler " => e' = T[e, u] ; emp(u, e') ;
lex(u) ; break;
" rduire A? m" => e = som().etat() ; dep(e, m) ;
emp("A", T[e, "A"] ) ;
"succs" => return true;
"erreur" => return false ;
}
}
Analyseur
function Analyse() {
lex(ul);
emp(Fond, Etat_Initial);
while ul /= "#" { succes=Action(ul) }
return succes ;
} Grammaires LR()
Proprit (rappel): pour k' > k >= 0, LR(k) => LR(k') ?
Thorme: La proprit LR(k) d'une grammaire est indcidable (pour k non fix) ?
Corollaire: Il n'existe pas d'algorithme permettant de transformer une grammaire quelconque en une grammaire quivalente LR(k) ; mais on peut toujours essayer sur une grammaire donne!
Thorme: Une grammaire LR(1) est non ambigu
preuve: d'aprs la proprit LR(1) il ne peut exister deux drivations distinctes pour deux mots identiques ?
gnralisation: ce rsultat est vrai pour les grammaires LR(k) ?
Complexit de l'analyse LR()
Thorme: L'analyse LR(1) d'un mot m est en O(|m|)
preuve: d'aprs le code ci-contre ?
gnralisation: ce rsultat est vrai pour l'analyse LR(k) ?
Langages LR()
Thorme: LR(0) = LR(1) = LR(k) = ALG DETERMINISTE ?
Remarque: En pratique, pour un langage donn, on peut tre amen prfrer une grammaire LR(1), voire LR(2), une grammaire LR(0) qui peut tre beaucoup plus difficile lire et volumineuse en nombre de rgles de production.
Thorme: La proprit LR(k) d'un langage est indcidable (pour k non fix) ?
Grammaires LR()
Proprit (rappel): pour k' > k >= 0, LR(k) => LR(k') ?
Thorme: La proprit LR(k) d'une grammaire est indcidable (pour k non fix) ?
Corollaire: Il n'existe pas d'algorithme permettant de transformer une grammaire quelconque en une grammaire quivalente LR(k) ; mais on peut toujours essayer sur une grammaire donne!
Thorme: Une grammaire LR(1) est non ambigu
preuve: d'aprs la proprit LR(1) il ne peut exister deux drivations distinctes pour deux mots identiques ?
gnralisation: ce rsultat est vrai pour les grammaires LR(k) ?
Complexit de l'analyse LR()
Thorme: L'analyse LR(1) d'un mot m est en O(|m|)
preuve: d'aprs le code ci-contre ?
gnralisation: ce rsultat est vrai pour l'analyse LR(k) ?
Langages LR()
Thorme: LR(0) = LR(1) = LR(k) = ALG DETERMINISTE ?
Remarque: En pratique, pour un langage donn, on peut tre amen prfrer une grammaire LR(1), voire LR(2), une grammaire LR(0) qui peut tre beaucoup plus difficile lire et volumineuse en nombre de rgles de production.
Thorme: La proprit LR(k) d'un langage est indcidable (pour k non fix) ?
38. Transparent 38 Grammaires SLR() items LR(0) pour E ::= E + T
Grammaire ETF enracine
E ' ::= E # (r0)
E ::= E + T | T (r1 r2)
T ::= T * F | F (r3 r4)
F ::= var | ( E ) (r5 r6)
Construction des analyseurs LR()
La construction des analyseurs LR() pour une grammaire donne est fastidieuse: on utilise donc de prfrence un gnrateur syntaxique LR comme YACC ou BISON.
Cette construction repose sur le calcul de la table d'Actions et de la Table de Transition pour les tats de l'automate des Prfixes Viables. Trois classes de grammaires, avec une inclusion stricte:
SLR ? LALR ? LR
permettent de raliser cette construction en utilisant l'analyseur gnrique LR prsent prcdemment.
Construction des analyseurs SLR
On prsente une construction gnrale qui permet d'obtenir le dcoupage des manches par un Automate d'tat fini.
Dans le cas des grammaires, dites SLR, cette construction permet d'obtenir directement les tables d'analyse LR().
Dans la suite, on "enracine" les grammaires utilises par une rgle de production ajoute P: { S'?S# } ; ceci afin de ne pas devoir traiter la dernire "remonte" vers S comme un cas particulier.
Dfinition: On appelle item LR(0) une production de P marque en partie droite par "?"
Interprtation: le marqueur matrialise la position courante de la reconnaissance ascendante de la rgle ?Construction des analyseurs LR()
La construction des analyseurs LR() pour une grammaire donne est fastidieuse: on utilise donc de prfrence un gnrateur syntaxique LR comme YACC ou BISON.
Cette construction repose sur le calcul de la table d'Actions et de la Table de Transition pour les tats de l'automate des Prfixes Viables. Trois classes de grammaires, avec une inclusion stricte:
SLR ? LALR ? LR
permettent de raliser cette construction en utilisant l'analyseur gnrique LR prsent prcdemment.
Construction des analyseurs SLR
On prsente une construction gnrale qui permet d'obtenir le dcoupage des manches par un Automate d'tat fini.
Dans le cas des grammaires, dites SLR, cette construction permet d'obtenir directement les tables d'analyse LR().
Dans la suite, on "enracine" les grammaires utilises par une rgle de production ajoute P: { S'?S# } ; ceci afin de ne pas devoir traiter la dernire "remonte" vers S comme un cas particulier.
Dfinition: On appelle item LR(0) une production de P marque en partie droite par "?"
Interprtation: le marqueur matrialise la position courante de la reconnaissance ascendante de la rgle ?
39. Transparent 39 Automates SLR() La fermeture ? ( { E'? ? E } )
E'? ?E
E? ?E + T
E? ?T
T? ?T * F
T? ?F
F? ?var
F? ?( E )
Les transitions LR(0) Fermeture d'un item LR(0)
Dfinition: Soit I un ensemble d'items, on note ? (I) la fermeture de I dfinie par:
I ? ?
si A?? ? B? ? ? alors B? ? g ? ? pour B? g ? P
Interprtation: le marqueur indique que dans l'tat I (ensemble I):
on espre rduire ?B? en A
? a dj t "remont"
il faut "remonter" B
on ajoute donc cet tat I, toutes les possibilits pour "remonter" B ?
Construction de l'Automate de Transition LR(0)
Thorme: Le langage des prfixes viables d'une grammaire algbrique est reconnu par l'automate TRANS de Transition LR(0) dfini comme suit:
les tats de TRANS sont des fermetures ?
les transitions sont dfinies par :
TRANS[I, X] = ? ( {A?? X??} pour {A?? ?X? } ? I)
o I est un ensemble d'items et X ? N ? T
l'tat initial est ? ( {S'? ? S } )
tous les tats sont terminaux
Interprtation : les tats de l'automate codent l'ensemble des parties droites possibles pour complter le prfixe empil en cours d'analyse ?
Fermeture d'un item LR(0)
Dfinition: Soit I un ensemble d'items, on note ? (I) la fermeture de I dfinie par:
I ? ?
si A?? ? B? ? ? alors B? ? g ? ? pour B? g ? P
Interprtation: le marqueur indique que dans l'tat I (ensemble I):
on espre rduire ?B? en A
? a dj t "remont"
il faut "remonter" B
on ajoute donc cet tat I, toutes les possibilits pour "remonter" B ?
Construction de l'Automate de Transition LR(0)
Thorme: Le langage des prfixes viables d'une grammaire algbrique est reconnu par l'automate TRANS de Transition LR(0) dfini comme suit:
les tats de TRANS sont des fermetures ?
les transitions sont dfinies par :
TRANS[I, X] = ? ( {A?? X??} pour {A?? ?X? } ? I)
o I est un ensemble d'items et X ? N ? T
l'tat initial est ? ( {S'? ? S } )
tous les tats sont terminaux
Interprtation : les tats de l'automate codent l'ensemble des parties droites possibles pour complter le prfixe empil en cours d'analyse ?
40. Transparent 40 Items LR(0) Canoniques ? I ensemble d'items LR(0)
? X ? (N ? T)
FERMETURE ? ( I ):
? I? ? ( I )
? si [A? ??B ? ] ? ? ( I )
et [B? ? ] ? P,
alors [B? ? ? ] ? ? ( I )
TRANSITIONS TRANS( I, X ) :
? TRANS( I, X ) = ? ( { [A? ?X? ? ] } ,
pour [A? ??X ? ] ? I )
C: Ensemble d'items canoniques
? ? ( { [E'? ? E] } ) ? C
? ? I ? C, TRANS(I, X) ? C
Dfinition: On appelle Items LR(0) canoniques les tats atteignables dans TRANS partir de l'tat initial ? ( {S'? ? S } )
Construction des items LR(0) canoniques
Items pour ETF
Dfinition: On appelle Items LR(0) canoniques les tats atteignables dans TRANS partir de l'tat initial ? ( {S'? ? S } )
Construction des items LR(0) canoniques
Items pour ETF
41. Transparent 41 Automates SLR() L'Automate des Prfixes Viables dans ETF
Construction des items LR(0) canoniques
Items pour ETF
Construction des items LR(0) canoniques
Items pour ETF
42. Transparent 42 Tables SLR pour ETF ETF est SLR Construction de la Table ACTION SLR
On construit la table A d'analyse en appliquant les rgles suivantes o A?N, a?T ? {#} et Ip l'item LR(0) associ l'tat p de l'Automate des prfixes viables.
si A???a? ? Ip alors A[p, a] = "dcaler"
si A??? ? Ip alors pour tout a ? Suivant(A):
A[p, a] = "rduire par A ? ? "
si S'?S? ? Ip alors A[p, #] = "accepter"
sinon A[p, a] = "erreur"
Conflits pendant la construction de la table ACTION
dcalage/rduction: il existe Ip contenant les items:
A???a? => A[p, a] = "dcaler"
B??'? avec a ? Suite(B) =>A[p, a] = "rduire "
rduction/rduction: il existe Ip contenant les items:
A??? et a ? Suiv(A) => A[p, a] = "rd par A"
B??'? et a ? Suiv(B) =>A[p, a] = "rd par B"
Construction de la Table ACTION SLR
On construit la table A d'analyse en appliquant les rgles suivantes o A?N, a?T ? {#} et Ip l'item LR(0) associ l'tat p de l'Automate des prfixes viables.
si A???a? ? Ip alors A[p, a] = "dcaler"
si A??? ? Ip alors pour tout a ? Suivant(A):
A[p, a] = "rduire par A ? ? "
si S'?S? ? Ip alors A[p, #] = "accepter"
sinon A[p, a] = "erreur"
Conflits pendant la construction de la table ACTION
dcalage/rduction: il existe Ip contenant les items:
A???a? => A[p, a] = "dcaler"
B??'? avec a ? Suite(B) =>A[p, a] = "rduire "
rduction/rduction: il existe Ip contenant les items:
A??? et a ? Suiv(A) => A[p, a] = "rd par A"
B??'? et a ? Suiv(B) =>A[p, a] = "rd par B"
43. Transparent 43 Tables SLR pour ETF ETF est SLR, mais pas LR(0) Proprit LR() des grammaires
Dfinition: une grammaire est SLR(1) ou SLR, si la construction prcdente de la table Action se termine sans conflit. ?
Proprit: une grammaire est LR(0) ? SLR, si la construction prcdente de la table Action se termine sans conflit et que pour chaque tat, les actions (D, Ri ou Rj) ne dpendent pas des Terminaux ?
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Suivants pour ETF
(r0) E : # (r1) E : + (r6) E : )
(r3) T : * (r2) T : + ) #
(r4) F : * + ) #
F = { * + ) # }
=> T = { * + ) # }
=> E = { + ) # }
Proprit LR() des grammaires
Dfinition: une grammaire est SLR(1) ou SLR, si la construction prcdente de la table Action se termine sans conflit. ?
Proprit: une grammaire est LR(0) ? SLR, si la construction prcdente de la table Action se termine sans conflit et que pour chaque tat, les actions (D, Ri ou Rj) ne dpendent pas des Terminaux ?
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Suivants pour ETF
(r0) E : # (r1) E : + (r6) E : )
(r3) T : * (r2) T : + ) #
(r4) F : * + ) #
F = { * + ) # }
=> T = { * + ) # }
=> E = { + ) # }
44. Transparent 44 Analyse LR(1) dans ETF Source
v1 + v2 * v3 #
Analyse SLR
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Analyse ADR
Le tableau ci_contre donne les tats successifs d'un analyseur ADR pour le mot : v1 + v2 * v3.
Rssultat
La suite des Rductions excutes par l'Automate:
R6 R4 R2 R6 R4 R6 R3 R1
est la suite des drivations inverses les + droite pour le mot en entre
Grammaire ETF rcursive gauche
(r1, r2) E ? E + T | T
(r3, r4) T ? T * F | F
(r5, r6) F ? var | ( E )
Analyse ADR
Le tableau ci_contre donne les tats successifs d'un analyseur ADR pour le mot : v1 + v2 * v3.
Rssultat
La suite des Rductions excutes par l'Automate:
R6 R4 R2 R6 R4 R6 R3 R1
est la suite des drivations inverses les + droite pour le mot en entre
45. Transparent 45 Un conflit dans la construction SLR Grammaire des affectations sur valeurs rfrences
A ::= G = D | D (r1, r2)
G ::= * D | var (r3, r4)
D ::= G (r5)
Items LR(0) canoniques
Conflit dans la table
Action[2, "="] = "dcaler"
Action[2, "="] = "rduire D ? G"
Conflits pendant la construction de la table ACTION
dcalage/rduction: il existe un tat I2 contenant les items:
A?G?=D => A[2, "="] = "dcaler"
D?G? => A[2, "="] = "rduire par D?G "
car A ? G=D ?*D=D => "=" ? Suivants(D)
Exemple: le mot *v1= v2# se rduit en *G avec = v2# en entre
deux possibilits:
rduire G en D => *D = v2
?G=v2
?G=G
?G=D
? A => accepter
dcaler =v2 => *G = v2
?* G = G
?* G = D
?* A => erreur
Interprtation: la grammaire prsente ici n'est pas ambigu; le conflit provient de la technique SLR qui n'est pas assez puissante pour mmoriser suffisamment de contexte gauche; Aprs avoir remonter une entre vers G, l'analyseur ne dispose pas d'assez d'information pour dcider qu'il faut rduire G car dcaler ne peut conduire une bonne solution !
Conflits pendant la construction de la table ACTION
dcalage/rduction: il existe un tat I2 contenant les items:
A?G?=D => A[2, "="] = "dcaler"
D?G? => A[2, "="] = "rduire par D?G "
car A ? G=D ?*D=D => "=" ? Suivants(D)
Exemple: le mot *v1= v2# se rduit en *G avec = v2# en entre
deux possibilits:
rduire G en D => *D = v2
?G=v2
?G=G
?G=D
? A => accepter
dcaler =v2 => *G = v2
?* G = G
?* G = D
?* A => erreur
Interprtation: la grammaire prsente ici n'est pas ambigu; le conflit provient de la technique SLR qui n'est pas assez puissante pour mmoriser suffisamment de contexte gauche; Aprs avoir remonter une entre vers G, l'analyseur ne dispose pas d'assez d'information pour dcider qu'il faut rduire G car dcaler ne peut conduire une bonne solution !
46. Transparent 46 Grammaires LR() Grammaire SCC enracine
S' ::= S # (r0)
S ::= CC (r1)
C ::= c C | d (r2 r3)
items LR(1)
SUIVANTS
SUIV(S)= {#} SUIV(C) = {c d #} Extension des analyseurs SLR() aux LR()
Dans l'analyse SLR on excute l'action rduire { A? ? } dans l'tat Ip pour tout a?T ? {#} si
A?? ? ? Ip et a ? Suivant(A)
Or il se peut que ?? soit un prfixe viable mais pas ?Aa
Un analyseur LR peut s'obtenir partir de la construction SLR o l'on ne rduit ?? en ?A que si ?Aa est un prfixe viable
Dfinition: On appelle item LR(1) un couple [A? ? ?? , a], compos d'un item LR(0) et d'un terminal a (de prvision ou d'anticipation) .
Dfinition:un item LR(1) [A? ? ? ? , a] est dit valide pour un prfixe viable ?? si:
S *?d ?Aaw avec ?Aaw ?d ???aw
Interprtation:
si on a dj remont ??
si ce qui suit en entre commence par ?a
alors ???aw est une fsd dont la dernire drivation est
?Aaw ?d ???aw
la prvision a n'a aucun effet dans les items sans rduction, de la forme A? ? ??, avec ? non vide.
Extension des analyseurs SLR() aux LR()
Dans l'analyse SLR on excute l'action rduire { A? ? } dans l'tat Ip pour tout a?T ? {#} si
A?? ? ? Ip et a ? Suivant(A)
Or il se peut que ?? soit un prfixe viable mais pas ?Aa
Un analyseur LR peut s'obtenir partir de la construction SLR o l'on ne rduit ?? en ?A que si ?Aa est un prfixe viable
Dfinition: On appelle item LR(1) un couple [A? ? ?? , a], compos d'un item LR(0) et d'un terminal a (de prvision ou d'anticipation) .
Dfinition:un item LR(1) [A? ? ? ? , a] est dit valide pour un prfixe viable ?? si:
S *?d ?Aaw avec ?Aaw ?d ???aw
Interprtation:
si on a dj remont ??
si ce qui suit en entre commence par ?a
alors ???aw est une fsd dont la dernire drivation est
?Aaw ?d ???aw
la prvision a n'a aucun effet dans les items sans rduction, de la forme A? ? ??, avec ? non vide.
47. Transparent 47 Automates LR() Grammaire SCC
{S'? S # ; S? CC ; C? cC | d }
? ( [ S'? ? S, # ] )
S'? ?S, #
S? ?CC , #
C? ?cC, c|d
C? ? d , c|d
Les transitions LR(1)
Fermeture d'un item LR(1)
Dfinition: Soit I un ensemble d'items LR(1) , on appelle ? (I) la fermeture de I dfinie par:
I ? ?
si [A?? ? B?, a]? ? alors [B? ? g, b]? ?
pour [B? g ] ?P et b?Prem(?a) ?
Construction de l'Automate de Transition LR(1)
Thorme: Le langage des "prfixes viables suivis d'un terminal d'anticipation " d'une grammaire algbrique est reconnu par l'automate T de Transition LR(1) dfini comme suit:
les tats de T sont des fermetures ?
les transitions sont dfinies par :
T(I, X) = ?( [A?? X??, b] pour [A?? ?X?, b] ? I )
o I est un ensemble d'items LR(1) et X ? N ? T
l'tat initial est ? ( [S'? ? S, #] )
tous les tats sont terminaux ?
Fermeture d'un item LR(1)
Dfinition: Soit I un ensemble d'items LR(1) , on appelle ? (I) la fermeture de I dfinie par:
I ? ?
si [A?? ? B?, a]? ? alors [B? ? g, b]? ?
pour [B? g ] ?P et b?Prem(?a) ?
Construction de l'Automate de Transition LR(1)
Thorme: Le langage des "prfixes viables suivis d'un terminal d'anticipation " d'une grammaire algbrique est reconnu par l'automate T de Transition LR(1) dfini comme suit:
les tats de T sont des fermetures ?
les transitions sont dfinies par :
T(I, X) = ?( [A?? X??, b] pour [A?? ?X?, b] ? I )
o I est un ensemble d'items LR(1) et X ? N ? T
l'tat initial est ? ( [S'? ? S, #] )
tous les tats sont terminaux ?
48. Transparent 48 Construction des items LR(1) canoniques
Items LR(1) pour SCC
tat I4: on reconnat le premier "d" : on doit donc rduire ssi le lookahead = "c" | "d" et erreur sinon
tat I7: on reconnat le second "d" : on doit donc rduire ssi le lookahead = "#" et erreur sinon
tat I3: on reconnat les premiers "c"
tat I6: on reconnat les seconds "c"
Construction des items LR(1) canoniques
Items LR(1) pour SCC
tat I4: on reconnat le premier "d" : on doit donc rduire ssi le lookahead = "c" | "d" et erreur sinon
tat I7: on reconnat le second "d" : on doit donc rduire ssi le lookahead = "#" et erreur sinon
tat I3: on reconnat les premiers "c"
tat I6: on reconnat les seconds "c"
49. Transparent 49 Automates LR(1) L'Automate des Transitions LR(1) dans SCC
Construction des items LR(1) canoniques
Items LR(1) pour SCC
tat I4: on reconnat le premier "d" : on doit donc rduire ssi le lookahead = "c" | "d" et erreur sinon
tat I7: on reconnat le second "d" : on doit donc rduire ssi le lookahead = "#" et erreur sinon
tat I3: on reconnat les premiers "c"
tat I6: on reconnat les seconds "c"
Construction des items LR(1) canoniques
Items LR(1) pour SCC
tat I4: on reconnat le premier "d" : on doit donc rduire ssi le lookahead = "c" | "d" et erreur sinon
tat I7: on reconnat le second "d" : on doit donc rduire ssi le lookahead = "#" et erreur sinon
tat I3: on reconnat les premiers "c"
tat I6: on reconnat les seconds "c"
50. Transparent 50 Tables LR(1) pour SCC Construction de la Table ACTION LR(1)
On construit la table comme dans le cas SLR
soit A?N, a?T ? {#} et Ip l'item LR(1) associ l'tat p de l'Automate des prfixes viables.
si [A???a?, b]? Ip alors A[p, a] = "dcaler"
si [A???, a] ? Ip alors A[p, a] = "rduire par A ? ? "
si [S'?S?, #] ? Ip alors A[p, #] = "accepter"
sinon A[p, a] = "erreur"
tat initial = [S'??S, #]
transitions comme dans le cas SLR
Etats et items LR(1) canoniques de SCC
C? c?C , c|d C? c?C , #
I3= C? ?cC , c|d I6= C? ?cC , #
C? ?d , c|d C? ?d , #
I4= C? d? , c|d I7= C? d? , #
I8= C? cC? , c|d I9= C? cC? , #
Proprit des grammaires LR(1)
Thorme: La construction donne ci dessus est sans conflit pour toute grammaire LR(1) ?
Construction de la Table ACTION LR(1)
On construit la table comme dans le cas SLR
soit A?N, a?T ? {#} et Ip l'item LR(1) associ l'tat p de l'Automate des prfixes viables.
si [A???a?, b]? Ip alors A[p, a] = "dcaler"
si [A???, a] ? Ip alors A[p, a] = "rduire par A ? ? "
si [S'?S?, #] ? Ip alors A[p, #] = "accepter"
sinon A[p, a] = "erreur"
tat initial = [S'??S, #]
transitions comme dans le cas SLR
Etats et items LR(1) canoniques de SCC
C? c?C , c|d C? c?C , #
I3= C? ?cC , c|d I6= C? ?cC , #
C? ?d , c|d C? ?d , #
I4= C? d? , c|d I7= C? d? , #
I8= C? cC? , c|d I9= C? cC? , #
Proprit des grammaires LR(1)
Thorme: La construction donne ci dessus est sans conflit pour toute grammaire LR(1) ?
51. Transparent 51 Construction LR(1) vs SLR L'Automate des Transitions SLR dans SCC
Construction SLR pour SCC
Items LR(0) pour SCC
les Items LR(0) regroupent des items LR(1)
La construction SLR pour SCC est plus conomique
On fusionne I4 et I7 sans conflit de rduction
en I4: on doit rduire (r3) ssi le lookahead = "c" | "d"
en I7: on doit rduire (r3) ssi le lookahead = "#"
en I74: on rduit dans tous les cas, et l'erreur (ventuelle) sera dtecte plus tard
les tats I3 et I6 peuvent tre fusionns sans conflit car les actions sont "shift".
Idem pour I8 et I9 Construction SLR pour SCC
Items LR(0) pour SCC
les Items LR(0) regroupent des items LR(1)
La construction SLR pour SCC est plus conomique
On fusionne I4 et I7 sans conflit de rduction
en I4: on doit rduire (r3) ssi le lookahead = "c" | "d"
en I7: on doit rduire (r3) ssi le lookahead = "#"
en I74: on rduit dans tous les cas, et l'erreur (ventuelle) sera dtecte plus tard
les tats I3 et I6 peuvent tre fusionns sans conflit car les actions sont "shift".
Idem pour I8 et I9
52. Transparent 52 Tables SLR pour SCC
Construction pratique des analyseurs LR()
La construction des analyseurs LR() repose sur le calcul de la table d'Actions et de la Table de Transitions pour les tats de l'automate des Prfixes Viables. Quatre classes de grammaires, avec une inclusion stricte:
LR(0) ? SLR ? LALR(1) ? LR(1)
permettent de raliser cette construction en utilisant l'analyseur gnrique LR prsent prcdemment.
La construction SLR est efficace, mais la classe des langages atteints est insuffisante en pratique pour les LP.
La construction LR(1) est plus coteuse en mmoire, mais la classe des langages atteints couvre en pratique tous les LP.
A titre d'exemple, on peut avoir pour la mme grammaire:
N tats dans l'automate des transitions SLR
N3 tats dans l'automate des transitions LR
les grammaires LALR(1) ralisent un bon compromis complexit/puissance d'expression; c'est la famille qui est supporte par les gnrateurs syntaxiques LR comme YACC ou BISON.
Construction pratique des analyseurs LR()
La construction des analyseurs LR() repose sur le calcul de la table d'Actions et de la Table de Transitions pour les tats de l'automate des Prfixes Viables. Quatre classes de grammaires, avec une inclusion stricte:
LR(0) ? SLR ? LALR(1) ? LR(1)
permettent de raliser cette construction en utilisant l'analyseur gnrique LR prsent prcdemment.
La construction SLR est efficace, mais la classe des langages atteints est insuffisante en pratique pour les LP.
La construction LR(1) est plus coteuse en mmoire, mais la classe des langages atteints couvre en pratique tous les LP.
A titre d'exemple, on peut avoir pour la mme grammaire:
N tats dans l'automate des transitions SLR
N3 tats dans l'automate des transitions LR
les grammaires LALR(1) ralisent un bon compromis complexit/puissance d'expression; c'est la famille qui est supporte par les gnrateurs syntaxiques LR comme YACC ou BISON.
53. Transparent 53 Grammaires LALR(1) Grammaire SCC
{S'? S# ; S? CC ; C? cC | d }
Fusion des items LR(1)
I3= { [ C? c?C , c|d ],
[ C? ?cC , c|d ],
[ C? ?d , c|d ] }
I6= { [ C? c?C , # ],
[ C? ?cC , # ],
[ C? ?d , # ] }
I36= { [ C? c?C , c|d|# ],
[ C? ?cC , c|d|# ],
[ C? ?d , c|d|# ] }
Construction des transitions LALR(1)
Principe: On fusionne les tats issus d'ensembles d'items LR(1) dont les ensembles d'items LR(0) ( "cur") sont identiques.
Dfinition: On appelle coeur d'un ensemble I d'items LR(1) l'ensemble d'items LR(0) [ A????] pour lesquels I contient un item LR(1) [A? ? ??, ak] (les ak peuvent tre diffrents)
Pour tout cur C ditems LR(1) [A? ? ??, ak] ,
PREVISION( C )= {ak} ? SUIVANT(A)
Construction LALR(1) "mthode gourmande":
Etant donne une table Action LR(1):
la fusion d'tats ayant le mme coeur n'engendre aucun conflit "dcaler/rduire".
Dfinition: une grammaire est LALR(1) si la fusion prcdente n'engendre pas de conflit "rduire/rduire".
Les conflits "rduire/rduire" crs par cette fusion sont rares en pratique (grammaires LR, non LALR).
Remarque: la mthode "gourmande" a peu d'intrt en pratique, puisqu'elle implique la construction des items LR(1).
Construction des transitions LALR(1)
Principe: On fusionne les tats issus d'ensembles d'items LR(1) dont les ensembles d'items LR(0) ( "cur") sont identiques.
Dfinition: On appelle coeur d'un ensemble I d'items LR(1) l'ensemble d'items LR(0) [ A????] pour lesquels I contient un item LR(1) [A? ? ??, ak] (les ak peuvent tre diffrents)
Pour tout cur C ditems LR(1) [A? ? ??, ak] ,
PREVISION( C )= {ak} ? SUIVANT(A)
Construction LALR(1) "mthode gourmande":
Etant donne une table Action LR(1):
la fusion d'tats ayant le mme coeur n'engendre aucun conflit "dcaler/rduire".
Dfinition: une grammaire est LALR(1) si la fusion prcdente n'engendre pas de conflit "rduire/rduire".
Les conflits "rduire/rduire" crs par cette fusion sont rares en pratique (grammaires LR, non LALR).
Remarque: la mthode "gourmande" a peu d'intrt en pratique, puisqu'elle implique la construction des items LR(1).
54. Transparent 54 Construction LALR(1) Grammaire SCC
{S'? S# ; S? CC ; C? cC | d }
Noyaux LR(0) + prvision initiale
I0= [ S'? ?S , # ]
I1= [ S'? S? , # ]
I2= [ S? C?C , # ]
I3= [ C? c?C , c|d ]
I4= [ C? d? , c|d ]
I5= [ S? CC? , # ]
I6= [ C? c?C , # ]
I7= [ C? d? , # ]
etc
Construction LALR(1) "mthode conomique":
On ne construit pas les Items LR(1):
On construit seulement les "noyaux" des Items LR(0)
On calcule itrativement les symboles de prvision pour chaque noyau LR(0)
Dfinition: le noyau d'un ensemble d'items I est le sous-ensemble des items de I qui n'ont pas leur point ?en dbut de partie droite plus l'item initial [S' ? ? S, #]
(il s'agit des items obtenus directement par transition et non pas par fermeture)
Construction LALR(1) "mthode conomique":
On ne construit pas les Items LR(1):
On construit seulement les "noyaux" des Items LR(0)
On calcule itrativement les symboles de prvision pour chaque noyau LR(0)
Dfinition: le noyau d'un ensemble d'items I est le sous-ensemble des items de I qui n'ont pas leur point ?en dbut de partie droite plus l'item initial [S' ? ? S, #]
(il s'agit des items obtenus directement par transition et non pas par fermeture)
55. Transparent 55 Construction LALR(1) Grammaire SGD
{S'? S ; S? G = D | D ;
G? * D | id ; D? G }
Noyaux LR(0) + Passes Prvision
I0= [S'? ?S]
I1= [S'? S?]
I2= [S? G?=D]
[D? G?]
I3= [S? D?]
I4= [G? *?D]
I5= [G? id?]
I6= [S? G=?D]
I7= [G? *D?]
I8= [D? G?]
I9= [S? G=D?] Dtermination des symboles de prvision partir des noyaux:
Soit K le noyau d'un ensemble d'items I
X ? (N ? T)
# est un symbole de prvision factice pour reprsenter les symboles de prvision
pour chaque item [B ? ??? ] ? K,
si [A ? ??X?, a] ? ? ({[B ? ??? , #]}) et a ? #
alors [A ? ?X??, a] ? TRANS(I,X)
(gnration spontane d'un symbole de prvision)
si [A ? ??X?, #] ? ? ({[B ? ???, # ]})
alors [A ? ?X??, #] ? TRANS(I,X)
(propagation des symboles de prvision)
Exemple grammaire SGD
? ({[S' ? ?S, # ]}) = { [S' ? ?S, # ],
[S ? ?G=D, # ], [S ? ?D, # ],
[G ? ?*D, #/= ], [G ? ?id, # /= ],
[D ? ?G, # ] }Dtermination des symboles de prvision partir des noyaux:
Soit K le noyau d'un ensemble d'items I
X ? (N ? T)
# est un symbole de prvision factice pour reprsenter les symboles de prvision
pour chaque item [B ? ??? ] ? K,
si [A ? ??X?, a] ? ? ({[B ? ??? , #]}) et a ? #
alors [A ? ?X??, a] ? TRANS(I,X)
(gnration spontane d'un symbole de prvision)
si [A ? ??X?, #] ? ? ({[B ? ???, # ]})
alors [A ? ?X??, #] ? TRANS(I,X)
(propagation des symboles de prvision)
Exemple grammaire SGD
? ({[S' ? ?S, # ]}) = { [S' ? ?S, # ],
[S ? ?G=D, # ], [S ? ?D, # ],
[G ? ?*D, #/= ], [G ? ?id, # /= ],
[D ? ?G, # ] }
56. Transparent 56 Construction LALR(1) Grammaire SGD
{S'? S ; S? G = D | D ;
G? * D | id ; D? G }
Noyaux LR(0) + Passes Prvision
I0= [S'? ?S]
I1= [S'? S?]
I2= [S? G?=D]
[D? G?]
I3= [S? D?]
I4= [G? *?D]
I5= [G? id?]
I6= [S? G=?D]
I7= [G? *D?]
I8= [D? G?]
I9= [S? G=D?] Dtermination des symboles de prvision partir des noyaux:
Soit K le noyau d'un ensemble d'items I
X ? (N ? T)
# est un symbole de prvision factice pour reprsenter les symboles de prvision
pour chaque item [B ? ??? ] ? K,
si [A ? ??X?, a] ? ? ({[B ? ??? , #]}) et a ? #
alors [A ? ?X??, a] ? TRANS(I,X)
(gnration spontane d'un symbole de prvision)
si [A ? ??X?, #] ? ? ({[B ? ???, # ]})
alors [A ? ?X??, #] ? TRANS(I,X)
(propagation des symboles de prvision)
Exemple grammaire SGD
? ({[S' ? ?S, # ]}) = { [S' ? ?S, # ],
[S ? ?G=D, # ], [S ? ?D, # ],
[G ? ?*D, #/= ], [G ? ?id, # /= ],
[D ? ?G, # ] }Dtermination des symboles de prvision partir des noyaux:
Soit K le noyau d'un ensemble d'items I
X ? (N ? T)
# est un symbole de prvision factice pour reprsenter les symboles de prvision
pour chaque item [B ? ??? ] ? K,
si [A ? ??X?, a] ? ? ({[B ? ??? , #]}) et a ? #
alors [A ? ?X??, a] ? TRANS(I,X)
(gnration spontane d'un symbole de prvision)
si [A ? ??X?, #] ? ? ({[B ? ???, # ]})
alors [A ? ?X??, #] ? TRANS(I,X)
(propagation des symboles de prvision)
Exemple grammaire SGD
? ({[S' ? ?S, # ]}) = { [S' ? ?S, # ],
[S ? ?G=D, # ], [S ? ?D, # ],
[G ? ?*D, #/= ], [G ? ?id, # /= ],
[D ? ?G, # ] }
57. Transparent 57 Classification des Grammaires Algbriques
58. Transparent 58 Classification des Langages Algbriques
59. Transparent 59 Quelques Environnements de Compilation (compiler-compiler)
Java Compiler Compiler [tm] (JavaCC [tm]) - The Java Parser Generator
http://javacc.java.net/
SYNTAX
http://syntax.gforge.inria.fr/
Free Compiler Construction Tools
http://www.thefreecountry.com/programming/compilerconstruction.shtml
ANTLR, ANother Tool for Language Recognition,
http://www.antlr.org/
The Compiler Generator Coco/R
http://www.ssw.uni-linz.ac.at/Coco/
60. La Compilation sur le Webhttp://toutprogrammer.com/
Attribute Grammar Systems
Code Generator Kits
Socits
Compiler Construction Kits
Cross Compilers
Functional
GNU Compiler Collection
Lexer and Parser Generators
Object-Oriented
Procedural
Theory
Transformation Tools