Exam Compil 2015
Exam Compil 2015
Exam Compil 2015
Sené
1 Grammaires attribuées
On s’intéresse dans cet exercice à des arbres dont les nœuds sont étiquetés par des entiers de 0 à 9. De tels arbres
peuvent être représentés par une expression parenthésée dans laquelle un nœud est représenté par son étiquette suivie
de la liste de ses fils entre parenthèses. L’expression 1(2(3())4()), par exemple, représente l’arbre ayant 1 pour racine.
Cette dernière possède elle même deux fils (2 et 4) et 2 a pour fils 3.
On appelle profondeur d’un noeud sa distance par rapport à la racine, dont la profondeur est 0. La hauteur d’un arbre
est la profondeur maximale de ses nœuds. On appelle degré d’un nœud, le nombre de fils qu’il possède. Les nœuds de
degré 0 sont appelés feuilles, les autres nœuds sont appelés nœuds internes.
Le langage des arbres est généré par la grammaire G ci-dessous 1 :
R → N E → 0
N → E(L) E → 1
L → NL ...
L → ε E → 9
Q.1. Dessinez l’arbre de dérivation correspondant à l’arbre 1(2(3())4())
Dans chacune des questions suivantes on cherche à répondre à une question concernant un arbre généré par la gram-
maire. Pour chacune, il vous est demandé de définir des attributs ainsi que des actions sémantiques sur la grammaire G
permettant de calculer la valeur des attributs. Tous les attributs sont à valeurs entières. Pour chacune des questions, vous
pourrez utiliser les attributs que vous avez défini pour répondre aux questions précédentes.
Pour chaque attribut défini, vous indiquerez :
1. ce qu’il représente
2. s’il est hérité ou synthétisé
3. sa valeur pour chaque nœud de l’arbre de dérivation de la question précédente.
Pour calculer la valeur des attributs, vous pourrez utiliser les opérations arithmétiques, les opérations booléennes,
l’opérateur binaire max(x, y) ainsi que le prédicat binaire egal(x, y) qui vaut 1 si x = y, et vaut 0 sinon.
Q.2. Combien de nœuds possède l’arbre ?
R → N R.n = N.n
N → E(L) N.n = L.n + 1
L → N L1 L.n = N.n + L1 .n
L → ε L.n = 0
Q.3. Quel est le degré de chaque nœud N ?
R → N R.d = N.d
N → E(L) N.d = L.d
L → N L1 L.d = L1 .d + 1
L → ε L.d = 0
Q.4. Quelle est la profondeur de chaque nœud N ?
R → N N.p = 0
N → E(L) L.p = N.p + 1
L → N L1 N.p = L.p
L1 .p = L.p
Q.5. Quelle est la hauteur de l’arbre ?
R → N R.h = N.h
N → E(L) N.h = L.h + 1
L → N L1 L.h = max(N.h, L1 .h)
L → ε L.h = 0
1. La première règle n’est pas nécessaire, mais elle sera utile pour la suite.
1
Examen - Compilation (L3 Info) - semestre 2 - Aix, Luminy, St-Charles - 19/05/2015 - A. Nasr, C. Ramisch, S. Sené
OU
R → N R.h = N.h
N → E(L) N.h = L.h
L → N L1 L.h = max(N.p, L1 .p)
L → ε L.h = 0
Q.6. Combien de feuilles possède l’arbre ?
N → E(L) N.f = L.f + egal(L.d, 0)
L → N L1 L.f = N.f + L1 .f
L → ε L.f = 0
Q.7. Chaque nœud N a-t-il le même degré que la racine ?
R → N N.r = N.d
N → E(L) N.m = egal(N.r, N.d)
L.r = N.r
L → N L1 N.r = L.r
L1 .r = L.r
Q.8. L’arbre est il équilibré (tous ses nœuds internes sont de même degré) ?
R → N R.e = N.e
N → E(L) N.e = egal(N.d, 0) ∨ (N.m ∧ L.e)
L → N L1 L.e = N.e ∧ L1 .e
L → ε L.e = 1
2
Examen - Compilation (L3 Info) - semestre 2 - Aix, Luminy, St-Charles - 19/05/2015 - A. Nasr, C. Ramisch, S. Sené
Figure 1 – Exemple d’un arbre en LATEX (a), avec trois formats (b) (c) (d) qui, compilés, génèrent le même résultat.
3
Examen - Compilation (L3 Info) - semestre 2 - Aix, Luminy, St-Charles - 19/05/2015 - A. Nasr, C. Ramisch, S. Sené
5. Écrivez une fonction en C ayant pour en-tête void affiche_qtree( t_noeud *racine ). Cette fonction prend
en paramètre la racine de l’arbre abstrait, et affiche à l’écran le même arbre au format qtree. Le résultat de l’appel
à cette fonction sur l’exemple de la figure 1(c) doit être 1(b). Remarquez dans la structure de données (lignes 8 à
13) que chaque nœud possède deux pointeurs : vers son premier fils et vers son frère droit.
% void affiche_qtree_rec( t_noeud *root ) {
% if( root != NULL ) {
% printf( "[.%d ", root->etiquette );
% affiche_qtree_rec(root->fils);
% printf("] ");
% affiche_qtree_rec(root->frere);
% }
% }
% void affiche_qtree( t_noeud *root ) {
% printf( "\\Tree" );
% affiche_qtree_rec( root );
% printf( "\n" );
% }
4
Examen - Compilation (L3 Info) - semestre 2 - Aix, Luminy, St-Charles - 19/05/2015 - A. Nasr, C. Ramisch, S. Sené
A Fonctions disponibles
1 #define NODE ’n’
2 #define EDGE ’e’
3 #define CHIFFRE ’0’
4 #define ISNUMBER(a) ( a >= ’0’ && a <= ’9’ )
5 #define erreur(m, ...) { fprintf(stderr, "ERREUR : "); fprintf(stderr, m, __VA_ARGS__); exit(-1); }
6 /******************************************************************************/
7 // noeud de l’arbre abstrait
8 typedef struct t_noeud {
9 int id;
10 int etiquette;
11 struct t_noeud *fils;
12 struct t_noeud *frere;
13 } t_noeud;
14
43 /******************************************************************************/
44 void consommer(char c){
45 if(uc == c)
46 uc = yylex();
47 else
48 erreur("%c attendu, %c trouve\n",c,uc);
49 }
50 /******************************************************************************/