This shows you the differences between two versions of the page.
alf:laboratoare:08_fr_java [2023/05/01 23:49] alexandra.negoita02 [Exercises] |
alf:laboratoare:08_fr_java [2023/05/02 10:24] (current) alexandra.negoita02 [Exercises] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== TP 8 - Génération de code ====== | ====== TP 8 - Génération de code ====== | ||
+ | <note warning> | ||
+ | Vous devez **accepter** l'assignment d'ici est travailler avec ce **repository**: [[https://classroom.github.com/a/77p5JNmk|Lab 8]] | ||
+ | </note> | ||
===== Three Address Code ===== | ===== Three Address Code ===== | ||
Line 117: | Line 120: | ||
; | ; | ||
</code> | </code> | ||
- | |||
- | <code javascript index.js> | ||
- | import { ASTNode } from "./index"; | ||
- | import symbol_tree from './index'; | ||
- | import { Expression, ValueNode, AttributionNode, FunctionCallNode } from './index'; | ||
- | |||
- | var variable_id = 0; | ||
- | |||
- | let results: string[] = []; | ||
- | function nextVar () | ||
- | { | ||
- | return 'var' + variable_id++; | ||
- | } | ||
- | |||
- | |||
- | function writeThreeAddressCode (node) | ||
- | { | ||
- | if (node.id === 'StatementsNode') | ||
- | { | ||
- | for (var statement of node.statements) | ||
- | { | ||
- | writeThreeAddressCode(statement); | ||
- | } | ||
- | } | ||
- | else | ||
- | if (node instanceof FunctionCallNode) | ||
- | { | ||
- | /**TODO: | ||
- | * generate the three address code for each parameter of the node.parameters array | ||
- | * write on the screen the three address code for each parameter | ||
- | * node.result will be nextVar() | ||
- | * write on the screen the three address code for function call | ||
- | */ | ||
- | } | ||
- | else | ||
- | if (node instanceof ValueNode) | ||
- | { | ||
- | // the result for a number is the number itself | ||
- | node.result = node.value; | ||
- | } | ||
- | else | ||
- | if (node instanceof AttributionNode) | ||
- | { | ||
- | /** TODO: | ||
- | * generate the three address code for node.value | ||
- | * write on the screen the three address code for an attribution*/ | ||
- | } | ||
- | else | ||
- | if (node instanceof Expression) | ||
- | { | ||
- | if (node.left !== undefined && node.right !== undefined) | ||
- | { | ||
- | writeThreeAddressCode (node.left); | ||
- | writeThreeAddressCode (node.right); | ||
- | |||
- | // node.left.result is the result of node.left | ||
- | // node.right.result is the result of node.right | ||
- | | ||
- | /** TODO: | ||
- | * node.result will be nextVar() | ||
- | * write on the screen the three address code based on result, left result, right result and operator*/ | ||
- | } | ||
- | } | ||
- | } | ||
- | |||
- | var ast = parser.parse (str); | ||
- | console.log (JSON.stringify(ast, null, 4)); | ||
- | |||
- | writeThreeAddressCode(ast); | ||
- | |||
- | |||
- | </code> | ||
- | |||
===== Exercises ===== | ===== Exercises ===== | ||
- Dans le fichier **ex1.txt** écrivez le //three address code// pour les expressions suivantes (**1p**) | - Dans le fichier **ex1.txt** écrivez le //three address code// pour les expressions suivantes (**1p**) | ||
- | * (4+2)/5-3 | ||
* (4+2)/5-3 | * (4+2)/5-3 | ||
* e = (a-2)+(a-5) | * e = (a-2)+(a-5) | ||
Line 215: | Line 144: | ||
double (7/2); | double (7/2); | ||
</code> | </code> | ||
- | - Téléchargez [[https://github.com/UPB-FILS-ALF/TP/tree/main/TP8 | la structure]] du tp. Pour les exercices suivants vous devez modifier seulement le contenu du fichier et **three_address_code.ts**. Exécutez le parser du laboratoire et écrivez un programme qui génere le three address code pour le noeud //expression// et vérifiez avec le fichier //ex4.txt// (**Indice**: Pour nommer les variables temporaires, vous pouvez prendre un compteur global que vous incrémentez chaque fois que vous avez besoin d'une autre variable). (**2p**) | + | - Pour les exercices suivants vous devez modifier seulement le contenu du fichier et **ThreeAddressCode.java**. Exécutez le parser du laboratoire et écrivez un programme qui génere le Three Address Code pour le noeud //expression// et vérifiez avec le fichier //ex4.txt// (**Indice**: Pour nommer les variables temporaires, vous pouvez prendre un compteur global que vous incrémentez chaque fois que vous avez besoin d'une autre variable - nextVarName()). (**2p**) |
- | - Écrivez un programme qui écrit le three address code pour le noeud //AttributionNode// et vérifiez la corectitude avec le fichier //ex5.txt//(**2p**) | + | - Écrivez un programme qui écrit le Three Address Code pour le noeud //AttributionNode// et vérifiez la corectitude avec le fichier //ex5.txt//(**2p**) |
- | - Écrivez un programme qui écrit le three address code pour le noeud //FunctionCall// et testez avec le fichier //ex6.txt//(**2p**) | + | - Écrivez un programme qui écrit le Three Address Code pour le noeud //FunctionCall// et testez avec le fichier //ex6.txt//(**2p**) |
- | - Au lieu d'écrire sur l'écran, ajoutez le three address code dans un tableau. A la fin, affichez le tableau sur l'écran. (**1p**) | + | - **BONUS: **Pour résoudre cet exercice, on vous recommande de créer un nouveau fichier, ''ThreeAddressCodeBonus.java'', pour pouvoir modifier la structure sans supprimer les exercices précedents. Ajoutez le type à chaque argument dans le tableau. Les types sont: nombre, identifier, String, temp (une valeur temporaire). Pour chaque valeur temporaire, ajoutez la ligne où elle est assignée dans le three address code. Modifiez la structure du fichier Main.java de facon que, si vous testez avec le fichier **ex8.txt**, vous obteniez le resultat suivant.(**2p**) |
- | - **BONUS: **Pour résoudre cet exercice, on vous recommande de créer un nouveau fichier, ''tac_bonus.ts'', pour pouvoir modifier la structure sans supprimer les exercices précedents. Ajoutez le type à chaque argument dans le tableau. Les types sont: nombre, identifier, string, temp (une valeur temporaire). Pour chaque valeur temporaire, ajoutez la ligne où elle est assignée dans le three address code. Modifiez la structure du fichier index.js de facon que, si vous testez avec le fichier **ex8.txt**, vous obteniez le resultat suivant.(**2p**) | + | |
<spoiler AST><code javascript> | <spoiler AST><code javascript> | ||
{ | { | ||
- | "ast": { | + | "ast": { |
- | "statements": [ | + | "statements": [ |
- | { | + | { |
- | "variable": "_s", | + | "variable": "_s", |
- | "value": { | + | "value": { |
- | "op": "-", | + | "left": { |
- | "left": { | + | "left": { |
- | "op": "*", | + | "value": 1, |
- | "left": { | + | "id": "value", |
- | "value": 1, | + | "type": "int", |
- | "line": 1, | + | "line": 1 |
- | "type": "int", | + | }, |
- | "id": "ValueNode" | + | "right": { |
- | }, | + | "value": 4, |
- | "right": { | + | "id": "value", |
- | "value": 4, | + | "type": "int", |
- | "line": 1, | + | "line": 1 |
- | "type": "int", | + | |
- | "id": "ValueNode" | + | |
- | }, | + | |
- | "line": 1, | + | |
- | "type": "int", | + | |
- | "id": "Expression" | + | |
- | }, | + | |
- | "right": { | + | |
- | "value": 2, | + | |
- | "line": 1, | + | |
- | "type": "int", | + | |
- | "id": "ValueNode" | + | |
- | }, | + | |
- | "line": 1, | + | |
- | "type": "int", | + | |
- | "id": "Expression" | + | |
- | }, | + | |
- | "line": 1, | + | |
- | "id": "AttributionNode" | + | |
}, | }, | ||
- | { | + | "op": "*", |
- | "function_name": "_sum", | + | "id": "expression", |
- | "parameters": [ | + | "type": "int", |
- | { | + | "line": 1 |
- | "value": 1, | + | }, |
- | "line": 2, | + | "right": { |
- | "type": "int", | + | "value": 2, |
- | "id": "ValueNode" | + | "id": "value", |
- | }, | + | "type": "int", |
- | { | + | "line": 1 |
- | "value": "_s", | + | }, |
- | "line": 2, | + | "op": "-", |
- | "type": "int", | + | "id": "expression", |
- | "id": "ValueNode" | + | "type": "int", |
- | } | + | "line": 1 |
- | ], | + | }, |
- | "line": 2, | + | "id": "attribution", |
- | "id": "FunctionCallNode" | + | "line": 1 |
- | } | + | }, |
+ | { | ||
+ | "functionName": "_sum", | ||
+ | "parameters": [ | ||
+ | { | ||
+ | "value": 1, | ||
+ | "id": "value", | ||
+ | "type": "int", | ||
+ | "line": 2 | ||
+ | }, | ||
+ | { | ||
+ | "value": "_s", | ||
+ | "id": "value", | ||
+ | "type": "int", | ||
+ | "line": 2 | ||
+ | } | ||
], | ], | ||
- | "line": 1, | + | "id": "functionCall", |
- | "id": "StatementsNode" | + | "line": 2 |
- | }, | + | } |
- | "symbol_table": { | + | ], |
- | "_s": { | + | "id": "statements", |
- | "type": "int" | + | "line": 1 |
- | } | + | }, |
+ | "symbolTable": { | ||
+ | "symbolTable": { | ||
+ | "_s": { | ||
+ | "type": "int" | ||
+ | } | ||
} | } | ||
+ | } | ||
} | } | ||
</code> | </code> |