CSC4251_4252 — Compilation : du langage de haut niveau à l'assembleur

Portail informatique

Exercices de travaux dirigés sur les grammaires

Théorie des langages, Hiérarchie de Chomsky-Schützenberger, Analyse syntaxique LR.

A) Restons réglo : Langages rationnels

Brille, brille, petite étoile

  • Écrire une grammaire générant le langage représenté par l'expression régulière a*b.
  • Préciser la nature de cette grammaire.
  • Écrire une grammaire linéaire gauche pour ce langage.

C'est pas réglo !

Soit la grammaire G1 :
R1 S → a S a R2 S → a a R3 S → a
  • Quelle est la nature de cette grammaire ?
  • Quel est le langage L1 engendré par cette grammaire ?
  • Quel est le type de ce langage ?
  • Proposer une grammaire régulière engendrant le même langage ?

Abécédaire

Écrire une grammaire générant le langage L2={am bn cp | m, n, p > 0}.
Quel est le type de ce langage ? Peut-on avoir une grammaire linéaire droite ou gauche ?

Pot pourri

Sources : Joël Gay, LRI
Les langages suivants sont ils rationnels :
  1. L1={an bn | n > 0}.
  2. L2={an an | n > 0}.
  3. L3={an bm | n > 2, m < 4 }.
  4. L4={an bm | n > 2, m > 4 }.
  5. L5={an bm | n < m }.
  6. L6={an bm | n + m < 256 }.
  7. L7={w∈{a,b}*, tel que w contient autant de a que de b }.
  8. L8={w∈{a,b}*, tel que w contient au moins 2 a et au plus 2 b }.
  9. L9={w∈{a,b}*, tel que w est égale à son image miroir }.

B) Al-Khwârismî : Langages algébriques

Le mathématicien الخوارزمي (Al-Khwârismî) est l'auteur de 'الكتاب المختصر في حساب الجبر والمقابلة, "Kitāb al-mukhtaá¹£ar fÄ« ḥisāb al-jabr wa-l-muqābala" (Abrégé du calcul par la restauration et la comparaison) et donc du mot algèbre.

an bn et lemme de l'étoile

Écrire une grammaire générant le langage L={an bn | n ≥ 0} .
Quel est le type de ce langage et de cette grammaire ?
Qu'est ce que le lemme de l'étoile ?

Palindromes

Soit un alphabet Σ={a, b, c, d}, écrire une grammaire générant le langage L={W d W, avec W dans {a, b, c}* et W la chaîne miroir de W}
Quel est le type de ce langage et de cette grammaire ?
Même exercice avec L'={W W, avec W dans {a, b, c}* et W la chaîne miroir de W}

Quand c'est flou, il y a un loup

Montrer que la grammaire algébrique suivante est ambiguë :
R1 E → E + E R3 E → E * E R5 E → ( E ) R6 E → a | b | c
Écrire une grammaire non ambiguë pour le même langage.

La balade du else (dangling else)

Montrer que la grammaire algébrique suivante est ambiguë :
Inst ::= Inst_if Inst_if ::= IF Expr Inst Inst_if ::= IF Expr Inst ELSE Inst Expr ::= ...
Écrire une grammaire non ambiguë pour le même langage. Cette grammaire réalisera la convention usuelle : le ELSE se rapporte au IF le plus proche.

C) Tout dépend du contexte : Langages contextuels

an bn cn

Le langage L={an bn cn| n > 0} n'est pas algébrique. C'est un langage de type 1 dans la hiérarchie de Chomsky-Schützenberger, ou aussi un langage dépendant du contexte, ou context-sensitive. Le langage ne peut être engendré par une grammaire algébrique (context-free), mais peut être engendré par la grammaire contextuelle suivante :
R1 S → a B S c R2 S → a B c R3 Ba → a B R4 Bc → b c R5 Bb → b b

Donner les pas de dérivation nécessaires pour reconnaître les chaînes abc, puis aabbcc, puis aaabbbccc.

Papous pas à poux papous pas papas

