More cleanup

This commit is contained in:
Krzosa Karol
2022-05-31 23:01:55 +02:00
parent 98d2389c9f
commit 86aec0b1eb
2 changed files with 104 additions and 94 deletions

View File

@@ -145,7 +145,7 @@ parse_init_stmt(Ast_Expr *expr){
result->flags = set_flag(result->flags, AST_STMT); result->flags = set_flag(result->flags, AST_STMT);
return result; return result;
} }
return 0; return expr;
} }
function Ast_Call * function Ast_Call *
@@ -215,7 +215,6 @@ parse_block(){
else if(token_match_keyword(keyword_for)){ else if(token_match_keyword(keyword_for)){
Ast_Expr *expr_first = parse_expr(); Ast_Expr *expr_first = parse_expr();
Ast_Expr *init = parse_init_stmt(expr_first); Ast_Expr *init = parse_init_stmt(expr_first);
Ast_Expr *actual_init = init ? init : expr_first;
Ast_Expr *cond = 0; Ast_Expr *cond = 0;
Ast_Expr *iter = 0; Ast_Expr *iter = 0;
@@ -223,18 +222,19 @@ parse_block(){
cond = parse_expr(); cond = parse_expr();
if(token_match(TK_Comma)){ if(token_match(TK_Comma)){
iter = parse_expr(); iter = parse_expr();
iter = parse_init_stmt(iter);
} }
} }
Ast_Block *for_block = parse_block(); Ast_Block *for_block = parse_block();
stmts.add(ast_for(token, actual_init, cond, iter, for_block)); stmts.add(ast_for(token, init, cond, iter, for_block));
} }
else if(token_match_keyword(keyword_if)){ else if(token_match_keyword(keyword_if)){
Array<Ast_If_Node *> if_nodes = {scratch}; Array<Ast_If_Node *> if_nodes = {scratch};
Ast_Expr *expr = parse_expr(); Ast_Expr *expr = parse_expr();
Ast_Expr *init_val = parse_init_stmt(expr); Ast_Expr *init_val = parse_init_stmt(expr);
if(init_val){ if(init_val != expr){
if(token_match(TK_Comma)) expr = parse_expr(); if(token_match(TK_Comma)) expr = parse_expr();
else expr = 0; else expr = 0;
} }

View File

@@ -85,10 +85,10 @@ resolve_stmt(Ast *ast, Ast_Resolved_Type *ret){
CASE(FOR, For){ CASE(FOR, For){
// @todo: I think we need to bring back the Ast_Init, it was not an expression // @todo: I think we need to bring back the Ast_Init, it was not an expression
resolve_stmt(node->init, ret); resolve_expr(node->init, ret);
Operand cond = resolve_expr(node->cond); // @todo: typechecking Operand cond = resolve_expr(node->cond); // @todo: typechecking
Operand iter = resolve_expr(node->iter); resolve_expr(node->iter, ret);
unused(cond); unused(iter); unused(cond);
resolve_stmt_block(node->block, ret); resolve_stmt_block(node->block, ret);
BREAK(); BREAK();
} }
@@ -430,7 +430,17 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res
CASE(BINARY, Binary){ CASE(BINARY, Binary){
Operand result = {}; Operand result = {};
if(node->op == TK_Dot){ switch(node->op){
case TK_ColonAssign:{
assert(is_flag_set(node->flags, AST_STMT));
// Operand left = resolve_expr(node->left); // needs to be lvalue
Operand right = resolve_expr(node->right);
assert(node->left->kind == AST_IDENT);
Ast_Atom *atom = (Ast_Atom *)node->left; // @todo use left operand
Sym *sym = sym_new_resolved(SYM_VAR, atom->intern_val, right.type, right.value, node);
sym_insert(sym);
}break;
case TK_Dot: {
B32 required_to_be_const = false; B32 required_to_be_const = false;
// @note: resolve first chunk which involves querying global map // @note: resolve first chunk which involves querying global map
// second part requires searching through a struct // second part requires searching through a struct
@@ -506,9 +516,8 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res
if(result.is_const == false && required_to_be_const){ if(result.is_const == false && required_to_be_const){
invalid_codepath; invalid_codepath;
} }
} break;
} default: {
else{
Operand left = resolve_expr(node->left); Operand left = resolve_expr(node->left);
Operand right = resolve_expr(node->right); Operand right = resolve_expr(node->right);
result.type = resolve_type_pair(node->pos, left.type, right.type); result.type = resolve_type_pair(node->pos, left.type, right.type);
@@ -524,6 +533,7 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res
} }
} }
else parsing_error(node->pos, "Arithmetic on type [%s] is not supported", type_names[result.type->kind]); else parsing_error(node->pos, "Arithmetic on type [%s] is not supported", type_names[result.type->kind]);
}break;
} }
} }