Examen - Compilation (L3 Info) Durée : 2h - documents interdits 19 mai 2015

Documents pareils
Les structures de données. Rajae El Ouazzani

Les arbres binaires de recherche

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Bases de programmation. Cours 5. Structurer les données

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Rappels Entrées -Sorties

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Le langage C. Séance n 4

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Les structures. Chapitre 3

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

TD3: tableaux avancées, première classe et chaînes

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours d initiation à la programmation en C++ Johann Cuenin

Chapitre 10 Arithmétique réelle

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Le prototype de la fonction main()

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Cours Programmation Système

OS Réseaux et Programmation Système - C5

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Claude Delannoy. 3 e édition C++

Algorithmique et Programmation, IMA

Programmation système I Les entrées/sorties

Java Licence Professionnelle CISII,

Traduction des Langages : Le Compilateur Micro Java

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Conventions d écriture et outils de mise au point

Algorithmique, Structures de données et langage C

Programmation en langage C

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Introduction au langage C

Cours d Algorithmique et de Langage C v 3.0

Arbres binaires de recherche

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation impérative

I. Introduction aux fonctions : les fonctions standards

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

SUPPORT DE COURS. Langage C


INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Représentation d un entier en base b

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Analyse de sécurité de logiciels système par typage statique

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Les fichiers. Chapitre 4

Cours 1 : La compilation

Introduction à la Programmation Parallèle: MPI

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

MIS 102 Initiation à l Informatique

Cours de Systèmes d Exploitation

Licence Sciences et Technologies Examen janvier 2010

STAGE IREM 0- Premiers pas en Python

Compression de Données - Algorithme de Huffman Document de Conception

données en connaissance et en actions?

UE C avancé cours 1: introduction et révisions

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Utilisation d objets : String et ArrayList

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Initiation à la Programmation en Logique avec SISCtus Prolog

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

ACTIVITÉ DE PROGRAMMATION

Programmation système en C/C++

Grammaires d unification

Programmation C++ (débutant)/instructions for, while et do...while

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Génie Logiciel avec Ada. 4 février 2013

Cours de Système : Gestion de Fichiers

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Maple: premiers calculs et premières applications

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

ARBRES BINAIRES DE RECHERCHE

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Le système de gestion des fichiers, les entrées/sorties.

GOL502 Industries de services

Présentation du langage et premières fonctions

OCL - Object Constraint Language

Rappels sur les suites - Algorithme

Les processus légers : threads. Système L3, /31

Chapitre 11. Séries de Fourier. Nous supposons connues les formules donnant les coefficients de Fourier d une fonction 2 - périodique :

UE Programmation Impérative Licence 2ème Année

Architecture des ordinateurs

Programme awk------introduction rapide

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Chap III : Les tableaux

PROJET 1 : BASE DE DONNÉES REPARTIES

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Programmer en JAVA. par Tama

Générer du code à partir d une description de haut niveau

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Transcription:

1 Grammaires attribuées Examen - Compilation (L3 Info) Durée : 2h - documents interdits 19 mai 2015 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 grammaire. 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 NL 1 L.n = N.n + L 1.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 NL 1 L.d = L 1.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 NL 1 N.p = L.p L 1.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 NL 1 L.h = max(n.h, L 1.h) L ε L.h = 0 1. La première règle n est pas nécessaire, mais elle sera utile pour la suite. 1

