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