Vous êtes sur la page 1sur 10

Licence d'Informatique 2010-2011

Langages et Compilation

TD N 9 : ANALYSE SYNTAXIQUE DESCENDANTE PREDICTIVE LL(1) Exercice 1 (Juin 06) Soit la grammaire suivante, daxiome S. S TU T aTc | b U cU | d 1) Quelle est la forme gnrale des phrases engendre par cette grammaire ? 2) Analyse LL(1). Calculer la fonction PREMIER et la table danalyse. (Observez quil ny a pas de -production). La grammaire est-elle LL(1) ? 3) Simulez lanalyse prdictive de : a) abccd ; b) aabcd. En cas de succs donner une drivation et larbre danalyse Exercice 2 On reprend la grammaire (G) d'expressions arithmtiques additives, avec un "-" unaire et un "-" binaire, associant droite. EF+E|F-E|F F - F | ( E ) | id N.B. G est non ambigu. - G est-elle rcursive gauche ? - G a-t-elle une chance dtre LL(1) ? Sinon, donner une grammaire G' quivalente qui le soit (peut-tre). - Dfinir les fonctions PREMIER et SUIVANT et la table d'analyse pour G'- Simuler l'analyseur dterministe pour : - id - id et - id - + id Exercice 3 Soit la grammaire G2 (S-expressions Lisp) : S (L) | () | at LS|LS - G2 est-elle LL(1) ? Sinon la transformer pour qu'elle le soit (grammaire G2). - Calculer la table d'analyse - Analyser : (at at) (at at () ) Exercice 4 Soit G3 (expressions conditionnelles) : I si B alors I sinon I | si B alors I | a Bb (a pour "autre", b pour "expressions boolennes", non analyses ici. On simule ainsi labsence de conflits : les autres ne commencent pas par si . ) Peut-on mettre G3 sous forme LL(1) ? Peut-on nanmoins "dterminiser l'analyse" - par un dispositif "ad hoc" ? interprtation ? (analyser : si b alors si b alors a sinon a en produisant larbre danalyse)

Exercice 5 Formulez un ensemble de conditions ncessaires et suffisantes pour qu'une grammaire soit LL(1). Indication : considrez les couples de rgles A w1, A w2 et trouver une condition sur PREMIER et SUIVANT. Exercice 6 : analyse LL(k) et LL(*) a. Soit la grammaire (expressions arithmtiques simplifie ) EF+E|F-E|F F id | nb Imaginez un automate capable de prdire quelle alternative choisir dans la premire rgle. b. On complte la grammaire. Mme question. EF+E|F-E|F F - F | id | nb c. Peut-on appliquer le mme procd ? EF+E|F-E|F F - F | ( E ) | id | nb Exercice 7 liminer les -productions de la grammaire G2 de lexercice 3

Licence d'Informatique 2010-2011

Langages et Applications

TD N 9 : ANALYSE SYNTAXIQUE DESCENDANTE - CORRIGE Exercice 1 1) anbcqd avec qn. 2) PREM(U) = {c,d}. PREM(S) = PREM(T) = {a,b}. Table danalyse a S T U 1 seule rgle par case : grammaire LL(1) 3) Simulation abccd abccd$ abccd$ abccd$ bccd$ bccd$ ccd$ cd$ cd$ d$ d$ $ Drivation : S TU aTcU abcU abccU abccd aabcd aabcd$ aabcd$ aabcd$ abcd$ abcd$ bcd$ bcd$ cd$ d$ S$ TU$ aTcU$ TcU$ bcU$ cU$ U$ cU$ U$ d$ $ S TU T aTc Dpiler T b Dpiler Dpiler U cU Dpiler U d Dpiler Succs S TU T aTc b S TU T b U cU U d c d

S$ TU$ aTcU$ TcU$ aTccU$ TccU$ bccU$ ccU$ cU$

S TU T aTc Dpiler T aTc Dpiler T b Dpiler Dpiler Clash - Echec

