Sie sind auf Seite 1von 10

Correction du Partiel Compilation : Langages et

Grammaires
EPITA Promo 2006 Tous documents autoriss
Janvier 2004 (1h30)
Le sujet et une partie de sa correction ont t crits par Akim Demaille. Thomas Claveirole,
Valentin David et Clment Vasseur en ont assur la correction, et ont report, la demande
expresse dAkim Demaille, la partie best-of.
Une copie synthtique, bien orthographie, avec un affichage clair des rsultats, sera toujours
mieux note quune autre demandant une quelconque forme deffort de la part du correcteur.
Les rsultats ne doivent pas tre balancs comme vidents , sous peine de disqualification
pour tentative de bluffage. Nanmoins, une argumentation informelle mais convaincante, sera
souvent suffisante.
Dans cette preuve, les non-terminaux sont crits en majuscules, les terminaux en minuscules.

Hirarchie de Chomsky
Pour chacun des langages suivants,
prciser son type dans la hirarchie de Chomsky :
son rang, e.g., 3
son nom, e.g., langage rgulier
On demande videmment le type le plus prcis.
proposer une grammaire
en syntaxe bnf
qui lengendre
qui ait le mme type de Chomsky
qui soit non ambigu.
Les grammaires longues peuvent tre esquisses et se terminer par ... .
1. Les logins de la promo 2006 de lepita.

Tout document autoris signifie que notes de cours, livres, annales, etc. sont explicitement consultables pendant
lpreuve. Le zle de la part des surveillants na pas lieu dtre, mais dans un tel cas contacter le lrde au 01 53 14 59 22.

Correction: Il sagit dun langage fini, rang 4. Une grammaire longue mais finie
est :
S ::= adam_n
S ::= agrapa_n
S ::= agreda_g
...
ou bien mme en oubliant la finitude du nombre de comptes, les logins sont
composs dau plus de 8 caractres :
S ::= a
S ::= b
...
S ::= z
S ::= aa
S ::= ab
...
S ::= zzzzzzzy
S ::= zzzzzzzz
(sans montrer les caractres non alphabtiques).
Barme:
Le type dans la hirarchie de Chomsky est correct : 1 point.
La dnomination du type dans la hirarchie de Chomsky est correcte : 1 point.
La grammaire gnre un langage valide : 1 point.
Le grammaire est non-ambigu et de mme type que le langage dans la hirarchie de Chomsky : 1 point.

Best-of:
Cest un langage rgulier.
Cest un langage rgulier hors contexte de type 2.
Il ne peut y avoir plus de six lettres dans la partie gauche du login, donc il
faut pouvoir compter les lettres. Ce nest donc pas un langage rgulier, mais
simplement hors contexte.
Classification dans la hirarchie de Chomsky : non classifi (Il y a une dpendance par rapport au nombre maximal de lettres : 6. Ce nest pas modlisable
dans les grammaires classifies par Mr Chomsky)
La grammaire des logins epita ne peut tre engendre au mieux que par une
grammaire hors contexte.
Voici une grammaire contextuelle pour reprsenter les logins :
S ::= L F F F F F _ L
L ::= a | b | c | d | ...
F _ ::= a _ | b _ | c _ | ...
F ::= - |  | a | b | c | ...
- F ::= - a | - b | - c | ...
 F ::=  
