From cabbac92126f168124372fc502dbc1fa2313eee3 Mon Sep 17 00:00:00 2001 From: pacien Date: Tue, 5 Jun 2018 22:11:03 +0200 Subject: gen const decl --- src/generator.c | 135 +++++++++++++++++++++++++++++++------------------------- src/generator.h | 4 ++ src/tpc.y | 20 ++++----- 3 files changed, 90 insertions(+), 69 deletions(-) diff --git a/src/generator.c b/src/generator.c index b8a0b8f..33fade9 100644 --- a/src/generator.c +++ b/src/generator.c @@ -10,71 +10,74 @@ void gen_prologue() { fprintf(output, "extern printf\nextern scanf\n"); fprintf(output, "section .data\n"); +} + +void gen_prologue_continue(int *bss_done) { + if (*bss_done != 0) return; + fprintf(output, "format_int db \"%%d\",10,0\n"); fprintf(output, "format_char db \"%%c\",10,0\n"); fprintf(output, "format_int_in: db \"%%d\", 0\n"); fprintf(output, "format_char_in: db \"%%c\", 0\n\n"); fprintf(output, "section .bss\n"); + + fprintf(output, "globals: resq %d\n", nb_globals); + fprintf(output, "section .text\n\nglobal _start\n"); + fprintf(output, "\nprinte: ;print needs an argument in rax\n"); + fprintf(output, "push rbp\n"); + fprintf(output, "mov rbp, rsp\n"); + fprintf(output, "push rsi\n"); + fprintf(output, "push rdi\n"); + fprintf(output, "mov rsi, rax\n"); + fprintf(output, "mov rdi, format_int\n"); + fprintf(output, "mov rax, 0\n"); + fprintf(output, "call printf WRT ..plt\n"); + fprintf(output, "pop rdi\n"); + fprintf(output, "pop rsi\n"); + fprintf(output, "pop rbp\n"); + fprintf(output, "ret\n"); + fprintf(output, "\nprintc: ;print needs an argument in rax\n"); + fprintf(output, "push rbp\n"); + fprintf(output, "mov rbp, rsp\n"); + fprintf(output, "push rsi\n"); + fprintf(output, "push rdi\n"); + fprintf(output, "mov rsi, rax\n"); + fprintf(output, "mov rdi, format_char\n"); + fprintf(output, "mov rax, 0\n"); + fprintf(output, "call printf WRT ..plt\n"); + fprintf(output, "pop rdi\n"); + fprintf(output, "pop rsi\n"); + fprintf(output, "pop rbp\n"); + fprintf(output, "ret\n"); + fprintf(output, "\nreade: ;read needs an adress in rax\n"); + fprintf(output, "push rbp\n"); + fprintf(output, "mov rbp, rsp\n"); + fprintf(output, "push rsi\n"); + fprintf(output, "push rdi\n"); + fprintf(output, "mov rsi, rax\n"); + fprintf(output, "mov rdi, format_int_in\n"); + fprintf(output, "mov rax, 0\n"); + fprintf(output, "call scanf\n"); + fprintf(output, "pop rdi\n"); + fprintf(output, "pop rsi\n"); + fprintf(output, "pop rbp\n"); + fprintf(output, "ret\n"); + fprintf(output, "\nreadc: ;read needs an adress in rax\n"); + fprintf(output, "push rbp\n"); + fprintf(output, "mov rbp, rsp\n"); + fprintf(output, "push rsi\n"); + fprintf(output, "push rdi\n"); + fprintf(output, "mov rsi, rax\n"); + fprintf(output, "mov rdi, format_char_in\n"); + fprintf(output, "mov rax, 0\n"); + fprintf(output, "call scanf\n"); + fprintf(output, "pop rdi\n"); + fprintf(output, "pop rsi\n"); + fprintf(output, "pop rbp\n"); + fprintf(output, "ret\n"); + *bss_done = 1; } -void gen_prologue_continue(int *bss_done) { - if (*bss_done == 0) { - fprintf(output, "globals: resq %d\n", nb_globals); - fprintf(output, "section .text\n\nglobal _start\n"); - fprintf(output, "\nprinte: ;print needs an argument in rax\n"); - fprintf(output, "push rbp\n"); - fprintf(output, "mov rbp, rsp\n"); - fprintf(output, "push rsi\n"); - fprintf(output, "push rdi\n"); - fprintf(output, "mov rsi, rax\n"); - fprintf(output, "mov rdi, format_int\n"); - fprintf(output, "mov rax, 0\n"); - fprintf(output, "call printf WRT ..plt\n"); - fprintf(output, "pop rdi\n"); - fprintf(output, "pop rsi\n"); - fprintf(output, "pop rbp\n"); - fprintf(output, "ret\n"); - fprintf(output, "\nprintc: ;print needs an argument in rax\n"); - fprintf(output, "push rbp\n"); - fprintf(output, "mov rbp, rsp\n"); - fprintf(output, "push rsi\n"); - fprintf(output, "push rdi\n"); - fprintf(output, "mov rsi, rax\n"); - fprintf(output, "mov rdi, format_char\n"); - fprintf(output, "mov rax, 0\n"); - fprintf(output, "call printf WRT ..plt\n"); - fprintf(output, "pop rdi\n"); - fprintf(output, "pop rsi\n"); - fprintf(output, "pop rbp\n"); - fprintf(output, "ret\n"); - fprintf(output, "\nreade: ;read needs an adress in rax\n"); - fprintf(output, "push rbp\n"); - fprintf(output, "mov rbp, rsp\n"); - fprintf(output, "push rsi\n"); - fprintf(output, "push rdi\n"); - fprintf(output, "mov rsi, rax\n"); - fprintf(output, "mov rdi, format_int_in\n"); - fprintf(output, "mov rax, 0\n"); - fprintf(output, "call scanf\n"); - fprintf(output, "pop rdi\n"); - fprintf(output, "pop rsi\n"); - fprintf(output, "pop rbp\n"); - fprintf(output, "ret\n"); - fprintf(output, "\nreadc: ;read needs an adress in rax\n"); - fprintf(output, "push rbp\n"); - fprintf(output, "mov rbp, rsp\n"); - fprintf(output, "push rsi\n"); - fprintf(output, "push rdi\n"); - fprintf(output, "mov rsi, rax\n"); - fprintf(output, "mov rdi, format_char_in\n"); - fprintf(output, "mov rax, 0\n"); - fprintf(output, "call scanf\n"); - fprintf(output, "pop rdi\n"); - fprintf(output, "pop rsi\n"); - fprintf(output, "pop rbp\n"); - fprintf(output, "ret\n"); - *bss_done = 1; - } -} + void gen_const_declaration() { fprintf(output, "\n_start:\n"); fprintf(output, "push rbp\nmov rbp, rsp\n\n"); @@ -90,6 +93,20 @@ void gen_const_declaration() { fun_display_table(); } +void gen_const(const char name[], int value, Scope scope) { + switch (scope) { + case LOCAL: + loc_addVar(name, INT); // TODO: make read only + fprintf(output, "push %d\n", value); + return; + + case GLOBAL: + glo_addVar(name, INT); // TODO: make read only + fprintf(output, "%s: db QWORD %d\n", name, value); + return; + } +} + Type gen_function_declaration(const char name[], int return_type) { fprintf(output, "\n%s:\npush rbp\nmov rbp,rsp\n", name); return return_type; diff --git a/src/generator.h b/src/generator.h index 41a769a..6c132fd 100644 --- a/src/generator.h +++ b/src/generator.h @@ -7,6 +7,7 @@ #define __GENERATOR_H__ #include +#include #include "symbol_table.h" typedef enum scope { @@ -21,10 +22,13 @@ FILE *output; void gen_prologue(); void gen_prologue_continue(int *bss_done); void gen_const_declaration(); +void gen_const(const char name[], int value, Scope scope); + Type gen_function_declaration(const char name[], int return_type); void gen_function_end_declaration(const char name[], int return_type, int nb_param); void gen_function_return(Type expect, Type actual); Type gen_function_call(const char name[], int nb_param); + void gen_declaration(const char name[], int type, Scope scope); void gen_check(const char name[], Scope scope); diff --git a/src/tpc.y b/src/tpc.y index 9878ce7..b5d0d35 100644 --- a/src/tpc.y +++ b/src/tpc.y @@ -54,32 +54,32 @@ static char fname[64]; %precedence ELSE %% -Prog: { gen_prologue(); } - DeclConsts DeclVars DeclFoncts { gen_const_declaration(); } +Prog: { gen_prologue(); } + DeclConsts DeclVars DeclFoncts { gen_const_declaration(); } ; DeclConsts: DeclConsts CONST ListConst ';' | ; ListConst: - ListConst ',' IDENT '=' Litteral -| IDENT '=' Litteral + ListConst ',' IDENT '=' Litteral { gen_const($1, $3, scope); } +| IDENT '=' Litteral { gen_const($1, $3, scope); } ; Litteral: - NombreSigne -| CARACTERE + NombreSigne { $$ = $1; } +| CARACTERE { $$ = $1; } ; NombreSigne: - NUM -| ADDSUB NUM + NUM { $$ = $1; } +| ADDSUB NUM { $$ = $1 == '-' ? - $2 : $2; } ; DeclVars: DeclVars TYPE Declarateurs ';' | ; Declarateurs: - Declarateurs ',' Declarateur { gen_declaration($3, $0, scope); } -| Declarateur { gen_declaration($1, $0, scope); } + Declarateurs ',' Declarateur { gen_declaration($3, $0, scope); } +| Declarateur { gen_declaration($1, $0, scope); } ; Declarateur: IDENT -- cgit v1.2.3