Vous êtes sur la page 1sur 5

I N S T I T U T

SUPÉRIEUR
INFORMATIQUE ISI
‫المعھد العالي لإلعالميّة‬
Examen : Compilation
Date : Mai 2013 – Durée : 2h00
Documents NON autorisés

EXERCICE 1

Un fichier de références bibliographiques en LATEX (fichier .bib) est formé d’un ensemble d’entrées
bibliographiques. Chaque entrée commence par un @, suivi de type du document (article, book, phdthesis, etc.) et,
entre accolades, se trouve l'étiquette et une série d’attributs avec leur valeur (author, title, journal, year, etc.). Les
attributs doivent obligatoirement être séparés par des virgules.
@Type_ref{Label,
Attribut1={nom_attribut1},
Attribut2={nom_attribut2},

Attributn={nom_attributn}
}

On se limite dans cet exercice aux entrées de type « book » qui a comme champ obligatoire : « author », « title »,
« publisher » et « year ». Les références bibliographiques du fichier .bib seront affichées dans un document
LATEX comme suit :
Fichier.bib
@BOOK{designpattern,
title = {The Unified Modeling Language User Guide},
publisher = {Addison-Wesley},
year = {2005},
author = {G. Booch AND J. Rumbaugh AND I. Jacobson}
}
@BOOK{esp,
title = {Enterprise Solution Patterns Using Microsoft .NET Version 2.0},
publisher = {Microsoft Corporation},
year = {2003},
author = {Microsoft Corporation}
}
Affichage de la référence dans le document LaTeX

[1] G. Booch, J. Rumbaugh, and I. Jacobson. The Unified Modeling Language User Guide. Addison-Wesley, 2005.

[2] Microsoft Corporation. Enterprise Solution Patterns Using Microsoft .NET Version 2.0. Microsoft Corporation, 2003.
La numérotation des références dans le document résultat est gérée automatiquement (par ordre d’apparition).
1. Proposer une grammaire permettant de représenter un fichier de références bibliographiques.

FILE → REFLIST
REFLIST → REF REFLIST | ε
REF → ‘@’ TYPE ‘{‘ Key ‘,’ ATTLIST ‘}’
TYPE → 'BOOK'
ATTLIST → TITLE ‘,’ PUBLISHER ‘,’ YEAR ‘,’ AUTHOR
TITLE → 'title' '=' '{ ID '}'
PUBLISHER → 'publisher' '=' '{ ID '}'
YEAR → year' '=' '{ NB '}'
AUTHOR → 'author' '=' '{ ID '}'

2. Proposer une définition dirigée par la syntaxe (DDS) qui permet d’afficher les références dans le document
LATEX.

FILE → {nb_ref = 0} REFLIST


REFLIST → {nb_ref++; print ('[' nb_ref ']')} REF REFLIST | ε
REF → ‘@’ TYPE ‘{‘ Key ‘,’ ATTLIST ‘}’ {print (ATTLIST.author ‘.’ ATTLIST.title ‘.’ ATTLIST.publisher '.' ATTLIST.year '.\n');}
TYPE → 'BOOK'
ATTLIST → TITLE ‘,’ PUBLISHER ‘,’ YEAR ‘,’ AUTHOR
{
ATTLIST.title = TITLE.id;
ATTLIST.publisher = PUBLISHER.id;
ATTLIST.year = YEAR.id
}
TITLE → 'title' '=' '{ ID '}' {TITLE.id = ID}
PUBLISHER → 'publisher' '=' '{ ID '}' {PUBLISHER.id = ID }
YEAR → year' '=' '{ NB '}' {YEAR.id = NB}
AUTHOR → 'author' '=' '{ ID '}' {AUTHOR.id = ID}

Ce schéma de traduction peut être peut être transformé en DDS en procédant le plus simplement possible comme indiqué
dans le cours. Exemple pour la la première règle :

FILE → {nb_ref = 0} REFLIST on peut la transformer de la manière suivante :

FILE → M REFLIST
M → ε {nb_ref = 0}

3. Modifier cette DDS en un schéma de traduction dirigé par la syntaxe permettant de vérifier la validité de
l’année de la référence avant d’afficher le résultat.

Pour le STDS, il suffit d’ajouter une méthode pour vérifier la validité de l’année.
EXERCICE 2

Considérons l'instruction suivante :

switch (EXPRESSION) {
case const1 : inst1; break;
case const2 : inst2; break;
...
default : inst-default; break;
}

const1, const2, etc. sont des constantes scalaires.

4. Ecrire la définition dirigée par la syntaxe permettant de générer le code à trois adresses de cette
instruction.

CORRECTION

I → {I.next = new_label}
'switch' '(' E ')'
{I.code = E.code}
'{' CASES '}'
{Prod (I.next ':')}

CASES → CASE CASES | DEFAULT | ε

CASE → {CASE.next = new_label}


'case' 'const' ':'
{Prod ('if' E.place '!=' const 'GOTO' CASE.next)}
I1
{I.code = I.code ║ I1.code}
'break'
{Prod ('GOTO' I.next)}

DEFAULT → default : I1
{I.code = I.code ║ I1.code}
'break'
{Prod ('GOTO' I.next)}

5. Quel code à trois adresses produit la DDS pour le code C suivant :

switch (rep) {
case 'O' : a = b * b - c * d;
break;
case 'N' : b = b - c * d;
break;
default : a = b = c = d = 0;
break;
}
CORRECTION

100 if rep != 'O' GOTO 150


110 t1 := b * b
120 t2 := c * d
130 a := t1 - t2
140 GOTO 240
150 if rep != 'N' GOTO 200
160 t3 := c * d
170 t4 := b
180 b := t4 - t3
190 GOTO 240
200 a := 0
210 b := 0
220 c := 0
230 d := 0
240 ...
EXERCICE 3
Considérons le fragment de programme suivant
char* str; Donner le code à trois adresses équivalent au fragment de code C
char* res;
char* pc1 = str; donné ci-contre.
char* pc2 = res;
Remarque ce code permet de recopier la chaîne de caractères str
while (*pc2++ = *pc1++);
*pc2 = 0; dans la chaine de caractères res.

100 If *pc1 = 0 GOTO 170


110 *pc2 := *pc1
120 t1 := pc1
130 pc1 := t1 + 1
140 t2 := pc2
150 pc2 := t2 + 1
160 GOTO 100
170 *pc2 := 0

Barème :

Ex. 1 : 8 points Ex. 2 : 8 points Ex. 3 : 4 points

Vous aimerez peut-être aussi