Exercice 2 - G n'est pas LL(1) : PREM(F+E) = PREM(F-E) = PREM(F) = { id, -, ( }. Donc on aura les trois rgles pour E dans M(E,x), pour x gal un de ces 3 terminaux. - Solution: factorisation -> G' : E F E' E' + E | - E | F - F | ( E ) | id (o l'on fait apparatre un production) - PREMIER : Eff = {E'} (variables effaables) PREM(E) = PREM(F) PREM(E') = {+,-} PREM(F) = {-, (, id} - SUIVANT au dpart : SUIV(E) = { $ } les autres sont vides Rgle 2 : - SUIV(F) contient PREM(E')= {+,-} - SUIV(E) contient ), Au total : SUIV(F) = {+,-} et SUIV(E) ={), $} Rgle 3 : - Rgle E F E' (E effaable) : SUIV(E) et SUIV(F) contiennent SUIV(E) - Rgles E + E et E - E : SUIV(E) contient SUIV(E) Au total : - SUIV(E) = SUIV(E) = SUIV(E) U SUIV(E) de ltape prcdente = {), $} - SUIV(F) = SUIV(F) de ltape prcdente U SUIV(E) = {+,-, ), $} Au total : SUIV(E) = SUIV(E) = { ), $ }, et SUIV(F) = {+,-, ), $} - TABLE D'ANALYSE + E E' E' + E F E F E' E' - E F-F ( E F E' F(E) ) E' id E F E' F id $ E'

- Analyse de : - id - id Entre - id - id $ - id - id $ - id - id $ Pile E$ FE'$ -FE'$ Opration/rgle E F E' F-F dpiler -

id - id $ id - id $ - id $ - id $ id $ id $ id $ $ $

FE'$ idE'$ E'$ -E $ E$ FE'$ idE'$ E'$ $

F id dpiler id E' - E dpiler E F E' F id dpiler id E' SUCCES

- Analyse de : - id - + id Jusqu' la dernire ligne, c'est la mme chose. Entre - id - + id $ - id - + id $ id - + id $ id - + id $ id - + id $ - + id $ - + id $ + id $ Pile E$ FE'$ -FE'$ FE'$ idE'$ E'$ -E $ E$ Opration/rgle E F E' F-F dpiler F id dpiler id E' - E dpiler ERREUR

Remarque : on peut imaginer un message d'erreur simple du type : attendu : - ou ( ou id [les lments de PREM(E)] trouv : + Ou encore : attendu : phrase de type E

Exercice 3 Soit G2 (S-expressions Lisp) : S (L) | () | at LS|LS Deux problmes : 1) G2 est rcursive gauche (rcursion directe sur L) et 2) PREM( (L) ) et PREM( () ) contiennent tous deux (. - Elimination de la rcursivit gauche S (L) | () | at L S L' L' S L' | - Dterminisation : par factorisation (G2) S ( S' | at S' L) | )

L S L' L' S L' | Eff = {L'} PREM(S) = {(,at} PREM(S') = PREM(L) U {)} = {(,),at} PREM(L) = PREM(L') = PREM(S) = {(,at} SUIVANT : Etape 1 : SUIV(S) = {$} Etape 2 : - SUIV(L) contient {)} - SUIV(S) contient PREM(L) Au total : SUIV(L) = {)}, SUIV(S) = {$, (, at}, les autres toujours vide Etape 3 : - SUIV(S) contient SUIV(S) (premire rgle) - SUIV(L) contient SUIV(L) (rgle pour L) - SUIV(S) contient SUIV(L) (rgle pour L avec L effaable) - SUIV(S) contient SUIV(L) (rgle pour L avec L effaable) Au total : SUIV(L) = SUIV(L) = {)}, SUIV(S) = SUIV(S) = {$, (, at, )},

