Vous êtes sur la page 1sur 4

Compilation Corrig

e
Licence dInformatique D. Beauquier
29 Juin 2005
Exercice 1
1.1 Donner la definition dune grammaire LR(0).
Voir le cours
Quel est linteret dune grammaire LR(0) ?
Permet de calculer une table pour faire des analyses ascendantes deterministes.
1.2 Donner la definition dune grammaire LL(1).
Voir le cours
Quel est linteret dune grammaire LL(1) ?
Permet de calculer une table pour faire des analyses descendantes deterministes.
1.3 Soit la grammaire suivante daxiome E sur lalphabet terminal {(, +, , ID, ) } :
I: E>T+E
II : E > T
III : T > F T
IV : T > F
V: F>(E)
VI : F >ID
Construire lautomate D0 pour la grammaire augmentee de G.
Lautomate a 12 etats :
0
Z E
E T + E
E T
T F T
T F
F (E)
F ID
6
E T + E
E T + E
E T
T F T
T F
F (E)
F ID

1
Z E

2
E T +E
E T

3
T F T
T F

4
F (E)
E T
T F T
T F
F (E)
F ID

5
E T + E

7
T
T
T
F
F

8
F (E)

9
F (E)

10
T F T

11
F ID

F T
F T
F
(E)
ID

Transitions :
(0, E, 1) (0, T, 2) (0, F, 3) (0, (, 4) (0, ID, 11) (2, +, 6)
((3, , 7) (4, E, 8) (4, T, 2) (4, F, 3) (4, (, 4) (4, ID, 11)
(8, ), 9) (7, T, 10) (7, F, 3) (7, (, 4) (7, ID, 5) (6, E, 5)
(6, T, 2) (6, F, 3) (6, (, 4) (6, ID, 11)

Quels sont les etats pour lesquels lautomate comporte des conflits ?
Un conflit reduction decalage dans les etats 2 et 3.
Calculer `a laide du graphe droit la fonction Suivant pour chacun des trois symboles
non-terminaux.
Arcs du graphe droit :
(E,$) (E,)), (E,E)

(T,E) (T,T) (T,+) (F,T) (F,*)

Do`
u:
Suiv(E)={),$}

Suiv(T)={),$,+}

Suiv(F)={),$,+,*}

La grammaire G est-elle SLR(1) ? (on rappellera la definition dune grammaire SLR(1))


Puique + 6 Suiv(E) le conflit dans letat 2 est resolu.
Puique 6 Suiv(T ) le conflit dans letat 3 est resolu.
Donc, la grammaire est SLR(1).
Construire une table danalyse SLR(1) et faire lanalyse ascendante de lexpression
a (b + a c).

0
1
2
3
4
5
6
7
8
9
10
11

ID
d 11

d6
rIV

(
d4

d7

d 11

rII
rIV

Accept
rII
rIV

rI

rI

d9
rV
rIII
rVI

rV
rIII
rVI

d4

d 11
d 11

d4
d4
rV
rIII
rVI

rV
rVI

Les cases vides veulent dire erreur, r veut dire reduire et d veut dire decaler

Analyse du mot a*(b+a*c) :


Pile
Entree
0
a(b+ac)$
0a11
*(b+ac)$
0F3
0F37
(b+ac)$
0F37(4
b+ac)$
0F37(4b11
+ac)$
0F37(4F3
0F37(4T2
0F37(4T2+6
ac)$
0F37(4T2+6a11
c)$
0F37(4T2+6F3
0F37(4T2+6F37
c)$
0F37(4T2+6F37c11 )$
0F37(4T2+6F37F3
0F37(4T2+6F37T10
0F37(4T2+6T2
0F37(4T2+6E5
0F37(4E8
0F37(4E8)9
$
0F37F3
0F37T10
0T2
0E1
0E1

Sortie

F ID

F ID
T F

F ID

F ID
T F
T F T
ET
E T +E
F (E)
T F
T F T
ET
ACCEPTER

Exercice 2.
Soit le fichier Lex suivant.
%{
\\ code de la fonction eval
%}
binaire
mot

[01]+
[a-z]+

%%
1111
{ ECHO ;}
{binaire} { printf(%d, eval(yytext)) ;}
binaire
{ printf(BINAIRE) ;}
{mot}
{ ECHO ;}
.
{ printf( ?) ;}
\n
{}

{ printf(X) ;}
%%
int main(void){
yylex() ;
return 0 ;
}
Sachant que la fonction eval prend en entree une chane de caract`eres s formee de 0 et de
1 et retourne lentier dont lecriture en binaire est s, que retourne lanalyse lexicale faite
par le programme ci-dessus sur le texte suivant :
Le nombre binaire 1111 est-il divisible par 4.
et 1000 ? ok !
La reponse est :
XeXnombreXBINAIREX1111XestXilXdivisibleXparXX ?estX8XXokXX