|
@@ -14,6 +14,7 @@
|
14
|
14
|
struct type_t type_courant;
|
15
|
15
|
struct type_t return_type_fonc;
|
16
|
16
|
|
|
17
|
+
|
17
|
18
|
int instructions_ligne_to_patch[10][20];
|
18
|
19
|
int nbs_instructions_to_patch[10];
|
19
|
20
|
|
|
@@ -21,7 +22,7 @@ int nbs_instructions_to_patch[10];
|
21
|
22
|
|
22
|
23
|
%token tMAIN
|
23
|
24
|
%token tOBRACKET tCBRACKET
|
24
|
|
-%token tOBRACE tCBRACE
|
|
25
|
+%token<nombre> tOBRACE tCBRACE
|
25
|
26
|
%token tOCROCH tCCROCH
|
26
|
27
|
%token tINT
|
27
|
28
|
%token tCONST
|
|
@@ -32,6 +33,7 @@ int nbs_instructions_to_patch[10];
|
32
|
33
|
%token tPRINTF
|
33
|
34
|
%token tERROR
|
34
|
35
|
%token<nombre> tIF tWHILE tELSE
|
|
36
|
+%token tRETURN
|
35
|
37
|
%token tLT tGT tEQCOND
|
36
|
38
|
%token tAND tOR
|
37
|
39
|
%token tADDR
|
|
@@ -62,9 +64,11 @@ Fonctions : ;
|
62
|
64
|
|
63
|
65
|
Main : tINT {printf("Déclaration du main\n");} tMAIN tOBRACE Args tCBRACE Body { print(); create_asm();} ;
|
64
|
66
|
|
65
|
|
-Fonction : Type tID {return_type_fonc = type_courant; printf("Déclaration de la fonction %s\n", $2);} tOBRACE {inc_prof();} Args {decrement_prof(); push_fonction($2,return_type_fonc,get_current_index(), $6);} tCBRACE Body { print_fonctions();} ;
|
|
67
|
+Fonction : Type tID {return_type_fonc = type_courant; printf("Déclaration de la fonction %s\n", $2);} tOBRACE {inc_prof();} Args {decrement_prof(); push_fonction($2,return_type_fonc,get_current_index(), $6);} tCBRACE Body { print_fonctions(); add_operation(RET,0,0,0);} ;
|
66
|
68
|
Fonction : Main {print_fonctions();};
|
67
|
69
|
|
|
70
|
+Return : tRETURN E tPV {if (return_type_fonc.pointeur_level > 0 || return_type_fonc.isTab){add_operation(COPR,$2, taille_types[INT],0);} else {add_operation(COPR,$2,taille_types[return_type_fonc.base],0);} pop(); };
|
|
71
|
+
|
68
|
72
|
Args : Arg ArgSuite {$$ = $1 + $2; printf("Les arguments de la fonctions vont avoir une taille dans la pile de : %d\n",$$);};
|
69
|
73
|
Args : {$$ = 0;};
|
70
|
74
|
Arg : Type tID {int addr = push($2,1, type_courant); if (type_courant.pointeur_level > 0){$$ = taille_types[INT];} else{$$ = taille_types[type_courant.base];}};
|
|
@@ -83,9 +87,18 @@ Instruction : Decl {};
|
83
|
87
|
Instruction : Invocation tPV{};
|
84
|
88
|
Instruction : If {};
|
85
|
89
|
Instruction : While {};
|
|
90
|
+Instruction : Return {};
|
86
|
91
|
|
87
|
92
|
|
88
|
|
-Invocation : tID tOBRACE Params tCBRACE {multiple_pop($3); struct fonction_t fonc = get_fonction($1); add_operation(CALL,fonc.first_instruction_line, fonc.taille_args,0);};
|
|
93
|
+Invocation : tID tOBRACE {struct fonction_t fonc = get_fonction($1); if (fonc.return_type.pointeur_level > 0 || fonc.return_type.isTab){
|
|
94
|
+ $2 = push("0_TEMPORARY_RETURN", 0, integer);
|
|
95
|
+}
|
|
96
|
+else{
|
|
97
|
+$2 = push("0_TEMPORARY_RETURN", 0, fonc.return_type);
|
|
98
|
+}}
|
|
99
|
+
|
|
100
|
+Params tCBRACE {struct fonction_t fonc = get_fonction($1); multiple_pop($4);
|
|
101
|
+add_operation(CALL,fonc.first_instruction_line, fonc.taille_args,get_current_index() + 1); $$ = $2;};
|
89
|
102
|
|
90
|
103
|
|
91
|
104
|
//Pour les tableaux quand on les passe en arguments, il faudra faire gaffe à bien les passer comme un pointeur vers un tableau et pas juste un tableau car sinon in ne pourra pas accéder au tableau de base depuis la fonction appellée. Il faut pour cela peut être rajouter un nouveau champ (isArg) dans la table des symboles (ou autre idée?)
|
|
@@ -150,7 +163,7 @@ E : E tMUL E { printf("Mul\n"); add_operation(MUL,$1,$1,$3); $$ = $1; pop();};
|
150
|
163
|
E : E tDIV E { printf("Div\n"); add_operation(DIV, $1,$1,$3); $$ = $1; pop();};
|
151
|
164
|
E : E tSUB E { printf("Sub\n"); add_operation(SOU,$1,$1,$3); $$ = $1; pop();};
|
152
|
165
|
E : E tADD E { printf("Add\n"); add_operation(ADD,$1,$1,$3); $$ = $1; pop();};
|
153
|
|
-E : Invocation { printf("Invoc\n"); int addr = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr,$1,0); $$ = addr;};
|
|
166
|
+E : Invocation {$$ = $1;};
|
154
|
167
|
E : tOBRACE E tCBRACE { printf("Parentheses\n"); $$=$2;};
|
155
|
168
|
E : tSUB E { printf("Moins\n"); int addr = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr,0,0); add_operation(SOU, $2,$2,addr); $$ = $2; pop();};
|
156
|
169
|
E : E tEQCOND E { printf("==\n"); add_operation(EQU,$1,$1,$3); $$ = $1; pop();};
|
|
@@ -163,7 +176,7 @@ E : tMUL E { add_operation(READ, $2, $2, 0); $$=$2;};
|
163
|
176
|
E : tID { printf("Id\n"); struct symbole_t * symbole = get_variable($1); struct type_t type = symbole->type; type.nb_blocs = 1; int addr = push("0_TEMPORARY", 1, type); if (symbole->type.isTab){add_operation(AFCA, addr,symbole->adresse,0); } else{add_operation(COP, addr,symbole->adresse,0);} $$=addr;};
|
164
|
177
|
E : tID tOCROCH E tCCROCH {struct symbole_t * symbole = get_variable($1); struct type_t type = symbole->type; type.nb_blocs = 1; int addr = push("0_TEMPORARY", 1, type); if(type.pointeur_level > 0) {add_operation(COP, addr,symbole->adresse,0);} else{add_operation(AFCA, addr,symbole->adresse,0);} int addr2 = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr2, taille_types[symbole->type.base],0); add_operation(MUL,$3,addr2,$3);
|
165
|
178
|
add_operation(ADD,$3,addr,$3); add_operation(READ,$3,$3,0); $$=$3; pop(); pop();};
|
166
|
|
-E : tADDR EBis {add_operation(COPA,$2, $2,0); $$=$2;};
|
|
179
|
+E : tADDR EBis {$$=$2;};
|
167
|
180
|
|
168
|
181
|
EBis : tID tOCROCH E tCCROCH {struct symbole_t * symbole = get_variable($1);
|
169
|
182
|
struct type_t type = symbole->type; type.nb_blocs = 1;
|