Exam Compil 05 13
Exam Compil 05 13
Exam Compil 05 13
Examen
Documents interdits
Durée: 2h
Note Importante : il vous est demandé, dans certaines questions de cet examen, d'écrire du code
en langage C. Veillez à écrire votre code de manière la plus lisible possible. Le code illisible ne
sera pas lu !
1 Expressions régulières
L'objet général de cet exercice est de déterminer si un mot appartient au langage correspondant
à une expression régulière donnée. Pour cela on écrira une grammaire des expressions régulières,
à partir de laquelle un analyseur produira un arbre abstrait. Ensuite, on déterminera si un mot
appartient au langage correspondant à l'expression régulière en parcourant son arbre abstrait.
Etant donné une expression régulière E , on note L(E) le langage correspondant à E .
Voici la syntaxe des expressions régulières ainsi que le langage correspondant, où X et Y sont
des expressions régulières et x est un élément de l'alphabet.
Expression régulière Langage Expression régulière Langage
x {x} X.Y L(X).L(Y )
ε {ε} X +Y L(X) ∪ L(Y )
X∗ n
S
∅ ∅ n≥0 L(e)
Si le type d'un n÷ud est etoile, le champ op2 doit être à NULL ; si c'est a, b, epsilon ou vide,
alors op1 et op2 sont à NULL.
3. Dessiner l'arbre abstrait correspondant à l'expression régulière de la question 2.
Pour la suite de l'exercice, on a besoin de savoir si le langage d'une expression régulière contient
ε. Ceci sera réalisé par un parcours de l'arbre abstrait de l'expression régulière.
1
4. Écrire la fonction récursive int contient_epsilon(noeud *e) qui dit si le langage de
l'expression e contient ε.
Le résiduel d'un langage L par rapport à une lettre c, noté L/c est l'ensemble des mots de L
ayant c pour préxe, auxquels on a éliminé ce préxe. En d'autres termes :
L/c = {w | w ∈ Σ∗ , cw ∈ L}.
Exemple : si L = {a, abc, b}, L/a = {ε, bc}
Si E est une expression régulière correspondant au langage L et c est un symbole, alors le langage
L/c peut aussi être décrit par une expression régulière, grâce aux règles suivantes.
x/y = ε si x = y x/y = ∅ si x 6= y
(X.Y )/x = (X/x).Y si ε ∈
/ L(X) (X.Y )/x = (X/x).Y + Y /x si ε ∈ L(X)
(X + Y )/x = (X/x) + (Y /x) X ∗ /x = (X/x).X ∗
ε/x = ∅
où X, Y sont des expressions régulières sur Σ, et x, y ∈ Σ.
4. Donner des expressions régulières qui représentent les résiduels par rapport à la lettre a
des langages décrits par les expressions régulières suivantes : (ab + bc), a∗ b et b(a + b)∗ .
On se donne à présent les primitives qui permettent de créer l'arbre abstrait.. On ne demande
pas de les implémenter.
2
Annexe : liste partielle d'opérations MIPS