From 351a51f956bf3de06799428ba139ce1c701cb95a Mon Sep 17 00:00:00 2001 From: Adam NAILI Date: Sun, 6 May 2018 19:03:46 +0200 Subject: Lazy evaluation, Bool logic, IF and IFELSE structures implemented. Formatted a bit --- res/test_if.tpc | 11 ++-- src/test_if.tpc | 43 ------------- src/tpc.y | 183 ++++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 131 insertions(+), 106 deletions(-) delete mode 100644 src/test_if.tpc diff --git a/res/test_if.tpc b/res/test_if.tpc index 04f7505..adb097a 100644 --- a/res/test_if.tpc +++ b/res/test_if.tpc @@ -3,11 +3,10 @@ /* Test file for simplified translator of a declaration of variables in C */ entier main(void) { - entier bool; - bool = 1; - if(bool){ - if(bool){ - print (bool); - } + entier bool1,bool2; + bool1 = 0; + bool2 = 0; + if(bool1 == bool2){ + print(0); } } diff --git a/src/test_if.tpc b/src/test_if.tpc deleted file mode 100644 index 356061f..0000000 --- a/src/test_if.tpc +++ /dev/null @@ -1,43 +0,0 @@ -extern printf -section .data -format_int db "%d",10,0 - -section .bss -section .text - -global _start -print: ;print needs an argument in rax -push rbp -mov rbp, rsp -push rsi -mov rsi, rax -mov rdi, format_int -mov rax, 0 -call printf WRT ..plt -pop rsi -pop rbp -ret - -_start: -push rbp -mov rbp, rsp - -push 0 -push 1 -pop QWORD [rbp - 0] ;bool -push QWORD [rbp - 0] ;bool -pop rax -cmp rax,0 -jz .end_if0 -push QWORD [rbp - 0] ;bool -pop rax -call print -.end_if0 -mov rax,60 -mov rdi,0 -syscall -;global table - -;local table -;entier: bool, pos: 0 - diff --git a/src/tpc.y b/src/tpc.y index 340ce5c..db59e43 100644 --- a/src/tpc.y +++ b/src/tpc.y @@ -14,8 +14,7 @@ * - Evaluation paresseuse * - Gestion des tableaux * - Tableau des fonctions - * - * - remettre car conflit pour l'instant-> + * */ #include @@ -107,12 +106,16 @@ DeclVars: | ; Declarateurs: - Declarateurs ',' Declarateur {if(status == GLOBAL) glo_addVar($3, $0); - else loc_addVar($3, $0); - printf("push 0\n");} - | Declarateur {if(status == GLOBAL) glo_addVar($1, $0); - else loc_addVar($1, $0); - printf("push 0\n");} + Declarateurs ',' Declarateur { + if(status == GLOBAL) glo_addVar($3, $0); + else loc_addVar($3, $0); + printf("push 0\n"); + } + | Declarateur { + if(status == GLOBAL) glo_addVar($1, $0); + else loc_addVar($1, $0); + printf("push 0\n"); + } ; Declarateur: IDENT @@ -134,12 +137,16 @@ Parametres: | ListTypVar ; ListTypVar: - ListTypVar ',' TYPE IDENT {if(status == GLOBAL) glo_addVar($4, $3); - else loc_addVar($4, $3); - printf("push 0\n");} - | TYPE IDENT {if(status == GLOBAL) glo_addVar($2, $1); - else loc_addVar($2, $1); - printf("push 0\n");} + ListTypVar ',' TYPE IDENT { + if(status == GLOBAL) glo_addVar($4, $3); + else loc_addVar($4, $3); + printf("push 0\n"); + } + | TYPE IDENT { + if(status == GLOBAL) glo_addVar($2, $1); + else loc_addVar($2, $1); + printf("push 0\n"); + } ; Corps: '{' DeclConsts DeclVars SuiteInstr '}' @@ -152,74 +159,116 @@ Instr: | ';' | RETURN Exp ';' | RETURN ';' - | READE '(' IDENT ')' ';' {if(status == GLOBAL) glo_lookup($3); - else loc_lookup($3);} - | READC '(' IDENT ')' ';' {if(status == GLOBAL) glo_lookup($3); - else loc_lookup($3);} + | READE '(' IDENT ')' ';' { + if(status == GLOBAL) glo_lookup($3); + else loc_lookup($3); + } + | READC '(' IDENT ')' ';' { + if(status == GLOBAL) glo_lookup($3); + else loc_lookup($3); + } | PRINT '(' Exp ')' ';' {printf("pop rax\ncall print\n");} - | IF '(' Exp IfHandling')' Instr IfEndHandling - | IF '(' Exp IfHandling')' Instr IfEndHandling ELSE Instr IfElseEndHandling + | IF '(' Exp IfHandling')' Instr {printf(".end_if%d:\n;ENDIF\n\n",$4);} + | IF '(' Exp IfHandling')' Instr ELSE IfEndHandling Instr IfElseEndHandling | WHILE '(' Exp ')' Instr | '{' SuiteInstr '}' ; -IfHandling: {printf("pop rax\ncmp rax,0\njz .end_if%d\n",$$ = num_if++);}; -IfEndHandling: {printf(".end_if%d\n",$-2);}; -IfElseEndHandling: {printf(".end_if%d\n",$-4);}; +IfHandling: {printf("\n;BEGINIF\npop rax\ncmp rax,0\njz .end_if%d\n",$$ = num_if++);}; +IfEndHandling: {printf("jmp .end_ifelse%d\n.end_if%d:\n",$-3,$-3);}; +IfElseEndHandling: {printf(".end_ifelse%d:\n;ENDIF\n\n",$-5);}; Exp: - LValue '=' Exp {if(status == GLOBAL){ + LValue '=' Exp { + if(status == GLOBAL){ $$ = glo_lookup($1); printf("pop QWORD [rbp - %d] ;%s\n",glo_get_addr($1),$1); - } - else { - $$ = loc_lookup($1); - printf("pop QWORD [rbp - %d] ;%s\n",loc_get_addr($1),$1); - } + } + else { + $$ = loc_lookup($1); + printf("pop QWORD [rbp - %d] ;%s\n",loc_get_addr($1),$1); + } } | EB ; EB: - EB {check_expected_type($1,INT); printf("pop rax\n");} - OR TB {check_expected_type($4,INT);} + EB OR TB { + check_expected_type($1,INT);check_expected_type($3,INT); + printf(";a OR c\npop rax\n"); + printf("cmp rax,1\nje .true%d\npop rcx\ncmp rcx,1\njz .true%d\npush 0\njmp .false%d\n",num_label,num_label,num_label); + printf(".true%d:\npush 1\n.false%d:",num_label,num_label); + num_label++; + } | TB ; TB: - TB AND FB {check_expected_type($1,INT);check_expected_type($3,INT);} + TB AND FB { + check_expected_type($1,INT);check_expected_type($3,INT); + printf(";a AND c\npop rax\n"); + printf("cmp rax,0\njz .false%d\npop rcx\ncmp rcx,0\njz .false%d\npush 1\njmp .true%d\n",num_label,num_label,num_label); + printf(".false%d:\npush 0\n.true%d:",num_label,num_label); + num_label++; + } | FB ; FB: - FB EQ M {check_expected_type($1,INT);check_expected_type($3,INT);} + FB EQ M { + check_expected_type($1,INT);check_expected_type($3,INT); + printf(";a EQ c\npop rax\npop rcx\ncmp rax,rcx\n"); + if(!strcmp($2,"==")){ + printf("je .true%d\n",num_label); + }else{ + printf("jne .true%d\n",num_label); + } + printf("push 0\njmp .false%d\n.true%d:\npush 1\n.false%d:",num_label,num_label,num_label); + num_label++; + } | M ; M: - M ORDER E {check_expected_type($1,INT);check_expected_type($3,INT);} + M ORDER E { + check_expected_type($1,INT);check_expected_type($3,INT); + printf(";a ORDER c\npop rcx\npop rax\ncmp rax,rcx\n"); + if(!strcmp($2,"<")){ + printf("jl .true%d\n",num_label); + }else if(!strcmp($2,"<=")){ + printf("jle .true%d\n",num_label); + }else if(!strcmp($2,">")){ + printf("jg .true%d\n",num_label); + }else{ + printf("jge .true%d\n",num_label); + } + printf("push 0\njmp .false%d\n.true%d:\npush 1\n.false%d:",num_label,num_label,num_label); + num_label++; + } | E ; E: - E ADDSUB T {check_expected_type($1,INT);check_expected_type($3,INT); - if($2 == '+'){ - printf(";E + T\npop rcx\npop rax\nadd rax,rcx\npush rax\n"); - } - else{ - printf(";E - T\npop rcx\npop rax\nsub rax,rcx\npush rax\n"); - } + E ADDSUB T { + check_expected_type($1,INT);check_expected_type($3,INT); + if($2 == '+'){ + printf(";E + T\npop rcx\npop rax\nadd rax,rcx\npush rax\n"); + } + else{ + printf(";E - T\npop rcx\npop rax\nsub rax,rcx\npush rax\n"); + } } | T ; T: - T DIVSTAR F {check_expected_type($1,INT);check_expected_type($3,INT); - if($2 == '*'){ - printf(";E * T\npop rax\npop rcx\nimul rax,rcx\npush rax\n"); - } - else{ - printf(";E / T\npop rax\npop rcx\nxor rdx,rdx\nidiv rcx\n"); - if ($2 == '/'){ - printf("push rax\n"); + T DIVSTAR F { + check_expected_type($1,INT);check_expected_type($3,INT); + if($2 == '*'){ + printf(";E * T\npop rax\npop rcx\nimul rax,rcx\npush rax\n"); } else{ - printf("push rdx\n"); + printf(";E / T\npop rax\npop rcx\nxor rdx,rdx\nidiv rcx\n"); + if ($2 == '/'){ + printf("push rax\n"); + } + else{ + printf("push rdx\n"); + } } } - } | F ; F: @@ -233,17 +282,37 @@ F: } | '!' F {$$ = $2;printf(";!F\npop rax\nxor rax,1\npush rax\n");} | '(' Exp ')' {$$ = $2;} - | LValue {if(status == GLOBAL) {$$ = glo_lookup($1);printf("push QWORD [rbp - %d] ;%s\n",glo_get_addr($1),$1);} - else {$$ = loc_lookup($1); printf("push QWORD [rbp - %d] ;%s\n",loc_get_addr($1),$1);}} + | LValue { + if(status == GLOBAL) { + $$ = glo_lookup($1); + printf("push QWORD [rbp - %d] ;%s\n",glo_get_addr($1),$1); + } + else { + $$ = loc_lookup($1); + printf("push QWORD [rbp - %d] ;%s\n",loc_get_addr($1),$1); + } + } | NUM {$$ = INT; if(status == LOCAL) printf("push %d\n",$1);} // on stocke les types pour l'analyse sémantique | CARACTERE {$$ = CHAR; if(status == LOCAL) printf("push %d\n",$1);} | IDENT '(' Arguments ')' {$$ = INT;} //tableau d'entiers uniquement ; LValue: - IDENT {if(status == GLOBAL) {glo_lookup($1);} - else {loc_lookup($1);}} - | IDENT '[' Exp ']' {if(status == GLOBAL) {glo_lookup($1);} - else {loc_lookup($1);}} + IDENT { + if(status == GLOBAL) { + glo_lookup($1); + } + else { + loc_lookup($1); + } + } + | IDENT '[' Exp ']' { + if(status == GLOBAL) { + glo_lookup($1); + } + else { + loc_lookup($1); + } + } ; Arguments: ListExp -- cgit v1.2.3