This commit is contained in:
attilavs2 2025-03-08 21:59:43 +01:00
parent 77ddf1514a
commit 9266d5fc27
3 changed files with 14 additions and 7 deletions

View file

@ -14,6 +14,8 @@ ASTStack *stack;
void yyerror(char *s); void yyerror(char *s);
Tag ntag = {0,T_null};
int make_stack(){ int make_stack(){
stack = malloc(sizeof(ASTStack)+sizeof(Statement)*2048); stack = malloc(sizeof(ASTStack)+sizeof(Statement)*2048);
if(!stack) if(!stack)
@ -53,13 +55,15 @@ Statement *make_iconst(i32 val){
} }
Statement *declare(i32 type, Tag vtype, char *name){ Statement *declare(i32 type, Tag vtype, char *name){
puts("declare"); i32 len = strcspn(name, " \t\n)");
char *name2 = strndup(name, len);
printf("declare : %s\n", name2);
Statement *stat = &stack->statements[stack->curr_statement++]; Statement *stat = &stack->statements[stack->curr_statement++];
stat->type = type; stat->type = type;
if(hashmap_get(&stack->symbol_map, name)){ if(hashmap_get(&stack->symbol_map, name2)){
yyerror("Redeclaring existing identifier"); yyerror("Redeclaring existing identifier");
} }
MapItem *ret = hashmap_insert(&stack->symbol_map, name); MapItem *ret = hashmap_insert(&stack->symbol_map, name2);
ret->type = *((i32*)&vtype); ret->type = *((i32*)&vtype);
stat->var_id = ret->id; stat->var_id = ret->id;
stat->var_type = vtype; stat->var_type = vtype;

View file

@ -28,3 +28,5 @@ Statement *make_operation(i32 type, i32 extainf, char *str, i32 nparam,
Statement *param, ...); Statement *param, ...);
void set_entry_point(Statement *statement); void set_entry_point(Statement *statement);
extern Tag ntag;

View file

@ -14,7 +14,8 @@
Tag tag; Tag tag;
} }
%token <str> G_IDENT TYPE_U %nonassoc <str> G_IDENT
%token <str> TYPE_U
%token VEC %token VEC
%token VAR %token VAR
%token LET %token LET
@ -59,13 +60,13 @@ expr:
'(' G_IDENT ')' '(' G_IDENT ')'
{$$ = make_operation(ST_Call, 0, $2, 0, NULL);} {$$ = make_operation(ST_Call, 0, $2, 0, NULL);}
| '(' VAR G_IDENT ')' | '(' VAR G_IDENT ')'
{Tag ntag = {0,T_null}; $$ = declare(BI_var,ntag,$3);} { $$ = declare(BI_var,ntag,$3);}
| '(' VAR type G_IDENT ')' | '(' VAR type G_IDENT ')'
{$$ = declare(BI_var, $3, $4);} {$$ = declare(BI_var, $3, $4);}
| '(' VAR G_IDENT expr')' | '(' VAR G_IDENT expr')'
{} {$$ = declare(BI_var,ntag,$4);}
| '(' VAR type G_IDENT expr ')' | '(' VAR type G_IDENT expr ')'
{} {$$ = declare(BI_var,$3,$4);}
| '(' LET G_IDENT ')' | '(' LET G_IDENT ')'
{} {}
| '(' LET type G_IDENT ')' | '(' LET type G_IDENT ')'