TD TC
TD TC
TD TC
Section : IF4
Exercice 1
Supposons qu’un robot puisse être commandé pour se déplacer d’un pas vers l’est, le nord, l’ouest
ou le sud à partir de sa position initiale.
Par exemple si nous supposons que le robot est initalement dans la position (0,0), après exécution
des instructions :
1. En utilisant la notion de grammaires attribuées, construire une définition dirigée par la syntaxe
pour traduire une séquence d’instruction en une position du robot.
Proposer pour répondre à cette question deux versions : la première utilise des attributs
synthétisés et la seconde utilise des attributs hérités.
2. Pour chacune des versions proposées précédemment, donner l’arbre syntaxique décoré pour
début ouest sud.
3. Dans un langage algorithmique, proposer une implémentation les deux versions trouvées précédemment.
Vous pouvez utiliser sans les réécrire les procédures accepter et SymboleSuivant introduites
au chapitre 2 du cours.
4. Exécuter à la main chacun des algorithmes sur le texte source début ouest sud.
Exercice 2
Ecrire une définition dirigée par la syntaxe traduisant des entiers binaires en nombres décimaux.
Construire un arbre décoré pour l’entrée 01011.
1
Exercice 3
Construire un schéma de traduction dirigé par la syntaxe qui traduit des nombres écrits en chiffres
romains en entiers décimaux.
Exercice 4
Construire un schéma de traduction dirigé par la syntaxe qui traduit des expressions arithmétiques
infixées en expressions préfixées où un opérateur apparaı̂t avant ses opérandes ; par exemple, −x y
est la notations préfixée de x − y. Construire les arbres décorés pour les entrées 9 − 5 + 2 et
9 − 5 ∗ 2.
Exercice 5
Ecrire le code associé à la traduction d’expressions arithmétiques infixées en postfixées.
On érira le code associé à :
• l’analyseur lexical,
• la gestion de la table des symboles Pour la gestion de la table des symboles il faut écrire les
algorithmes associés à :
• le traitement d’erreurs.
2
T.D. No2 Théorie des langages et compilation
Analyse lexicale
Exercice 1
Identifier les lexèmes, les unités léxicales, les attributs et les modèles qui dénotent les unités lexicales dans
le programme suivant. Discuter les différentes manières de traiter les mots clés. Donner le contenu de la
table des symboles à la fin de l’analyse.
Exercice 2
Exercice 3
• Ecrire une ”spécification Lex” qui compte le nombre de voyelles, consonnes et caractères de ponctuations
d’un texte en entré.
• Ecrire une ”spécification Lex” qui supprime les lignes qui commencent par p ainsi que tous les entiers,
remplace les o par des * et retourne le reste inchangé.
1
T.D. No3 Théorie des langages et compilation
Analyse syntaxique descendante
Section : IF4
Exercice 1
On propose la grammaire suivante décrivant les instructions si-alors-sinon pour remédier à l’ambiguı̈té
du <<sinon en supens>>:
instr → si exp alors instr
|instr close
intstr close → si exp alors instr close sinon instr
|autre
Montrer que cette grammaire est encore ambiguë.
Exercice 2
Considérons la grammaire suivante :
S→(L)|a
L→L,S|S
(a) (a, a)
(b) (a, (a, a))
4. Exécuter l’analyseur à la main sur l’entrée (, (a, ) puis sur l’entrée b(, a
1
Exercice 3
Construire un analyseur prédictif non récursif (itératif) pour la grammaire suivante:
exprb → exprb ou termeb | termeb
termeb → termeb et f acteurb | f acteurb
f acteurb → non f acteurb | ( exprb ) | vrai | faux
Analyser le mot (v et non f ). En mode panique analyser (v et
Exercice 4
Considérons la grammaire:
R → R 0 |0 R | RR | R ∗ | (R) | a | b
Notons que la première barre verticale est le symbole <<ou>> et pas le séparateur d’alternatives.
1. Construire une grammare équivalente non ambiguë qui donne aux opérations de répétition (*),
de concaténation et de choix (|) les priorités et associativités définies au cours.
2. Construire un analyseur prédictif non récursif pour la grammaire non ambiguë des expressions
régulières.
Exercice 5
• Montrer qu’aucune grammaire récursive gauche ne peut être LL(1)
• Montrer qu’aucune grammaire LL(1) ne peut être ambiguë.
Exercice 6
Soit G la grammaire suivante :
Fournir toutes les étapes de développement d’un analyseur syntaxique prédictif, descendant et récursif
pour la grammaire G.
Présenter les diagrammes de transition de G et écrire l’analyseur syntaxique en utilisant un pseudo code
de votre choix.
2
T.D. No4 Théorie des langages et compilation
Analyse syntaxique ascendante AAPO et SLR
Section : IF4
Exercice 1
Considérons la grammaire :
S→(L)|a
L→L,S|S
(1) Construire une dérivation droite pour (a, (a, a)) et montrer le manche de chaque proto-phrase droite.
(2) Détailler les étapes d’un analyseur par décalage-réduction correspondant à la dérivation droite de (1).
Exercice 2
La table suivante indique les relations de précédence d’opérateurs pour la grammaire de l’exercice 1.
a ( ) , $
a >
. >
. >
.
$ <. <.
1. (a, a)
Exercice 3
Construire les relations de précédence d’opérateurs pour les grammaires suivantes :
• S → aSbS | bSaS |
1
Exercice 4
Il existe une facon mécanique de produire les relations de précédence d’opérateurs à partir d’une grammaire
d’opérateurs, y compris celles avec des non-terminaux différents. Définissons Tête(A) comme l’ensemble des
terminaux a tel que a soit le terminal le plus à gauche d’une chaı̂ne dérivée de A, et définissons Queue(A)
comme l’ensemble des terminaux qui peuvent être le plus à droite dans une chaı̂ne dérivée de A. Alors pour
les terminaux a et b, nous posons a =. b s’il existe une partie droite de la forme : αaβbγ, où β est soit vide,
soit un unique non-terminal, et α et γ sont arbitraires. Nous posons a <. b s’il existe une partie droite de la
forme : αaAβ et si b est dans Tête(A) ; nous posons a.> b s’il y a une partie droite de la forme : αAbβ et si
a est dans Queue(A). Dans les deux cas, α et β sont des chaı̂nes arbitraires. Nous posons également $ <. b
chaque fois que b est dans Tête(S), où S est l’axiome, et a.> $ à chaque fois que a est dans Queue(S).
2. Vérifier que les relations de précédences de la table de l’exercice 2 sont celles dérivées de cette gram-
maire.
Exercice 5
Soit G la grammaire suivante :
E → E + T |T
T → T F |F
F → F ∗ |a|b
1. Calculer les fonctions PREMIER et SUIVANT pour les non terminaux E, T et F .
2. Construire la grammaire augmentée G0 .
3. Calculer les ensembles d’items.
4. Construire l’automate des préfixes viables.
5. Dresser les tables ACTION et SUCCESSEUR.
6. Reconnaı̂tre a + b∗ .
7. Gérer les erreurs en modfe panique.
8. Analyser ab∗ +.
Exercice 6
Soit G la grammaire suivante :
R → R ∪ R | R ∩ R | R ∗ R | {LIST E}
LIST E → COU P LE , LIST E | LIST E
COU P LE → ( CHIF F RE , CHIF F RE )
Construire les tables SLR ACTION et SUCCESSEUR associées à la grammaire G.
Exercice 7
Soit G la grammaire suivante :
G : {E → E + E | E − E | E ∗ E | E/ E | Chif f re} où E est l’axiome et +, −, ∗, / et Chif f re
sont des terminaux.
1. Construire les tables SLR associées à la grammaire G. Peut-on faire une analyse SLR pour G? Justifier
votre réponse.
2. Si l’on suppose que les
opérateurs +, −, ∗ et / sont associatifs à gauche et que {+, −} ont une priorité inférieure à celle de {∗, /},
proposer des tables SLR sans conflit (Shift-Reduce ou dit aussi décaler-réduire).
2
T.D. No5 Théorie des langages et compilation
Génération de code intermédiaire
Section : IF4
Exercice 1
Traduire l’expression arithmétique a * - ( b + c ) en :
1. du code à trois adresses ;
2. du code pour une machine à pile.
Même chose pour l’instruction x:=a * - ( b + c ).
Exercice 2
Rappeler le code intermédiaire à trois adresses associé à l’instruction d’itération tant que :
I → tant que E faire I1
Donner les définitions dirigées par la syntaxe permettant de générer du code à trois adresses pour
les instructions conditionnelles simple et double.
I → si E alors I1
I → si E alors I1 sinon I2
Application : Traduire l’instruction suivante en du code pour une machine à trois adresses :
Exercice 3
Tout compilateur est composé de deux parties : la partie frontale et la partie terminale. Dans la
partie frontale, on effectue l’analyse lexicale, l’analyse syntaxique et sémantique et on génère le
code intermédiaire pour une machine abstraite. Dans cet exercice, on suppose que l’on génère des
instructions intermédiaires LI pour une machine abstraite à pile. La sémantique des instructions LI
est celle utilisée dans le cours.
tant que a<>b faire si a>b alors a:=a-b sinon b:=b-a fait
1
Instruction --> tant que Expression-Booleenne faire Instruction fait
| si Expression-Booleenne alors Instruction sinon Instruction
| id:=Expression-Entiere
Expression-Booleenne --> Variable = Variable
| Variable <> Variable
| Variable > Variable
| Variable < Variable
Expression-entiere --> Variable + Variable
| Variable - Variable
| Variable * Variable
Variable --> id | nombre
3. Fournir l’arbre syntaxique (décoré par les actions définis dans le schéma de traduction) de
l’instruction itérative fournie à la question 1.