diff options
Diffstat (limited to 'src/tpc.y')
-rw-r--r-- | src/tpc.y | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -23,7 +23,8 @@ static Type return_type = VOID_T; | |||
23 | static int bss_done = 0; | 23 | static int bss_done = 0; |
24 | static int num_label = 0; | 24 | static int num_label = 0; |
25 | static int num_if = 0; | 25 | static int num_if = 0; |
26 | static int nb_param = 0; | 26 | static int nb_param[255]; |
27 | static int num_scope = -1; | ||
27 | static char fname[64]; | 28 | static char fname[64]; |
28 | %} | 29 | %} |
29 | 30 | ||
@@ -90,11 +91,11 @@ DeclFoncts: | |||
90 | ; | 91 | ; |
91 | DeclFonct: | 92 | DeclFonct: |
92 | EnTeteFonct { scope = LOCAL; } | 93 | EnTeteFonct { scope = LOCAL; } |
93 | Corps { gen_function_end_declaration(fname,return_type,nb_param); scope = GLOBAL; return_type = VOID_T; } | 94 | Corps { gen_function_end_declaration(fname,return_type,nb_param[num_scope]); scope = GLOBAL; return_type = VOID_T; num_scope--; loc_clean_table(); } |
94 | ; | 95 | ; |
95 | EnTeteFonct: | 96 | EnTeteFonct: |
96 | TYPE IDENT PrologueCont {strcpy(fname,$<ident>2); return_type = gen_function_declaration($<ident>2, $<type>1);} '(' Parametres ')' { nb_param = $<num>6 ; scope = GLOBAL;} | 97 | TYPE IDENT PrologueCont {strcpy(fname,$<ident>2); return_type = gen_function_declaration($<ident>2, $<type>1);} '(' Parametres ')' { nb_param[++num_scope] = $<num>6 ; scope = GLOBAL;} |
97 | | VOID IDENT PrologueCont {strcpy(fname,$<ident>2); return_type = gen_function_declaration($<ident>2, VOID_T);} '(' Parametres ')' { nb_param = $<num>6 ; scope = GLOBAL; } | 98 | | VOID IDENT PrologueCont {strcpy(fname,$<ident>2); return_type = gen_function_declaration($<ident>2, VOID_T);} '(' Parametres ')' { nb_param[++num_scope] = $<num>6 ; scope = GLOBAL; } |
98 | ; | 99 | ; |
99 | 100 | ||
100 | PrologueCont: {scope = LOCAL;gen_prologue_continue(&bss_done);}; | 101 | PrologueCont: {scope = LOCAL;gen_prologue_continue(&bss_done);}; |
@@ -108,7 +109,7 @@ ListTypVar: | |||
108 | | TYPE IDENT { gen_declaration($<ident>2, $<type>1, scope); $<num>$ = 1; } | 109 | | TYPE IDENT { gen_declaration($<ident>2, $<type>1, scope); $<num>$ = 1; } |
109 | ; | 110 | ; |
110 | Corps: | 111 | Corps: |
111 | '{' {int i; for(i=1;i<=nb_param;i++){fprintf(output, "mov r8, [rbp + %d]\nmov [rbp - %d], r8\n", (nb_param-i+2)*8, i*8);} } DeclConsts DeclVars SuiteInstr '}' | 112 | '{' {int i; for(i=1;i<=nb_param[num_scope];i++){fprintf(output, "mov r8, [rbp + %d]\nmov [rbp - %d], r8\n", (nb_param[num_scope]-i+2)*8, i*8);} } DeclConsts DeclVars SuiteInstr '}' |
112 | ; | 113 | ; |
113 | SuiteInstr: | 114 | SuiteInstr: |
114 | SuiteInstr Instr | 115 | SuiteInstr Instr |