OU R N R.h = N.h N E(L) N.h = L.h L NL 1 L.h = max(n.p, L 1.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 NL 1 L.f = N.f + L 1.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 NL 1 N.r = L.r L 1.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 NL 1 L.e = N.e L 1.e L ε L.e = 1 2 Compilateur d arbres L A TEX Il existe de nombreuses bibliothèques L A TEX pour dessiner des graphes et des arbres dans des documents, par exemple les bibliothèques qtree et tikz. L objectif de cet exercice est d écrire un compilateur en C qui transforme un arbre au format tikz en un arbre au format qtree. La figure 1 présente l arbre de l exercice précédent (a) dans les formats qtree (b) et tikz (c, d). Arbre qtree : pour obtenir le résultat (a) avec qtree, nous utilisons une représentation parenthésée similaire à l exercice précédent, montrée en (b). Chaque sous-arbre est entouré de crochets [ et ]. Le crochet ouvrant est immédiatement suivi d un point., lui-même suivi de l étiquette du nœud. Pour simplifier, nous considérons comme étiquettes possibles les entiers de 0 à 9. L étiquette est suivie de la liste des sous-arbres séparés par des espaces. Cette liste est vide dans le cas d une feuille. Arbre tikz : pour obtenir le résultat (a) avec tikz, nous utilisons une liste de nœuds, montrée en (c) et (d). Chaque nœud commence par la commande \node et se termine par un point-virgule ;. Il contient obligatoirement une étiquette (un nombre entier entre 0 et 9), entre accolades. Entre la commande \node et l étiquette, il est possible de spécifier entre parenthèses un identificateur pour le nœud. Pour simplifier, l identificateur dans les exemples est identique à l étiquette. Après l étiquette, il est possible de spécifier une liste d arcs vers des nœuds déjà déclarés. Il est impossible de rajouter un arc vers un nœud qui est déclaré plus loin. Chaque arc est représenté par le mot-clef edge suivi, entre parenthèses, de l identificateur du nœud vers lequel il pointe. Les arcs de la liste sont séparés par des espaces. Pour représenter des arbres, deux ordres sont possibles : 1. rootfirst : la racine est le premier nœud à être déclaré. Ensuite, chaque nœud possède exactement un arc vers son père. Les feuilles n ont pas besoin d identificateur. La racine est le seul nœud qui ne possède pas d arc. 2. rootlast : la racine est le dernier nœud à être déclaré. Chaque nouveau nœud déclaré possède une liste d arcs vers ses fils. La racine n a pas besoin d identificateur. Les feuilles ne possèdent pas d arc. 1. Écrivez une grammaire LL(1) qui reconnaît un arbre tikz. Cette grammaire doit en particulier reconnaître les entrées 1(c) et 1(d). Afin de faciliter la manipulation et l implémentation de la grammaire, essayez de minimiser le nombre de symboles non terminaux. Utilisez les symboles terminaux ci-dessous, renvoyés par l analyseur lexical : NODE : commande \node EDGE : mot-clef edge CHIFFRE : chiffre entre 0 et 9 Caractères { } ( ) ; 2

1 2 4 3 \Tree[.1 [.2 [.3 ] ] [.4 ] ] \node (1) {1}; \node (2) {2} edge (1); \node {4} edge (1); \node {3} edge (2); \node (3) {3}; \node (2) {2} edge (3); \node (4) {4}; \node {1} edge (2) edge (4); (a) Exemple d arbre, résultat de (b) (c) (d) (b) Source L A TEX de l exemple, bibliothèque qtree (c) Source L A TEX de l exemple, bibliothèque tikz, ordre rootfirst (d) Source L A TEX de l exemple, bibliothèque tikz, ordre rootlast Figure 1 Exemple d un arbre en L A TEX (a), avec trois formats (b) (c) (d) qui, compilés, génèrent le même résultat. 1. liste_noeuds -> noeud liste_noeuds 2. liste_noeuds -> 3. noeud -> NODE opt_id { CHIFFRE } opt_liste_edges ; 4. opt_id -> ( CHIFFRE ) 5. opt_id -> 6. opt_liste_edges -> EDGE ( CHIFFRE ) opt_liste_edges 7. opt_liste_edges -> 2. Calculez les Premier et Suivant pour chaque non terminal de la grammaire. Ensuite, construisez la table d analyse LL(1) de la grammaire. Premier Suivant NODE EDGE CHIFFRE { } ; ( ) liste_noeuds NODE ε 1 2 noeud NODE NODE 3 opt_id ( ε { 5 4 opt_liste_edges EDGE ε ; 6 7 Remarque : Pour les deux questions suivantes, vous pouvez écrire un seul programme. 3. Écrivez un reconnaisseur LL(1) en C qui implémente la table d analyse et reconnaît des entrées au format tikz. Vous pouvez utiliser directement les fonctions fournies dans l annexe A. 4. Enrichissez l analyseur de la question précédente de manière à créer un arbre abstrait lors de la reconnaissance. Nous nous intéressons désormais uniquement aux arbres décrits avec la stratégie rootfirst. L annexe A présente les fonctions creer_noeud et ajoute_fils (lignes 20 à 41) que vous devez utiliser pour créer et relier les nœuds entre eux. % void opt_liste_edges( t_noeud *fils ) { % if( uc == EDGE ) { % consommer( EDGE ); % consommer( ( ); % ajoute_fils( yyval, fils ); % consommer( ) ); % opt_liste_edges( fils ); % else if( uc!= ; ) % erreur( " ; attendu, %c trouvé\n", uc ); % int opt_id() { % int id = -1; % if( uc == ( ) { % consommer( ( ); % id = yyval; % consommer( ) ); % else if( uc!= { ) 3

% erreur( " { attendu, %c trouvé\n", uc ); % return id; % t_noeud *noeud() { % int id = -1, etiquette; % t_noeud *$$; % consommer( NODE ); % id = opt_id(); % consommer( { ); % etiquette = yyval; % consommer( } ); % $$ = creer_noeud( id, etiquette ); % opt_liste_edges( $$ ); % consommer( ; ); % return $$; % t_noeud *liste_noeuds() { % t_noeud *$$; % if(uc == NODE) { % $$ = noeud(); % liste_noeuds(); % return $$; /* Seulement le premier noeud compte */ % else if(uc!= EOF) % erreur("noeud ligne %d non reconnu", nbligne); 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

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 15 t_noeud *noeuds[ 10 ] = { NULL }; // table des symboles simplifiee 16 int uc; //unite courante 17 FILE *yyin; //fichier source tikz 18 int yyval = -1; //valeur d un chiffre 19 /******************************************************************************/ 20 t_noeud *creer_noeud(int id, int etiquette) { 21 t_noeud *n = malloc(sizeof(t_noeud)); 22 n->id = id; n->etiquette = etiquette; 23 n->fils = NULL; n->frere = NULL; 24 if( id >= 0 && noeuds[id] == NULL ) 25 noeuds[id] = n; 26 else if( id >= 0 ) 27 erreur( "Deux noeuds avec le meme ID %d\n", id ); 28 return n; 29 } 30 /******************************************************************************/ 31 void ajoute_fils(int id_pere, t_noeud *fils) { 32 t_noeud *na = noeuds[id_pere]; 33 if( na->fils == NULL ) 34 na->fils = fils; 35 else { 36 na = na->fils; 37 while(na->frere!= NULL) 38 na = na->frere; 39 na->frere = fils; 40 } 41 } 42 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 /******************************************************************************/ 5