Cette grammaire gre bien les priorits.
(Llve fait toute une dmonstration pour dmontrer la finitude des logins. . .)
Ceci nest pas une reprsentation bnf videmment mais elle exprime bien ce
que fait cette grammaire.
La premire rgle ne dcris pas du tout une grammaire choix finis, (du style
A ) mais sinon on ne sen sort plus.
Voici la grammaire :
L ::= kliout_a | farcy_f | gronly_p | ... | viella_a
Ici, . . . reprsente tous les autres logins (qui sont en nombre fini et explicitables
laide de ypcat passwd et grep, mais pas sur copie.)
Beaucoup dlves, qui ont par ailleurs rpondus correctement cette question, estiment que Akim, Pierre Testemale ou encore Fabrice Bardche font
partis de la promo 2006 de lepita.
2. Les nombres entiers non signs crits en base 4 (i.e., composs de 0 , 1 , 2 , 3 ).
Correction: Langage infini, mais trivialement rgulier type 3 puisque reprsent par lexpression rgulire (0|1)+ . On peut par exemple en donner une
grammaire linaire droite :
S ::= 0 S | 1 S | 2 S | 3 S
S ::= 0 | 1 | 2 | 3
Par contre, la grammaire suivante est bien videmment fausse, puisquelle produit
le mot vide :
S ::= 0 S | 1 S | 2 S | 3 S | 
Best-of:
On peut crer un automate fini de type 2.
Et en plus, elle est non ambigu !
Cette grammaire contient au moins un terminal et pas de terminaux. Donc elle
est rgulire.
Les nombres entiers non-signs crits en base 4 peuvent scrire de la manire
suivante : (0)+(1)+(2)+(3)+.
La grammaire parle delle mme.
3. Les sommes ( + ) de nombres binaires.

Correction: a reste rgulier, type 3, puisque reprsent par lexpression rgulire num(+num) o num reprsente une expression rgulire reprsentant
les entiers binaires. On obtient par exemple (0|1)+ (+(0|1)+ ) .
Un grammaire rgulire serait :
S ::= 0 E | 1 E
| 0
| 1
E ::= + 0 E | + 1 E
|
0 E |
1 E
|
0
|
1
Toute rponse de ce style :
S ::= S + T | T
T ::= 0 | 1 | 0 T | 1 T
donne une grammaire valide et non ambigu, mais il ne sagit plus alors dune
grammaire rgulire (on perd la linarit dans la premire production.)
Parmi les erreurs frquemment rencontres, on trouve aussi les lves qui oublient quun nombre binaire peut tre compos de plusieurs chiffres :
S ::= S + T | T
T ::= 0 | 1
Best-of:
Cette grammaire est un fragment de la grammaire classique de larithmtique,
bien connue pour ne pas tre ambigu.
Type de la grammaire : ambigu.
4. Les soustractions de nombres binaires avec parenthses ( ( , ) ).
Correction: Il est bien connu quon est sorti des langages rguliers, pour tomber
dans les langages hors-contexte type 2. En effet, une grammaire hors-contexte
serait :
S ::= T - S
S ::= T
T ::= ( S )
T ::= B
B ::= 0 B | 1 B
| 0 | 1
Il nest pas possible de remonter les parenthses dans la production S de la sorte :
S ::= B - S
S ::= B
S ::= ( S )
B ::= 0 B | 1 B
| 0 | 1
car alors il ne serait plus possible de gnrer (0)-0.
De mme, on ne peux pas regrouper les productions T et B de la sorte :
T ::= 0 T | 1 T
| 0 | 1
| ( S )
car alors on pourrait gnrer des mots de la forme 0(0) qui ne sont bien videmment pas dans le langage.

Best-of:
Soustractions de nombres binaires avec parenthses :
S ::= ( F ) | F
F ::= B Q
Q ::= ( P ) | P
P ::= - B T
T ::= P | 
B ::= ( A ) | A
A ::= 0 | 1
Je suppose que ce nest pas de type 3 surtout parce que je suis incapable de
prouver que cest le cas.
Cette grammaire est incluse dans celle de larithmtique, qui est ambigu.
Alors la. . . Je dirais que cest un langage hors contexte, type 2.
Cest une grammaire hors contexte (context free) (a fait mieux en anglais
non ?)

Parsage LL(1)

