Differences

This shows you the differences between two versions of the page.

Link to this comparison view

alf:laboratoare:05_fr_java [2023/04/03 17:03]
alexandra.negoita02 [Visiteur de l'arbre]
alf:laboratoare:05_fr_java [2023/04/04 09:19] (current)
alexandra.negoita02 [Exercices]
Line 1: Line 1:
 ====== TP 5 - Parser du langage. Introduction à l'AST ====== ====== TP 5 - Parser du langage. Introduction à l'AST ======
 +<note warning>
 +Vous devez **accepter** l'​assignment d'ici est travailler avec ce **repository**:​ [[https://​classroom.github.com/​a/​g8KTvWH-|Lab 5]]
 +</​note>​
 +
  
 Le principal role du **parser** est de  reconnaître les ordres contextuels décrits par les jetons spécifiés par un ensemble de règles d'​analyse. ​ Le principal role du **parser** est de  reconnaître les ordres contextuels décrits par les jetons spécifiés par un ensemble de règles d'​analyse. ​
Line 135: Line 139:
  
 Pour //visiter// les composants et générer l'​arbre,​ il faut surcharger les méthodes du visiteur de base de la façon suivante: on fait notre classe visiteur, //​MyAlfVisitor//,​ qui va implementer l'​interface du visiteur genree par la grammaire //​AlfVisitor//​. Pour //visiter// les composants et générer l'​arbre,​ il faut surcharger les méthodes du visiteur de base de la façon suivante: on fait notre classe visiteur, //​MyAlfVisitor//,​ qui va implementer l'​interface du visiteur genree par la grammaire //​AlfVisitor//​.
-L'​action de visiter un nœud représente parcourir l'​arbre d'​analyse créé par le parser, la création d'un objet du type de règle mentionné dans l'AST et sa transmission à la notre classe visiteur.+L'​action de visiter un noeud représente parcourir l'​arbre d'​analyse créé par le parser, la création d'un objet du type de règle mentionné dans l'AST et sa transmission à la notre classe visiteur.
  
 <code java> <code java>
Line 205: Line 209:
  
  
-Pour voir le résultat de l'​arbre généré, on va l'afficher ​dans un fichier:+Pour voir le résultat de l'​arbre généré, on utilise le format de notation [[https://​www.w3schools.com/​js/​js_json_intro.asp|JSON]]. Pour utiliser JSON pour afficher des classes Java, on doit telecharger et importer le paquet [[https://​jar-download.com/​artifacts/​com.google.code.gson/​gson/​2.8.2/​source-code|GSON]],​ et de l'ajouter ​dans le projet Intellij avec ''​File > Project Structure > Modules''​. La page de modules doit ressembler à ça: 
 +{{ :​alf:​laboratoare:gson_module.png?​550&​nolink }}
  
-<​code ​javascript+Et le code pour afficher le contenu JSON dans un fichier ''​output.json'':​ 
-const visitor = new MyAlfVisitor(); +<​code ​java
-fs.writeFileSync('./​output.json'JSON.stringify(visitor.visit(tree).toJSON(), null, 4), '​utf8'​);+// Une methode toJSON qui utilise les fonctions du paquet GSON pour interpreter un noeud AST:  
 +static String toJSON(ASTNode ​visitor) { 
 +        GsonBuilder builder ​= new GsonBuilder(); 
 +        ​builder.setPrettyPrinting(); 
 +        Gson gson = builder.create(); 
 +        return gson.toJson(visitor);​ 
 +    } 
 +     
 +// Appeller dans Main.java:​ 
 +writeToFile("​files\\output.json"toJSON(visitor.visit(tree)));​
 </​code>​ </​code>​
 +Pour un fichier ''​sample.txt''​ contenant le texte ''​int _var = 5;''​
 +{{ :​alf:​laboratoare:​json_output.png?​550&​nolink }}
  
  
 <note important>​ <note important>​
-Après chaque modification apportée à la grammaire (fichier ''​Alf.g4''​),​ vous devez exécuter la commande suivante pour enregistrer ​les changements:​ <code bash> +Après chaque modification apportée à la grammaire (fichier ''​alf.g4''​),​ vous devez generer de nouveau ​les fichiers de ANTLR, avec clic-droit sur le fichier de grammaire ​> ''​Generate ANTLR Recognizer''​
-npm run antlr4ts +
-</​code>​ +
- +
-Après chaque modification apportée au fichier ​''​index.ts''​, vous devez exécuter les commandes suivantes pour voir le résultat correct: <code bash> +
-npx tsc +
-node index.js +
-</​code>​+
 </​note>​ </​note>​
  
 ===== Exercices ===== ===== Exercices =====
  
-  - Créez un nouveau projet ANLTR4. ​Téléchargez la structure du TP depuis le [[https://​github.com/​UPB-FILS-ALF/​TP/​tree/​main/​TP5|github repository]], inspectez la structure de la grammaire ​et complétez les fonctions **toJSON()** selon les indications marquées par TODO. **(2p)** +  - Téléchargez la structure du TP depuis le github repository ​donnétéléchargez et importez l'​archive GSON comme dit dans le laboratoire,​ et inspectez la structure de la grammaire. **(1p)** 
-  - Ajoutez au fichier de grammaire les règles pour accepter plusieurs instructions. Les instructions peuvent etre séparées par '';''​ et une ou plusieurs lignes vides. Ajoutez les classes et les méthodes nécessaires pour pouvoir visiter les noeuds. Dans l'AST, chaque instruction doit etre ajoutée dans la liste //​statements//​ du noeud principal. Testez le programme pour les instructions suivantes: **(3p)** <code bash>​float _var1 = 7.5;+  - Ajoutez au fichier de grammaire les règles pour accepter plusieurs instructions. Les instructions peuvent etre séparées par '';''​ et une ou plusieurs lignes vides. Ajoutez les classes et les méthodes nécessaires pour pouvoir visiter les noeuds. Dans l'AST, chaque instruction doit être ajoutée dans la liste //​statements//​ du noeud principal. Testez le programme pour les instructions suivantes: **(3p)** <code bash>​float _var1 = 7.5;
 string _var2 = '​alf';</​code>​ string _var2 = '​alf';</​code>​
-   - Ajoutez à la grammaire décrite dans l'​exemple les règles nécessaires pour l'​utilisation des expressions (plusieurs expressions) du laboratoire précédent. Votre grammaire doit accepter ​maintenent ​aussi les déclarations des variables, que les expressions. Ajoutez les classes et les méthodes nécessaires pour visiter les nouveaux noeuds et générer ​l'​arbre. Le noued correspondant aux expressions doit avoir les propriétés suivantes:, //id: "​expression"//,​ //left// (le neoud correspondant a l'​opérande de gauche), //right// (le neoud correspondant a l'​opérande de droite), //op// (la valeur de l'​opérateur) Testez la correctitude de votre grammaire en lisant les instructions suivantes depuis un fichier texte: **(3p)** <code bash> int _var1 = 1;+   - Ajoutez à la grammaire décrite dans l'​exemple les règles nécessaires pour l'​utilisation des expressions (plusieurs expressions) du laboratoire précédent. Votre grammaire doit accepter ​maintenant ​aussi les déclarations des variables, que les expressions. Ajoutez les classes et les méthodes nécessaires pour visiter les nouveaux noeuds et générez ​l'​arbre. Le noued correspondant aux expressions doit avoir les propriétés suivantes:, //id: "​expression"//,​ //left// (le neoud correspondant a l'​opérande de gauche), //right// (le neoud correspondant a l'​opérande de droite), //op// (la valeur de l'​opérateur)Testez la correctitude de votre grammaire en lisant les instructions suivantes depuis un fichier texte: **(3p)** <code bash>int _var1 = 1;
 5*(2+4)/​7;</​code>​ 5*(2+4)/​7;</​code>​
-   - Ajoutez des règles et modifiez les méthodes du **Visitor** pour que les variables puissent prendre des valeurs qui sont des expressions. Testez pour l'​instruction suivante: **2p** <code bash>​float _var1 = 5*(2+4)/​7;</​code>​ +   - Ajoutez des règles et modifiez les méthodes du **Visitor** pour que les variables puissent prendre des valeurs qui sont des expressions. Testez pour l'​instruction suivante: **(3p)** <code bash>​float _var1 = 5*(2+4)/​7;</​code>​
-   - **BONUS**: Affichez le contenu de l'​arbre d'​analyse dans un fichier ayant le format ''​JSON''​. **(1p)**+
  
  
  
alf/laboratoare/05_fr_java.1680530638.txt.gz · Last modified: 2023/04/03 17:03 by alexandra.negoita02
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0