This shows you the differences between two versions of the page.
alf:laboratoare:09_fr_java [2023/05/08 23:37] alexandra.negoita02 created |
alf:laboratoare:09_fr_java [2023/05/09 08:42] (current) alexandra.negoita02 |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== TP 9 - Génération de code 2 ====== | ====== TP 9 - Génération de code 2 ====== | ||
+ | <note warning> | ||
+ | Vous devez **accepter** l'assignment d'ici est travailler avec ce **repository**: [[https://classroom.github.com/a/jipKda9e|Lab 9]] | ||
+ | </note> | ||
Dans le domaine informatique, le code de trois adresses (three address code) représente un code intermédiaire utilisé pour les compilateurs en tant que moyen d'écrire des instructions. Chaque instruction consiste en: | Dans le domaine informatique, le code de trois adresses (three address code) représente un code intermédiaire utilisé pour les compilateurs en tant que moyen d'écrire des instructions. Chaque instruction consiste en: | ||
Line 15: | Line 18: | ||
<code> | <code> | ||
/* Expression */ | /* Expression */ | ||
- | (5-3)*7; | + | x = (5-3)/7; |
/* Three Address Code */ | /* Three Address Code */ | ||
Line 22: | Line 25: | ||
sub | sub | ||
push 7 | push 7 | ||
- | mul | + | div |
+ | pop x | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | |||
Line 119: | Line 126: | ||
; | ; | ||
- | </code> | ||
- | |||
- | <code javascript index.ts> | ||
- | 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) | ||
- | { | ||
- | | ||
- | } | ||
- | else | ||
- | if (node instanceof ValueNode) | ||
- | { | ||
- | | ||
- | } | ||
- | else | ||
- | if (node instanceof VariableNode) | ||
- | { | ||
- | | ||
- | } | ||
- | else | ||
- | if (node instanceof AttributionNode) | ||
- | { | ||
- | | ||
- | } | ||
- | else | ||
- | if (node instanceof Expression) | ||
- | { | ||
- | if (node.left !== undefined && node.right !== undefined) | ||
- | { | ||
- | | ||
- | } | ||
- | } | ||
- | } | ||
- | |||
- | var ast = parser.parse (str); | ||
- | console.log (JSON.stringify(ast, null, 4)); | ||
- | |||
- | writeThreeAddressCode(ast); | ||
</code> | </code> | ||
Line 185: | Line 133: | ||
- Dans un fichier **ex1.txt** écrivez le //three address code// avec une **pile** pour les expressions suivantes (**1p**) | - Dans un fichier **ex1.txt** écrivez le //three address code// avec une **pile** pour les expressions suivantes (**1p**) | ||
- | * (5-3)*7+2+4 | ||
* a = (5-3)*7+2+4 | * a = (5-3)*7+2+4 | ||
* e = (a+5)/(a-2) | * e = (a+5)/(a-2) | ||
- | - Dans un fichier **ex2.txt** écrivez le //three address code// avec une **pile** pour le programme suivant (**1p**) <code javascript> | + | - Dans un fichier **ex2.txt** écrivez le //three address code// avec une **pile** pour le programme suivant (**1p**) <code java> |
if (a > 0) | if (a > 0) | ||
{ | { | ||
- | result = 'positive'; | + | result = "positive"; |
} | } | ||
else | else | ||
{ | { | ||
- | result = 'negative'; | + | result = "negative"; |
} | } | ||
</code> | </code> | ||
- | - Dans un fichier **ex3.txt** écrivez le //three address code// avec une **pile** pour le programme suivant (**1p**) <code javascript> | + | - Dans un fichier **ex3.txt** écrivez le //three address code// avec une **pile** pour le programme suivant (**1p**) <code java> |
- | function double (nr) | + | float doubleNr (float nr) |
{ | { | ||
return nr*2; | return nr*2; | ||
} | } | ||
- | double (7/2); | + | doubleNr(7/2); |
</code> | </code> | ||
- | - Téléchargez [[https://github.com/UPB-FILS-ALF/TP/tree/main/TP9|la structure]] du TP. Exécutez le parser du laboratoire et écrivez un programme qui écrit le three address code pour les noeuds //Expression// avec une pile (**2p**) | + | - Exécutez le parser du laboratoire et écrivez un programme qui écrit le three address code pour les noeuds //Expression// avec une pile (**2p**) |
- Modifiez la grammaire et le //Visitor// pour que les appels de fonction puissent être à l'intérieur des expressions. (Exemple: ''2 + 3 / _double(a)''). Testez la validité de la grammaire avec le fichier **ex5.txt**. (**1p**) | - Modifiez la grammaire et le //Visitor// pour que les appels de fonction puissent être à l'intérieur des expressions. (Exemple: ''2 + 3 / _double(a)''). Testez la validité de la grammaire avec le fichier **ex5.txt**. (**1p**) | ||
- Ecrivez un programme qui écrit le three address code avec une pile pour le noeud //AttributionNode//. Testez avec le fichier **ex6.txt**. (**1p**) | - Ecrivez un programme qui écrit le three address code avec une pile pour le noeud //AttributionNode//. Testez avec le fichier **ex6.txt**. (**1p**) |