Lorsque lon sattaque des problmes sur des structures volues (telles que des arbres),
on constate souvent que le code mlange la fois le traitement proprement dit (par exemple
changer ltiquette dun nud), et le parcours (appliquer tous les fils, ou bien encore essayer tel
traitement, puis en cas de succs, en appliquer tel autre etc.).
Une faon puissante dexprimer de tels programmes consiste en la sparation des traitements
et des parcours. Ces modes de parcours sont appels stratgies. On sintressera alors un langage
ddi aux stratgies, i.e., permettant de composer des parcours. Stratego est un exemple de
tel langage, ddi la transformation de programmes (http://www.stratego-language.org/
twiki/bin/view/Stratego).
Les stratgies de base comptent la stratgie 0 (chec), la stratgie 1 (succs), ou encore s qui
dnote une quelconque stratgie atomique de lutilisateur. partir de deux stratgies s1 et s2
peuvent tre construites les stratgies s1 + s2 (choix non dterministe), s1 <+ s2 (choix gauche),
s1 . s2 (composition squentielle). Les parenthses permettent de grouper.
Ce langage inclut des mots tels que :
0 <+ 1

(s + s) . 1

s . s <+ s <+ 1

1. crire une grammaire hors contexte nave de ce langage de stratgies. On cherchera une
formulation abstraite, courte et trs lisible, au prix de lambigut.
Correction:
S ::= S . S
| S <+ S
| S + S
| ( S )
| 0 | 1 | s
Barme:
Grammaire correcte : 4
tourderie, mais grammaire nave et simple : 2
Best-of:
S -> E $
E -> T | 
T -> C <+ C | (C + C) | T . 1 | T <+ T | C | 
C -> 0 | 1 | 
S -> "0" | "1" | "s"
T -> "(" | ")" | "." | "<+"
P -> S P1
P1 -> T S P1 | 
S => C A C
A => 0|1|s
B => <+ | .
C =>  | ( | )
A => C A B C
B => C B A C
2. Dsambiguser cette grammaire en considrant les rgles suivantes :
(a) Toutes les oprations binaires sont associatives gauche ;
(b) . est prioritaire sur <+ ;
(c) <+ est prioritaire sur +.

cest--dire que
0 + s . s <+ s <+ 1
se lit comme suit.
0 + (((s . s) <+ s) <+ 1)
Correction: Comme pour larithmtique, on introduit des symboles nonterminaux supplmentaires pour chaque tage de priorit. On prendra S (somme)
pour ltage +, C pour le choix <+, T (terme) pour ltage ., et F (facteur) pour les
valeurs littrales et les parenthses.
// Une somme est une somme de choix ou un choix.
S ::= S + C
S ::= C
// Un choix est un choix parmi des termes, ou un terme.
C ::= C <+ T
C ::= T
// Un terme est un produit de facteurs, ou un facteur.
T ::= T . F
T ::= F
// Un facteur est un littral.
F ::= 0 | 1 | s | ( S )
On remarque la rcursivit gauche des rgles pour obtenir lassociativit
gauche.
Barme:
Bonne dsambigusation : 4
Priorits strictement inverses : 2
Best-of:
pas le temps.
rcursion droite + factorisation gauche.
(= somme) pour +
T (Terme) pour <+
F (Fuckem) pour .
et E pour stratgie (pourquoi pas ?)
(a) S -> S + E | E
E -> E . F | F
F -> F <+ G | G
G -> 0 | 1 | s (S)
(b) S -> S <+ E | E
E -> E + F | F
F -> F . G | G
G -> 0 | 1 | s (S)
(c) S -> S + E | E
E -> E <+ F | F
F -> F . G | G
G -> 0 | 1 | s (S)
Bon, alors l, je ne trouve pas le sujet clair. Est-ce que si je nexplique pas
comment jarrive cette grammaire, je "bluffe" ? La mthode est dans les 4
supports que jai emmen (notes de cours, th-lang.pdf, Appel, [ ? ? ?]), on la
fait et refait en cours... bon aprs bien sur jai lair con si jai fait une erreur.
3. Expliquer pourquoi cette grammaire ne peut pas tre LL(1).
7

