aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--res/test_while.tpc13
-rw-r--r--src/generator.c8
-rw-r--r--src/tpc.y2
3 files changed, 18 insertions, 5 deletions
diff --git a/res/test_while.tpc b/res/test_while.tpc
new file mode 100644
index 0000000..25d04c6
--- /dev/null
+++ b/res/test_while.tpc
@@ -0,0 +1,13 @@
1/* test-table-symboles.tpc */
2
3/* Test file for simplified translator of a declaration of variables in C */
4
5entier main(void) {
6 entier i;
7 i = 0;
8 while(i<=5){
9 print(i);
10 i = i + 1;
11 }
12 return 0;
13}
diff --git a/src/generator.c b/src/generator.c
index 60a2b89..1965ab9 100644
--- a/src/generator.c
+++ b/src/generator.c
@@ -282,7 +282,7 @@ void gen_or(int left, int right, int idx) {
282 fprintf(output, "jmp .false%d\n", idx); 282 fprintf(output, "jmp .false%d\n", idx);
283 fprintf(output, ".true%d:\n", idx); 283 fprintf(output, ".true%d:\n", idx);
284 fprintf(output, "push 1\n"); 284 fprintf(output, "push 1\n");
285 fprintf(output, ".false%d:", idx); 285 fprintf(output, ".false%d:\n", idx);
286} 286}
287 287
288void gen_and(int left, int right, int idx) { 288void gen_and(int left, int right, int idx) {
@@ -300,7 +300,7 @@ void gen_and(int left, int right, int idx) {
300 fprintf(output, "jmp .true%d\n", idx); 300 fprintf(output, "jmp .true%d\n", idx);
301 fprintf(output, ".false%d:\n", idx); 301 fprintf(output, ".false%d:\n", idx);
302 fprintf(output, "push 0\n"); 302 fprintf(output, "push 0\n");
303 fprintf(output, ".true%d:", idx); 303 fprintf(output, ".true%d:\n", idx);
304} 304}
305 305
306void gen_eq(const char op[], int left, int right, int idx) { 306void gen_eq(const char op[], int left, int right, int idx) {
@@ -316,7 +316,7 @@ void gen_eq(const char op[], int left, int right, int idx) {
316 else 316 else
317 exit(1); // TODO: error on unexpected op 317 exit(1); // TODO: error on unexpected op
318 318
319 fprintf(output, "push 0\njmp .false%d\n.true%d:\npush 1\n.false%d:", idx, idx, 319 fprintf(output, "push 0\njmp .false%d\n.true%d:\npush 1\n.false%d:\n", idx, idx,
320 idx); 320 idx);
321} 321}
322 322
@@ -337,7 +337,7 @@ void gen_order(const char op[], int left, int right, int idx) {
337 else 337 else
338 exit(1); // TODO: error on unexpected op 338 exit(1); // TODO: error on unexpected op
339 339
340 fprintf(output, "push 0\njmp .false%d\n.true%d:\npush 1\n.false%d:", idx, idx, 340 fprintf(output, "push 0\njmp .false%d\n.true%d:\npush 1\n.false%d:\n", idx, idx,
341 idx); 341 idx);
342} 342}
343 343
diff --git a/src/tpc.y b/src/tpc.y
index 64652d9..7321780 100644
--- a/src/tpc.y
+++ b/src/tpc.y
@@ -126,7 +126,7 @@ Instr:
126| PRINT '(' Exp ')' ';' { gen_print($<type>3);} 126| PRINT '(' Exp ')' ';' { gen_print($<type>3);}
127| IF '(' Exp IfHandling')' Instr { gen_if_label($<num>4); } 127| IF '(' Exp IfHandling')' Instr { gen_if_label($<num>4); }
128| IF '(' Exp IfHandling')' Instr ELSE IfEndHandling Instr IfElseEndHandling 128| IF '(' Exp IfHandling')' Instr ELSE IfEndHandling Instr IfElseEndHandling
129| WHILE '(' Exp ')' Instr 129| WHILE {fprintf(output,".upwhile%d:\n",num_while);}'(' Exp {fprintf(output,"pop rax\ncmp rax,0\njz .downwhile%d\n",num_while);}')' Instr {fprintf(output,"jmp .upwhile%d\n.downwhile%d:\n",num_while,num_while);num_while++;}
130| '{' SuiteInstr '}' 130| '{' SuiteInstr '}'
131; 131;
132IfHandling: { gen_if_start($<num>$ = num_if++); }; 132IfHandling: { gen_if_start($<num>$ = num_if++); };