Devoir de compilation
Transcription
Devoir de compilation
Devoir de compilation Université Lille1 UFR IEEA Licence info, S5 2nde session 2011-2012 COMPIL -3h- Février 2012 FIL Tous documents autorisés. Sujet : 3 pages Exercice 1 : Grammaire d’une représentation texuelle de diagrammes UML On s’intéresse dans cet exercice à un DSL permettant de décrire la représentation textuelle de diagrammes de classe et paquetage UML (version très simplifiée). Un diagramme décrit un ensemble non vide de paquetages. Sa représentation textuelle est la liste des représentations textuelles de ces paquetages. Un paquetage est décrit par le mot-clé package, suivi du nom du paquetage (un identificateur Java) suivi de la description du contenu du paquetage commençant par { et terminant par }. Le contenu d’un paquetage commence par la liste éventuelle des sous-paquetages qu’il contient. Ensuite on trouve la description des classes (liste éventuellement vide de descriptions de classes) contenues dans ce paquetage, puis des relations entre ces classes (s’il y en a). Une classe est décrite par le mot-clé class suivi du nom de la classe suivi entre { et } de la liste des attributs de la classe. Il n’y a pas de classes internes. Un attribut est représenté par son nom (un identificateur Java) suivi de : puis de son type (String ou Integer) terminé par ;. Le mot-clé %relation suivi de { permet de décrire une liste non vide de relations entre classes, terminée par }. Une relation est représentée par deux noms de classe séparés par -, <->, -> ou <-, et est terminée par ;. À titre d’exemple, au diagramme de droite correspond la description de gauche : package appli { package core { package exc {} class User { name : String; x : Integer; } class Job {} class Task {} %relation{ User - Job; Job - Task; } } package gui { class Frame {} } } appli core User exc gui String name int x Job Frame Task Q 1. 1 : Donner une grammaire algébrique qui engendre toutes les descriptions de diagrammes. Souligner tous les terminaux et entourer l’axiome. Vous devez écrire une grammaire algébrique sans utiliser la notation eBNF vue en TP. 2 Q 1.2 : On s’intéresse à l’analyse lexicale du DSL : 1. Pour chaque terminal de votre grammaire, donner une description régulière correspondante. Vous pouvez utiliser une syntaxe à la JFlex. 2. Indiquer les priorités entre symboles s’il y a lieu. 3. Donner les symboles reconnus par l’analyseur lexical et non retournés à l’analyseur syntaxique. 2 Q 1. 3 : Le DSL des diagrammes est-il un langage algébrique ? Est-il un langage régulier ? Justifier le plus rigoureusement possible. 2 2nde session 2011-2012 COMPIL Devoir de compilation Exercice 2 : Grammaires attribuées On s’intéresse à la représentation interne des factures d’une entreprise qui vend des produits d’équipement. Pour simplifier on s’intéresse juste à une ligne de la facture. Une ligne indique soit : – la facturation d’un seul produit : on donne alors le prix unitaire hors taxe (HT), le nombre d’unités facturées, et le taux applicable de la taxe dite TVA ; – la facturation d’un lot de produits pour lesquels une remise est effectuée par soustraction sur le prix unitaire hors taxe (par exemple remise de 3e par produit). Voilà deux exemples de lignes. exemple1 : produit1 100 4 19.6 exemple2 : 5 ( produit2 55 10 5.5 , produit3 115 2 19.6 ) La première (exemple1) représente la facturation du produit produit1, de prix unitaire 100e, facturé en 4 exemplaires, avec une TVA de 19.6%. La seconde (exemple 2) représente la facturation d’un lot de 2 produits (produit2 et produit3) avec une remise de 5e sur le prix unitaire HT de chaque produit. Le produit produit2 a un prix unitaire de 55e, est facturé en 10 exemplaires, avec une TVA de 5.5%, etc. Le but de l’exercice est de calculer le montant toute(s) taxe(s) comprise(s) (TTC) d’une ligne de facturation, sans puis avec la remise appliquée aux lots. Pour l’exemple1, le montant TTC est 100*4*(1 + 19.6/100)e. Pour l’exemple2, le montant TTC sans remise est 55*10*(1 + 5.5/100) + 115*2*(1 + 19.6/100)e. Le montant TTC avec remise est (55 - 5)*10*(1 + 5.5/100) + (115 - 5)*2*(1 + 19.6/100)e. On considère la grammaire Gl suivante qui engendre l’ensemble des lignes de facturation. L’axiome est ligne, les terminaux sont en majuscule. ligne → produit | remise lot remise → FLOAT lot → PO listeProduits PF listeProduits → produit | produit VIRG listeProduits produit → STRING prixUnitaire quantite tva prixUnitaire → FLOAT quantite → INTEGER tva → FLOAT Q 2.1 : Donner un arbre syntaxique pour les mots STRING FLOAT INTEGER FLOAT et FLOAT PO STRING FLOAT INTEGER FLOAT VIRG STRING FLOAT INTEGER FLOAT PF correspondant aux exemples donnés ci-dessus. 2 Q 2.2 : Le langage engendré par Gl est-il régulier ? Justifier le plus rigoureusement possible. 2 Q 2.3 : Expliquer précisément pourquoi Gl n’est pas LL(1). 2 Dans la suite on va attribuer Gl . Vous devez utiliser les notations vues en TD. Vous pouvez écrire les actions en pseudo-code. Vous n’êtes pas obligé de recopier les productions qui ne sont pas attribuées. Vous pouvez abbréger listeProduits en liste, produit en prod, etc. Votre grammaire doit néanmoins rester lisible. Q 2.4 : Attribuer Gl pour associer à chaque ligne la quantité d’unités facturées (c’est à dire 4 pour l’exemple1 et 10+2 pour l’exemple2). Préciser pour chaque attribut s’il est hérité ou synthétisé. 2 Q 2. 5 : Attribuer Gl pour associer à chaque ligne son montant TTC sans remise. Préciser pour chaque attribut s’il est hérité ou synthétisé. 2 Q 2.6 : Attribuer Gl pour associer à chaque ligne son montant TTC avec remise, en utilisant uniquement des attributs synthétisés. Pour ce faire : – donner sous forme d’un diagramme UML une structure de données qui représente un produit ; – utiliser cette structure de données dans l’attribution (les actions pourront être écrites en pseudo-Java). 2nde session 2011-2012 COMPIL Devoir de compilation 2 Exercice 3 : Grammaires ambigües et générateurs d’analyseurs syntaxiques On veut écrire une grammaire à opérateurs décrivant les expressions logiques construites sur le type bit. Un litéral de type bit est par exemple 0b1010. On utilise les opérateurs suivants, listés par priorité croissante : – opérateur de conjonction bit à bit &, binaire, associatif à gauche ; – opérateur de décalage à droite >>, binaire, qui prend en premier argument un bit à décaler et en second argument un entier positif (le nombre de positions décalées) ; – opérateur d’inversion bit à bit ~, unaire. On pourra par exemple écrire 0b001 & 0b11 >> 2 ou ~ 0b1010. Q 3. 1 : Donner une grammaire à opérateurs Ga ambiguë décrivant les expressions logiques. Il n’est pas demandé de détailler les entités lexicales. Vous devez donner une grammaire à opérateurs ambigüe standard comme vu en cours/TP/TP et pas une grammaire farfelue arbitrairement ambigüe. 2 Q 3.2 : Prouver rigoureusement que Ga est ambigüe. 2 Q 3.3 : Expliquer comment l’outil Cup permet de traiter Ga . Inutile d’utiliser la syntaxe de Cup, juste expliquer le mécanisme. 2 Q 3.4 : Expliquer pourquoi l’outil ANTLR ne propose pas ce mécanisme. 2 Exercice 4 : Analyse descendante LL(1) On considère la grammaire G d’axiome X, de terminaux {a, b, d, e} et de productions : X → Y ZT | dY Y → aY | Z → bY | T → e|a Q 4.1 : Donner un arbre syntaxique pour les mots abe et a. 2 Q 4.2 : Donner l’ensemble des non-terminaux -productifs. 2 Q 4.3 : Calculer les ensembles Premier et Suivant, en donnant le détail des calculs. 2 Q 4.4 : Donner la table d’analyse LL(1) de G et justifier à partir de cette table que G n’est pas LL(1). 2