Correction: Dune part elle est rcursive gauche, dautre part, plusieurs rgles
sont en concurrence. Par exemple les deux premires rgles (celles de S) sont
actives pour tout first de C.
Barme:
Rcursion : +2
Concurence : +2
Best-of:
Cette grammaire ne peut pas tre LL(1) cause des priorits des oprateurs
qui ncessitent daller voir plus loin.
Cest similaire la grammaire du partiel de lanne dernire, "les deux premires rgles sont actives pour tout FIRST de T".
LL(1) signifie que lon part systmatiquement de llment le plus gauche, et
quon ne regarde que le token suivant, rien de plus. On ne peut donc pas (avec
la grammaire LL(1)) crire une grammaire comme celle de lexercice (logique).
Cette grammaire ne peut pas tre LL1 car elle possde la rgularit gauche.
elle nest donc pas rgulire.
Cette grammaire ne peut pas tre LL(1) car daprs le cours, toute grammaire
LL(1) est non ambigu, comme celle-ci est ambigu, elle nest pas LL(1).
Elle est rcursive droite.
LL ne sait pas grer les rcursions gauche.
on drcursionne (r-rcursionne ?) droite.
Cette grammaire nest pas LL car pour des grammaires tels que U on a trop de
productions possibles.
4. Transformer cette grammaire en une grammaire susceptible dtre LL(1).
Correction:
(a) Rcursion droite.
S
C
T
F

::=
::=
::=
::=

C
T
F
0

+ S | C
<+ C | T
. T | F
| 1 | s | ( S )

(b) Factorisation gauche En utilisant pour dsigner le mot vide.


S
S
C
C
T
T
F

::=
::=
::=
::=
::=
::=
::=

C S
+ S |
T C
<+ C |
F T
. T |
0 | 1 | s | ( S )

(c) Simplification des rcursions mutuelles.


S
S
C
C
T
T
F

::=
::=
::=
::=
::=
::=
::=

C S
+ C S
T C
<+ T C
F T
. F T
0 | 1 |

|
|
|
s | ( S )

Barme:
Rcursion et factorisation : 4
Rcursion seule (mais concorde avec la rponse 3) : 2
Best-of:
On va donc mettre la rcursion droite :
S -> E $
E -> I "+" E | I
I -> T "<+" I | T
T -> F "." T | F
F -> 0 | 1 | s | (E)
(Note : un doute subsiste savoir si "." doit appartenir letage des parenthses, ou bien rester son tage).
Ainsi il aurait peut etre suffit dcrire :
S -> E $
E -> T + E | T
T-> F <+ T F
F -> 0 | 1 | s | (E) | E.F
(ce qui me gne ici, cest le fait que "." soit binaire et non unaire).
On force donc lutilisation des parenthses :
S -> S + (E) | E
E -> E <+ (F) | F
F -> F . (G) | G
G -> (S) | L
L -> s | 0 | 1
5. Quelle critique formuler sur la grammaire obtenue ?
Correction: On a perdu lassociativit gauche des oprateurs.
Barme:
Bonne rponse- : 4 points.
Mauvaise rponse- : 0 point.
Best-of:
Cest illisible et totalement contre-intuitif.
La grammaire obtenue engendre des langages trop parenthss, ce qui est
lourd et contraignant. On se croirait en LISP.
6. Rcrire cette grammaire en sautorisant les extensions de lebnf. Par exemple,
A ::= a*.
Correction:
S ::= C (+ C)*
C ::= T (<+ T)*
T ::= F (. F)*
F ::= 0 | 1 | s | ( S )
Barme:
Grammaire correcte- : 4 points.
Mauvaise priorit- : 3 points.
Pour chaque faute dans la grammaire- : -1 point.
7. crire en pseudo code un parseur LL(1) avec les bonnes priorits et associativits pour cette
grammaire.
9

Il suffira dcrire une et une seule des routines de parsage, condition quelle soit significative (comprendre que eat, aussi appele accept, nest pas demande). On prendra soin de
ne pas cacher la gestion des erreurs.
Correction: S se parse simplement par une routine :
routine parse-S ()
parse-C ()
tant que lookahead gale + faire
accepter +
parse-C ()
fin tant que
fin routine parse-S
et de faon similaire pour C et T. Enfin, toutes les rgles de F commencent par un
terminal diffrent donc aucun problme pour LL.
Barme:
Code correct : 4 points.
Erreur dtourderie (mauvais oprateur) : -1 point.

10