INF243_examen_mai08

Transcription

INF243_examen_mai08
Université Joseph Fourier
Licence L2 “Sciences et Technologies”
UE INF243
Examen du 27 mai 2008
Durée : 2 heures. Sans documents Le barême est donné à titre indicatif.
Préambule. Les questions peuvent être traitées dans n’importe quel ordre, mais il est nécessaire pour cela
de lire l’ensemble de l’énoncé. Tous les programmes sont à écrire en ADA.
Ce devoir porte sur un langage de description de patchworks. Il permet de décrire des motifs carrés, construits
à partir de motifs de base (primitifs) qui sont des lettres majuscules. Les opérateurs permettent d’assembler
les motifs par 4 (avec le +), de tourner un motif, de zoomer sur un des 4 quadrants du carré, ou de raffiner
un de ses quadrants. Voici des exemples d’expressions et de dessins du patchwork correspondant :
A
B
C
D
F
E
G
G
C
A
F
D
B
E
(A+B+C+D)+E+F+G
tourner((A+B+C+D)+E+F+G)
A
B
C
D
F
E
G
G
G
G
affiner((A+B+C+D)+E+F+G) SE
A
B
C
D
zoomer((A+B+C+D)+E+F+G) NW
La sémantique des opérateurs est la suivante :
– M1 + M2 + M3 + M4 est le motif carré dont les quadrants sont M1 (NW), M2 (NE), M3 (SW) et M4 (SE).
– tourner M est le motif obtenu à partir de M par rotation d’un quart de tour dans le sens trigonométrique
(inverse des aiguilles d’une montre) : comme l’opérateur * du projet.
– affiner M Quad est le motif obtenu à partir de M en remplaçant un de ses quadrants Q (spécifié par Quad)
par Q1 + Q2 + Q3 + Q4 où les Qi sont identiques à Q. Si M est un primitif, affiner M Quad est identique
à M.
– zoomer M Quad est le même motif que le quadrant de M spécifié par Quad. Si M est un primitif, zoomer M
Quad est identique à M.
Formellement, le langage est défini à partir de l’ensemble L de lexèmes suivant :
{FIN LIGNE, PARO, PARF, PLUS, TOURNER, AFFINER, ZOOMER, NW, NE, SW, SE, PRIMITIF}1 . La grammaire est
donnée ci-dessous. L’axiome est EXP, les terminaux sont les lexèmes de L, les non-terminaux sont {EXP,
Motif, M, Suite, Quad}. Pour les règles (R2) à (R9) on précise (en gras, entre crochets) les ensembles
directeurs associés.
(R1)
(R2)
(R3)
(R4)
(R5)
(R6)
(R7)
(R8)
(R9)
(R10)
(R11)
(R12)
(R13)
EXP
Motif
M
M
M
M
M
Suite
Suite
Quad
Quad
Quad
Quad
→
→
→
→
→
→
→
→
→
→
→
→
→
Motif FIN LIGNE
M Suite
PRIMITIF
PARO Motif PARF
AFFINER M Quad
ZOOMER M Quad
TOURNER M
PLUS M PLUS M PLUS M
ε
NW
NE
SW
SE
[PRIMITIF, PARO, TOURNER, AFFINER, ZOOMER]
[PRIMITIF]
[PARO]
[AFFINER]
[ZOOMER]
[TOURNER]
[PLUS]
[PARF, FIN LIGNE]
Question 1 (∼ 2 points) : arbre de dérivation
Dessinez l’arbre de dérivation de l’expression tourner(A+B+C+D)
Question 2 (∼ 4 points) : analyse syntaxique et construction de l’arbre abstrait
En Annexes 1 à 4, sont fournis :
– machine lexemes.ads (les spécifications des sous-programmes sont identiques à celles utilisées pendant le
projet).
– le profil des procédures de reconnaissance des non-terminaux de analyseur syntaxique.adb
– arbre abstrait.ads
– construction ast.ads
En utilisant les fonctions et procédures décrites dans ces annexes, écrivez les procédures de reconnaissance
associées aux non-terminaux M otif , M et Suite (Rec Motif, Rec M et Rec Suite) avec construction de
l’arbre abstrait, comme cela a été fait pendant le projet. Dans la procédure Rec M, vous vous limiterez aux
règles (R3), (R4) et (R5).
Question 3 (∼ 3 points) : parcours de l’arbre abstrait et construction du motif
En utilisant les procédures du paquetage construction motif dont la spécification est fournie en Annexe 5,
écrivez le corps de la procédure suivante (similaire à celle utilisée en projet) :
procedure construire (expr : in Ast ; motif : out Patchwork) ;
-- parcourt l’Ast "expr" et construit dans "motif" le patchwork correspondant
1 Référez-vous
à l’Annexe 1 pour les chaı̂nes de caractères correspondantes
2
Question 4 (∼ 7 points) : procédures de construction du motif
Le patchwork à afficher est représenté par un quad-tree. Les carrés élémentaires sont les feuilles, et les noeuds
internes ont 4 fils correspondant au découpage en 4 quadrants du patchwork. Ce type est décrit en Annexe 6.
a. En vous inspirant de l’exemple ci-dessous (quad-tree obtenu pour l’expression : A + tourner B + C + D),
dessinez les quad-trees correspondant aux 4 exemples donnés en préambule de ce sujet, afin de comprendre
les opérations effectuées sur les quad-trees par les différents opérateurs.
carre
nw
carre
ne se sw
A
carre
nw
C
ne se sw
nw
nw
carre
B
carre
ne se sw
nw
ne se sw
D
ne se sw
b. Ecrivez le corps des procédures CreerPLUS, CreerTOURNER et CreerAFFINER du paquetage
construction motif.adb.
Question 5 (∼ 4 points) : affichage
On souhaite obtenir un affichage du patchwork similaire à celui suggéré dans les exemples du préambule : le
patchwork dessiné est toujours un carré, mais les carrés élémentaires ne sont pas tous à la même échelle.
On dispose d’une procédure afficherCarre qui permet d’afficher le contenu d’un carré élémentaire (défini
par le type CarreElementaire) à une échelle donnée. Il n’est pas demandé d’écrire le corps de cette
procédure, mais de répondre “conjointement” aux deux questions suivantes :
a. Proposez une spécification précise pour la procédure afficherCarre : quels sont les paramètres de cette
procédure, qu’affiche t-elle exactement à partir de ces paramètres ?
(vous pouvez illustrer votre réponse par un exemple).
b. Complétez l’en-tête et ecrivez le corps de procédure afficher spécifiée ci-dessous :
procedure afficher(motif : in Patchwork ...............) is
-- etat initial : une fen^
etre graphique carré, de coté TAILLE, est ouverte
-- etat final : le Patchwork "motif" est affiché dans cette fen^
etre (toujours ouverte)
Indication : il n’est pas nécessaire d’utiliser des primitives graphiques pour répondre à cette question, tous
les dessins sont tracés par afficherCarre.
3
Annexe 1 : machine lexemes.ads
package machine_lexemes is
type Nature_Lexeme is (
PLUS,
-- +
TOURNER,
-- tourner
AFFINER,
-- affiner
ZOOMER,
-- zoomer
PARO,
-- (
PARF,
-- )
NE, NW, SE, SW,
-- NE, ...
PRIMITIF,
-- A, ... Z
FIN_LIGNE,
-- retour à la ligne
ERREUR
-- lexeme inconnu
);
type Lexeme is record
nature : Nature_Lexeme;
-- nature du lexeme
prim : Character ;
-- la lettre reprentant le primitif
end record;
procedure demarrer;
procedure demarrer(nom_fichier : String);
procedure avancer;
function lexeme_courant return Lexeme;
function fin_de_sequence return Boolean;
procedure arreter;
end machine_lexemes;
Annexe 2 : spécification de procédures de analyseur syntaxique.adb
procedure rec_exp(resultat : out Ast);
procedure rec_Motif(resultat : out Ast);
procedure rec_Suite(gauche : Ast; resultat : out Ast);
procedure rec_M(resultat : out Ast);
procedure rec_primitif(resultat : out Ast);
procedure rec_quadrant(quad : out TypeQuadrant) ;
-- cette procédure lit le lexème représentant le quadrant
-- et calcule la variable de type TypeQuadrant associée
-- Le type TypeQuadrant est défini dans Arbre_Abstrait.ads
procedure rec_lex(lexeme_attendu : Nature_Lexeme);
procedure traiter_erreur;
Annexe 3 : arbre abstrait.ads
package
type
type
type
Arbre_Abstrait is
TypeAst is (OPERATION, VALEUR) ;
TypeOperateur is (PLUS, TOURNER, ZOOMER, AFFINER) ;
TypeQuadrant is (NE, NW, SE, SW) ;
type NoeudAst;
4
type Ast is access NoeudAst;
type NoeudAst is record
nature : TypeAst;
operateur : TypeOperateur;
nw, ne, sw, se : Ast ; -- les opérandes de PLUS
-- tourner, zoomer et affiner utilisent le seul fils nw
quadrant : TypeQuadrant ; -- le deuxieme operande de zoomer et affiner
valeur : Character ; -- la nature du primitif
end record;
end Arbre_Abstrait;
Annexe 4 : construction ast.ads
with Arbre_Abstrait; use Arbre_Abstrait;
package Construction_Ast is
procedure creer_operation(opr: TypeOperateur; nw, ne, sw, se : Ast
expr : out Ast);
-- A utiliser pour le PLUS
procedure creer_operation(opr: TypeOperateur; opde : Ast ;
expr : out Ast);
-- A utiliser pour TOURNER
procedure creer_operation(opr: TypeOperateur; opde : Ast ; quad : TypeQuadrant ;
expr : out Ast);
-- A utiliser pour AFFINER ET ZOOMER
procedure creer_valeur(val : Character; expr : out Ast);
-- Pour les primitifs ;
end Construction_Ast;
Annexe 5 : construction motif.ads
with Type_Patchwork; use Type_Patchwork;
package Construction_Motif is
procedure creerPrimitif(nature : in Character ; motifCree : out Patchwork);
procedure creerPLUS(motif_ne, motif_nw, motif_se, motif_se : in Patchwork ;
motifCree : out Patchwork);
procedure creerTOURNER(motif : in Patchwork ; motifCree : out Patchwork);
procedure creerZOOMER(motif : in Patchwork ; quadrant : in TypeQuadrant ;
motifCree : out Patchwork);
procedure creerAFFINER(motif : in Patchwork ; quadrant : in TypeQuadrant ;
motifCree : out Patchwork);
end Construction_Motif;
5
Annexe 6 : type patchwork.ads
package Type_Patchwork is
type OrientationCarre is (EST, NORD, OUEST, SUD);
type CarreElementaire is record
nature : Character ;
orientation : OrientationCarre;
end record;
type NoeudPat ;
type Patchwork is access NoeudPat ;
type NoeudPat is record
carre : CarreElementaire ; -- cas d’une feuille.
nw, ne, sw, se : Patchwork ; -- sinon les 4 fils du quad-tree
end record;
end Type_Patchwork;
6

Documents pareils