Vous êtes sur la page 1sur 3

Corrig

e du partiel du 31 mars 2014


I . Analyse lexicale.
1. En Caml (un langage fonctionnel concu `a lINRIA), les identificateurs sont des suites de
lettres, chiffres, _ (le caract`ere souligne) et (le caract`ere apostrophe), commencant par une
lettre. Les identificateurs ne doivent pas contenir deux caract`eres soulignes successifs (__).
Exemples : x, x, Le_Compteur, k0, K1, mais pas ab__cd.
Donnez une expression reguli`ere pour reconnatre les identificateurs de Caml.

r
eponse :
[A-Za-z]("_"?[A-Za-z0-9])*"_"?
2. Dans un syst`eme dextraction dinformations, on a besoin de reconnatre des entites comme
les dates (28 mars 2011, 28/03/11, lundi 28 . . . ), les heures (12h30, minuit . . . ), les adresses
(12 rue du General dAusson-Ducanon, 3bis place Hauxjeunes, 152 avenue du 11 novembre).
Sachant que sont definies les expressions reguli`eres pour les jours (JOUR : lundi|mardi| . . . ),
les mois (MOIS : janvier|fevrier| . . . ), les voies (VOIE : rue|avenue| . . . ), ecrire les r`
egles
dun programme Flex pour reconnatre ces differentes entites. Par exemple
jeudi 24, ronde des fac, rendez-vous 14h30 place Massena.

affichera apr`es traitement par votre analyseur


DATE[jeudi 24], ronde des fac, rendez-vous HEURE[14h30] LIEU[place Massena].

Vous pouvez supposer quune adresse se termine toujours sur une ponctuation (point, virgule . . . ).

r
eponse :

MOIS (janvier|fevrier|mars|avril|mai|juin|juillet|aout|septembre|octobre|novembre
JOUR (lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche)
VOIE (rue|avenue|boulevard|allee|chemin|place|impasse)
HEURE (0?[0-9]|[1][0-9]|2[0-4])
MINUTE (0?[0-9]|[1-5][0-9])
NUMJOUR (0?[1-9]|[1-2][0-9]|3[0-1])
NUMMOIS (0?[1-9]|1[0-2])
ANNEE [1-9][0-9]?[0-9]?[0-9]?
NUMRUE ([1-9][0-9]*(bis|ter)?)
SP (" "+)
%%
({NUMRUE}{SP})?{VOIE}[^.;,:\n]+
{HEURE}[hH]{MINUTE}|midi|minuit

printf("LIEU[%s]", yytext);
printf("HEURE[%s]", yytext);

({JOUR}{SP})?{NUMJOUR}{SP}{MOIS}({SP}{ANNEE})?
{JOUR}{SP}{NUMJOUR}
{NUMJOUR}"/"{NUMMOIS}"/"{ANNEE}
.|\n

ECHO;

printf("DATE[%s]", yytext);
printf("DATE[%s]", yytext);
printf("DATE[%s]", yytext);

II . Grammaires non contextuelles.


1. Soit la grammaire S AC A aAb | C bCc | .
Quel est le langage produit par cette grammaire ?

r
eponse :
an bn bm cm = an bn+m cm , n, m 0
2. Donnez une grammaire qui produit un langage comptant le nombre de () non appariees.
Par exemple, ((()++ car il y a 2 ( de plus que de ), (()))- car il y en a une de moins, et
((())) car il y en a autant.

r
eponse :

SE|P |EM
E (E) |
P (P + | E
M )M | )
3. Soit la grammaire :
S DAC | BED

Aa|

Bb|

C Bd | c

Dd|

E Db | e

(a) Donnez les Premier1 pour les non terminaux suivants

r
eponse :
A

c, d
(car B annulable)

b, e
(car D annulable)

b, c, d

b, d, e

(b) En deduire les Premier1 de DAC et BED. Que peut-on dire de cette grammaire ?

r
eponse :
Prem(DAC) = Prem(D) Prem(A) Prem(C) = {d, a, b, c}
car D et A annulables
Prem(BED) = Prem(B) Prem(E) = {b, d, e} car B annulable
Lintersecton des ensembles de Prem1 nest pas disjointe, grammaire pas LL(1) (en fait LL(2))
4. Soit la grammaire :
S aAC | aBD A ac | B ab | ca C cdB D dB
Pour quelle valeur de k cette grammaire est-elle LL(k) ? Justifier votre reponse.

r
eponse :
Grammaire LL(3) : par aAC on produit par derivation gauche
aacC, et par aBD on produit aabD. Et aussi, par aAC on produit acdB, et par aBD on produit acadB.

5. Soit la grammaire :
S aAC | bAD | BD

A ab | b

B ab | ba

C cd

D dc

(a) Donnez les Suivant1 de A et de B

r
eponse :
Suiv(A) = c et d, Suiv(B) = d.
Les ensembles ne sont pas disjoints
(b) Donnez lautomate LR(0) de cette grammaire. Vous pouvez ne donner que les etats qui
ont des transitions sur a ou b.

r
eponse :
tats significatifs de l'automate LR(0) de la grammaire
q1
SaAc
Bab
Aab
Ab

a
q0
SaAC
SbAd
SBd
Bab
Bba

b
B

q3
SB d

q7
Aa

q4
SbAd
Bba
Aab
Ab
b

q2
B a b
A b
b

q6
Ab

q9
SaAc

q5
Aab
Bba

Conflit
rduction/rduction :
Pas LR(0)

q8
Aab

Conflit
dcalage/rduction :
Pas LR(0)

(c) Cette grammaire est-elle LR(0), SLR(1), LALR(1) ? Justifiez dans chaque cas.
i. LR(0) ? Pourquoi ?

Car conflits dans des etats de lautomate LR(0)


ii. SLR(1) ? Pourquoi ?

La grammaire est SLR(1) en q5 car b (le symbole sur lequel


decaler) nest pas dans les Suiv(B) ( les symboles sur lesquels
il faut reduire).
Pas contre, probl`eme en q2 , car les ensembles de symboles
sur lesquels on doit reduire (Suiv(A) et Suiv(B)) ne sont
pas disjoints
Donc la grammaire nest pas SLR(1).
iii. LALR(1) ? Pourquoi ?

Voir lautomate : pour q2 on reduit `a A sur les suivants


contextuels de A donc c, et on reduit a` B sur d.
Donc LALR(1)