Le langage L={W W, avec W dans {a, b}+ } n'est pas algébrique. C'est un langage dépendant du contexte engendré par la grammaire contextuelle suivante :
R1 S → a A S R2 S → b B S R3 S → a X R4 S → b Y R5 A aa A R6 B aa B R7 A bb A R8 B bb B R9 A X → X a R10 B X → Y a R11 A Y → X b R12 B Y → Y b R13 a X → a a R14 b X → b a R15 a Y → a b R16 b Y → b b

Donner les pas de dérivation nécessaires pour reconnaître la chaîne abbabb.

an bn cp et an bp cp sont dans un bateau

Considérons les deux langages :
  • L1 = {an bn cp | n, p > 0},
  • L2 = {an bp cp | n, p > 0}.
Quelle est la nature des langages : L1, L2, L1∩L2 et L1∪L2 ?

an bp cq dr

Les langages suivants sont-ils algébriques ou pas ?
  • L1 = {an bp cn dp| p,n > 0}.
  • L2 = {an bn cp dp| p,n > 0}.
  • L3 = {an bp cp dn| p,n > 0}.
Justifier les réponses en prenant le point de vue des automates à pile.

D) Analyse LR

Décaler ou Réduire ?

Écrire les décalages/réductions (Shift/Reduce) nécessaires pour reconnaître le fragment ababa avec la grammaire suivante :
R1 S → A B R2 A → a b R3 B → a b a

Récursivité à gauche ou à droite

Écrire les décalages/réductions nécessaires pour reconnaître le fragment aaaa avec la grammaire récursive gauche :
R1 S → S a R3 S → a
Même exercice avec la grammaire récursive droite :
R2 S → a S R3 S → a
Conclusion ?

ligne à ligne

Soit une spécification CUP de la forme :
terminal NL; /* fin de ligne */ non terminal Lignes Phrase; Lignes ::= /* vide */ {: Action1(); :} | Lignes Phrase NL {: Action2(); :}
Écrire les décalages/réductions nécessaires pour l'analyse LR d'un fichier contenant 0,1,2,... lignes avec une "Phrase" correcte par ligne.

Conflits et automate LR

Tester avec CUP la spécification :
non terminal Liste; terminal N; Liste ::= /* vide */ ; Liste ::= N ; Liste ::= Liste N ; ;
  • Expliquer le conflit.
  • Utiliser l'option -dump de CUP pour visualiser l'automate (cf. aussi diapositive de cours).
  • Comment corriger le problème ?

Mêmes questions avec une version récursive droite de la grammaire :
non terminal Liste; terminal N; Liste ::= /* vide */ ; Liste ::= N ; Liste ::= N Liste;

Retour de balade du else (dangling else)

Tester avec CUP la spécification :
non terminal Inst; terminal IF, ELSE, COND ; Inst ::= IF COND Inst ; Inst ::= IF COND Inst ELSE Inst ;
  • Quel type de conflits est signalé par CUP ?
  • Comment résoudre le conflit en utilisant les règles de priorité de CUP.
  • Analyser l'automate LR fourni avec l'option -dump de CUP.

Réduire ou Réduire ? Telle est la question

Des exemples de conflits Reduce/Reduce à analyser ou tester avec CUP :
/* Redondance */ terminal PLUS, ID, NUM; nonterminal Exp, Term; Exp ::= Exp PLUS Term | Term | ID ; Term ::= NUM | ID ;
/* Expressions en caml */ terminal MINUS, ID, NUM; nonterminal Exp, Term ; Exp ::= Exp MINUS Term | Term | Exp Term ; Term ::= NUM | ID | MINUS Term ;
/* Conflit sur lookahead limité */ terminal a, b, c, d; nonterminal S, T, U; S ::= T b c | U b d ; T ::= a ; U ::= a ;
Question subsidiaire : Quel est le style littéraire qui correspond au dernier exemple, c'est à dire où l'information qui permet de déterminer (rendre déterministe) l'interprétation est renvoyer loin en fin de fichier ?

CSC4251_4252, TELECOM SudParis, P. Hennequin,Last modified: Juillet 2024