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