CSC 4508 - Traduction: TP noté 2010-2011
De GWT à JavaScript + HTML: affichage d'une arborescence
Avec la prolifération des langages informatiques, en particulier pour le web,
de nombreux transcodages d'un langage vers un autre apparaissent. Par exemple,
si on utilise Google Web Toolkit, on développe l'application web entièrement en Java,
puis le logiciel GWT traduit en JavaScript + HTML.
Objectif de l'exercice
Dans cet exercice, nous nous limitons à une traduction de Java vers HTML, pour un code affichant une arborescence :
- l'extrait de programme Java affichant une arborescence : jTreeSrc.txt,
- l'extrait de programme Java affichant une arborescence : jTreeSrcBis.txt,
- l'extrait de programme Javascript + HTML à générer : jsTreeObject.txt.
Démonstration
Afficher une arborescence avec Java
jTreeSrc.txt
est extrait de JTree0.java (visualisation : compiler/exécuter JTree0.java
)
Afficher une arborescence avec Javascript + HTML
jsTreeObjet.txt
est extrait de jsTree.htm
permettant à un navigateur de visualiser l'arbre
correspondant.
- Visualiser le fichier jsTree.htm.
Le répertoire JSTree inclut : le code HTML
jsTree.htm
, le code JavaScript mktree.js
, la feuille
de style mktree.css
, et 3 icônes .gif
.
Dans les 2 cas, vérifiez que les arbres affichés sont expansibles / rétractables par clics.
1 - Analyseur lexical seul (2 points)
Mettre au point un analyseur lex1.flex
reconnaissant toutes
les unités lexicales utiles de jTreeSrc.txt.
- reconnaître les caractères isolés suivants :
. = ( ) " , ;
- reconnaître chaque mot-clé du langage Java apparaissant dans
jTreeSrc.txt
ainsi que DefaultMutableTreeNode
, JTree00
et addObject
,
- reconnaître les symboles de programmation. Pour chaque chaîne reconnue,
affichez dans un premier temps:
SYMBOL
.
- reconnaître les chaînes de caractères correspondants aux valeurs choisies
par le programmeur. Dans
jTreeSrc.txt
, il faudra par exemple
reconnaître : P1
, P2
...
Pour chaque chaîne reconnue,
affichez dans un premier temps: STRINGVALUE
.
Indications
- Donner des définitions de noms pour simplifier l'écriture des règles
- Imprimer chaque unité lexicale reconnue (pour vérification) au moyen d'une fonction auxiliaire incluse dans le prologue
- Traiter les autres caractères possibles (espaces, tabulations, à-la-ligne) simplement, en les imprimant par exemple
- Implanter une règle-balai affichant tout caractère inattendu en entrée.
2 - Mise au point d'une grammaire minimale avec passage de valeurs (3 points)
Mettre au point un analyseur lex2.flex, gram2.bison,
prin.c
définissant les catégories lexicales correspondant à celles reconnues dans la question précédente.
La grammaire doit contenir deux règles :
- une règle
Text
(texte acceptable en entrée) permettant
de reconnaître une suite de LexUnit
,
- une règle
LexUnit
permettant de reconnaître chacune des catégories lexicales définies ci-dessus.
Indications
- Au niveau lexical
- pour simplifier, ne pas retourner
d'éléments syntaxiques pour
\n
et
espace
- en dehors de
\n
et
espace
, aucune impression ne sera faite au niveau lexical
- les éléments seuls dans leur catégorie sont passés directement. Leur valeur sert aussi à coder la catégorie;
- les caractères inattendus doivent être retournés à l'analyseur syntaxique
- Au niveau syntaxique
- pour chaque catégorie lexicale reçue, faire,
au niveau syntaxique, une impression
de vérification caractéristique.
- afficher les valeurs des éléments correspondant aux catégories lexicales
SYMBOL
et STRINGVALUE
,
- pour simplifier, l'analyseur lexical passera la chaîne
yytext
à l'analyseur syntaxique sans conversion
(c'est-à-dire yylval
de type char *
).
3 - Reconnaissance de la structure syntaxique (3 points)
Créez l'analyseur lex3.flex
, gram3.bison
et prin.c
permettant de reconnaître la structure de jTreeSrc.txt
. Créer les règles suivantes:
NodeDef
: pour reconnaître une instruction permettant de définir un nouveau noeud avec un nom
NodeAdd
: pour reconnaître une instruction permettant d'attacher un noeud à un autre noeud
TreeDef
: pour reconnaître reconnaître une instruction permettant de définir le nom donné à l'arbre et le nom du noeud racine
Instruction
: pour reconnaître une des trois types d'instructions définies précédemment,
Program
: pour reconnaître une liste d'instructions.
telles qu'il n'y ait aucun conflit de type réduction/réduction ou de type décalage/réduction entre les règles.
Indications
- dans cette question, le fichier
lex3.flex
est identique à lex2.flex
- pour la mise au point, associer aux règles des actions
d'impression de contrôle simples au niveau syntaxique
- pour cette question, on n'impose pas d'ordre entre les instructions à
reconnaître. Ainsi un
TreeDef
pourrait citer des noms de noeuds avant que
ceux-ci n'aient été définis. Ces contraintes seront vérifiées plus tard.
4 - Table de symboles (5 points)
En utilisant le module symbolMgt
préparé (voir la préparation), créez l'analyseur lex4.flex
, gram4.bison
enregistrant dans une table de symboles les différentes variables du programme :
- les symboles représentant un arbre,
- les symboles représentant un noeud d'un arbre.
Une fois le fichier lu, l'analyseur doit afficher la table des symboles.
On suppose ici le texte source jTreeSrc.txt
sans erreur sur les symboles.
Signalez des erreurs non directement syntaxiques :
- symbole défini 2 fois,
- dans une définition d'arbre, noeud référencé mais encore pas défini.
On prendra comme exemple le fichier jTreeSrc.bad.txt.
5 - Génération de code (4 points)
En utilisant le module treeMgt
préparé (voir la préparation), créez l'analyseur lex5.flex
, gram5.bison
générant le fichier jsTreeObject.txt
à partir du fichier jTreeSrc.txt
.
Pour cela, utilisez les informations stockées dans la table de symboles. Dans un 1er temps on ne demande pas de réaliser une indentation.
Bonus ( + 1 point )
Modifier la fonction pour réaliser l'indentation comme dans l'exemple.
6 - Un perfectionnement à la grammaire (3 points)
Vous pouvez repartir de la question 3.
L'extrait jTreeSrc.txt
était en fait une
simplification de jTreeSrcBis.txt, extrait d'un
programme réel.
- Modifier votre grammaire pour pouvoir traiter
jTreeSrcBis.txt
.
- Ajouter une gestion d'erreur afin de pouvoir traiter l'intégralité du fichier
Demos/JavaTree/JTree0.java.
Supprimez tous les conflits.
CSC 4508, Télécom SudParis, INF, F. MEUNIER, F. SILBER-CHAUSSUMIER, M. SIMATIC
Last modified: Mon May 9 16:17:47 CEST 2011