PREMIER S S' L L' ( at ( ) at ( at ( at

SUIVANT ( ) at $ ( ) at $ ) )

- Table d'analyse

( S S' L L' S ( S' S' L) L S L' L' S L'

) S' ) L'

at S at S' L) L S L' L' S L'

Exercice 4 G4 : I si B alors I sinon I | si B alors I | a Bb On peut essayer de factoriser "si B alors I": G'4 : I si B alors I I' | a I' sinon I | Bb Eff = {I'} PREM(I) = {si,a} PREM(I') = {sinon} PREM(B) ={b} SUIV(I) = {$} U PREM(I') U SUIV(I') SUIV(I') = SUIV(I) SUIV(B) = {alors} a I I' Ia b si I si B alors I I' I' sinon I I' Bb = {$, sinon}

alors

sinon

I'

La grammaire n'est donc pas LL(1). Solution : dcider que lon prfrera systmatiquement la rgle I' sinon I, ce qui correspond associer le sinon avec le alors le plus proche, comme dj vu par une autre mthode dans le TD n 4.

Entre si b alors si b alors a sinon a $ si b alors si b alors a sinon a $ b alors si b alors a sinon a $ b alors si b alors a sinon a $ alors si b alors a sinon a $

Pile I$ si B alors I I$ B alors I I$ b alors I I$ alors I I$

Opration/rgle I si B alors I I dpiler Bb dpiler dpiler

si b alors a sinon a $ si b alors a sinon a $ b alors a sinon a $ b alors a sinon a $ a sinon a $ a sinon a $ a sinon a $ sinon a $ sinon a $ a$ a$ $ $

I I$ si B alors I II$ B alors I II$ b alors I II$ alors I II$ I II$ a II$ II$ sinon I I $ I I $ a I $ I $ $

I si B alors I I Dpiler Bb Dpiler Dpiler I a Dpiler I sinon I Dpiler Ia Dpiler I SUCCES

Exercice 5 (a) Pour tout couple de productions Aw1 et Aw2, (w1 et w2 non vides) PREM(w1) et PREM(w2) sont disjoints (pas de conflit entre 2 rgles non vides). (b) Si A est effaable pour toute production Aw (w non vide) PREM(w) et SUIV(A) sont disjoints (pas de conflit entre un effacement de A et une rgle non vide). Exercice 6 : analyse LL(k) et LL(*) Prliminaire : mme question pour : AaB|aC B b X CcY / --- {b} - s2 => Rgle 1 so ---- {a} -- s1 \ ---{c}-- s3 => Rgle 2 a. Soit la grammaire (expressions arithmtiques simplifie ) EF+E|F-E|F F id | nb Imaginez un automate capable de prdire quelle alternative choisir dans la premire rgle. / --- {+} --> s2 (=> Rgle 1) s0 --- {id,nb} ---> s1 --- {-} ---> s3 (=> Rgle 2)

\ --- {$} --> s4 (=> Rgle 3) b. On complte la grammaire. Mme question. EF+E|F-E|F F - F | id | nb Mme automate avec en outre une boucle {-} sur s0. c. Peut-on appliquer le mme procd ? EF+E|F-E|F F - F | ( E ) | id | nb Impossible : le langage parenths induit par (E) ne peut tre reconnu par un automate. Dans les 2 cas prcdent, ce qui marche cest que lon peut reconnatre par un automate le langage qui mne un jeton discriminant (+ ,- $) NB. Lexemple en ANTLR. Notez la forme un peu diffrente de la F-rgle : ANTLR exige la forme en EBNF pour reconnatre que le sous langage considr est rgulier et infrer lautomate. grammar LLetoile; exp : somme '\n';

somme : facteur '+' somme | facteur '-' somme | facteur ; facteur : '-'* (ID | NB) ; ID NB WS : : (('a'..'z')|('A'..'Z'))+ ; ('0'..'9')+ ;

: ( ' ' | '\t' ) {$channel=HIDDEN;} ;

Exercice 7 S ( S' | at S' L) | ) L S L' L' S L' | Eff = {L'} L apparat dans la rgle pour L. On la duplique et on supprime rgle L Idem pour L. S ( S' | at S' L) | ) L S L' | S L' S L' | S On peut videmment simplifier les 2 dernires rgles :

S ( S' | at S' L) | ) LSL|S Remarque : on a rintroduit le non-dterminisme !