Académique Documents
Professionnel Documents
Culture Documents
SUPÉRIEUR
INFORMATIQUE
ISI
Examen : Compilation
Date : 30 / 05 / 2012 – Durée : 2h00
Documents NON autorisés
Dans la grammaire qui suit, l’attribut synthétisé ‘val’ donne la valeur décimale du nombre binaire engendré
par S. Si x est un nombre binaire. Il s’écrit sous la forme an…a0.b0 … bm, où ai et bi sont soit 0, ou soit 1.
Par exemple pour le texte 101.101, S.val = 5.625
S → L.L| L
L → L B| B
B → 0|1
Déterminer S.val à l’aide d’une définition dirigée par la syntaxe dans laquelle le seul attribut synthétisé de
B est c, qui donne la contribution à la valeur finale du bit engendré par B. Par exemple, la contribution à la
valeur finale des premier et dernier bits à la valeur 5.625 est respectivement 4 et 0.125
On considère le mini-langage L de programmation suivant : l'alphabet de ce langage est formé des lettres
{a, ..., z, A, ..., Z}, des chiffres {0, ..., 9}, du point {.}, de la quotte {'} et les caractères {+, − , ×, ⁄, =}.
while (i <= n – 2) {
j = i + 1;
while (j <= n – 1) {
if (t[j] < t[i]) {
tmp := t[i];
t[i] := t[j];
t[j] := tmp;
}
}
}
On considère la fonction get_base (void* ptr) qui retourne l’adresse de base d’un pointeur quelconque en
mémoire. Par exemple get_base (t) retourne l’adresse mémoire du début du vecteur t c’est à dire &t[0].
Question 1 : à l’aide de la fonction get_base, donner l’instruction qui permet d’accéder à t[k], l’élément
d’indice k du vecteur, k étant un entier donné.
Question 2 : Traduire les instructions du code ci-dessus en code à trois adresses.
Soit la grammaire G suivante engendrant des listes à la Scheme, d’axiome L, d’alphabet dont les
terminaux sont {a, (, ) } et dont les règles sont :
L → (S) | a
S → L S| ε
Résultat de l’impression 1. (
1.1 (
1.1.1. :x 1.1.1 : x
1.1.2. :y 1.1.2 : y
)
1.2. :x 1.2 : x
1.3 (
1.3.1. :y 1.3.1
)
y EXPLICATION
1.4 (
1.4.1. :y 1.4.1 : y
1.4.2 (
1.4.2.1. : x 1.4.2.1 : x
1.4.2.2. : y 1.4.2.2 : y
)))
CORRECTION
EXERCICE 1 – DEFINITION DIRIGEE PAR LA SYNTAXE
1. Grammaire
La grammaire intuitive de base est la suivante (ne pas utiliser E + E, E × E, etc. pour des raisons vues et
démontrées en cours) :
id → Lettre ( Lettre | Chiffre)*
Nombre → Chiffre+ [.Chiffre*]
Affect → id = E
E → E+T|E−T|T
T → T×F|T/F|T&F|F
F → Id
La grammaire est hors contexte il n’est pas intéressant de garder les expressions régulières. En plus il
n’est pas question d’analyse sémantique donc on considèrera que un ‘Nombre’ est une expression limitée
à une constante. La grammaire dont on tiendra compte est alors :
Affect → id = E
E → E+T|E−T|T
T → T×F|T/F|T&F|F
F → Id
Suivant (Affect) = { $ }
Suivant (E) = Suivant (E1) = {$}
Suivant (T) = Suivant (T1) = {+, −, $ }
Suivant (F) = { +, −, ×, /, &, $ }
4. Dresser la table prédictive
id + − × / & $
Affect Affect → id = E Affect → ε
E E → T E1
E1 E1 → + T E1 E1 → − T E1 E1 → ε
T T → F T1
T1 T1 → ε T1 → ε T1 → × F T1 T1 → / F T1 T1 → & F T1 T1 → ε
F F → id
EXERCICE 3
1. On suppose que l’indice de la borne inférieure du tableau est 0 et que le tableau contient un type
scalaire T. L’expression permettant l’accès à t[k], l’élément d’indice k du vecteur, k étant un entier
donné est :
get_base (t) + k × sizeof (T)
Si on considère que l’indice de la borne inférieure du tableau est inf, alors l’expression devient :
get_base (t) + (k − inf ) × sizeof (T)
100 i = 0
110 t1 = n – 2
111 t2 = i <= t1
112 if t2 = 0 GOTO 131
113 j = i + 1
114 t3 = n – 1
115 t4 = j <= t3
116 if t4 = 0 GOTO 129
117 t5 = i * sizeof (T)
118 t6 = j * sizeof (T)
119 t7 = get_base (t) + t5
120 t8 = get_base (t) + t6
121 t9 = t8 < t7
122 if t9 = 0 GOTO 126
123 tmp = t7
124 t7 = t8
125 t8 = tmp
126 t10 = j + 1
127 j = t10
128 GOTO 115
129 t11 = i + 1
130 i = t11
131 GOTO 111
132
Partie 2 : Analyse sémantique
L → (S)
L → a
S → LS
S → ε
1. G est LL1
PREMIERS (L) = { (, a }
PREMIERS (S) = { (, a, ε }
SUIVANTS (L) = { (, a, ), $ }
SUIVANTS (S) = { ) }
Table
a ( )
L L→a L → (S)
S S → LS S → LS S → ε
3. Schéma de traduction
L’algorithme est quasiment donné dans l’exemple. Les opérations sont simples et basiques. Il s’agit d’avoir
un attribut hérité (que j’ai nommé dewey dans le schéma de traduction) qui représente le numéro de
Dewey à imprimer. L’évolution de cette chaine se fait comme suit :
Au départ, il vaut 0 (avant la création d’un niveau) chaque fois qu’on crée une nouvel item à un niveau
donné il est incrémenté de 1. La création d’un item se fait par les règles de production L → … Le
mécanisme est el même pour les sous listes. Chaque fois qu’on remonte d’un niveau, on soustrait la
dernière partie du numéro de Dewey à la chaine.
L’attribut hérité dewey est la concaténation des valeurs de tous les niveaux séparés par un point. C