Basic resolving, codegen with packages

This commit is contained in:
Krzosa Karol
2022-06-10 10:35:10 +02:00
parent fbe911d267
commit b0077fe9df
9 changed files with 553 additions and 433 deletions

View File

@@ -33,7 +33,7 @@ function Token *
token_get(S64 i = 0){
i += pctx->token_iter;
if(i >= pctx->tokens.len){
return &pctx->empty_token;
return &null_token;
}
Token *result = &pctx->tokens[i];
return result;
@@ -122,10 +122,18 @@ parse_init_stmt(Ast_Expr *expr){
if(token->kind == TK_ColonAssign && expr->kind != AST_IDENT)
compiler_error(expr->pos, "Binding with [:=] to something that is not an identifier");
if(token_is_assign(token)){
else if(token_is_assign(token)){
token_next();
Ast_Expr *value = parse_expr();
Ast_Expr *result = ast_expr_binary((Ast_Atom *)expr, value, token);
Ast_Expr *value = parse_expr();
Ast_Expr *result = 0;
if(token->kind == TK_ColonAssign){
Ast_Atom *name = (Ast_Atom *)expr;
result = (Ast_Expr *)ast_var(token, 0, name->intern_val, value);
} else{
result = ast_expr_binary((Ast_Atom *)expr, value, token);
}
result->flags = set_flag(result->flags, AST_STMT);
return result;
}
@@ -176,9 +184,9 @@ parse_optional_type(){
return result;
}
function Ast_Block *
parse_block(){
Ast_Block *block = 0;
function Ast_Scope *
parse_stmt_scope(){
Ast_Scope *block = 0;
if(token_expect(OPEN_SCOPE)){ // @todo: Fix error message here, it doesn't show proper token context
Token *token_block = token_get();
@@ -218,7 +226,7 @@ parse_block(){
}
}
Ast_Block *for_block = parse_block();
Ast_Scope *for_block = parse_stmt_scope();
stmts.add(ast_for(token, init, cond, iter, for_block));
}
@@ -232,7 +240,7 @@ parse_block(){
}
if(init_val == expr) init_val = 0;
Ast_Block *if_block = parse_block();
Ast_Scope *if_block = parse_stmt_scope();
Ast_If_Node *if_node = ast_if_node(token, init_val, expr, if_block);
if_nodes.add(if_node);
@@ -241,12 +249,12 @@ parse_block(){
token = token_next();
if(token_match_keyword(keyword_if)){
Ast_Expr *expr = parse_expr();
Ast_Block *else_if_block = parse_block();
Ast_Scope *else_if_block = parse_stmt_scope();
Ast_If_Node *if_node = ast_if_node(token, 0, expr, else_if_block);
if_nodes.add(if_node);
}
else{
Ast_Block *else_block = parse_block();
Ast_Scope *else_block = parse_stmt_scope();
Ast_If_Node *if_node = ast_if_node(token, 0, 0, else_block);
if_nodes.add(if_node);
break;
@@ -274,7 +282,7 @@ parse_block(){
}
} while(token_match(SAME_SCOPE));
token_expect(CLOSE_SCOPE);
block = ast_block(token_block, stmts);
block = ast_stmt_scope(token_block, stmts);
}
return block;
}
@@ -284,7 +292,7 @@ parse_lambda(Token *token){
Scratch scratch;
B32 has_var_args = false;
Array<Ast_Lambda_Arg *> params = {scratch};
Array<Ast_Decl *> params = {scratch};
if(!token_is(TK_CloseParen)){
for(;;){
Token *name = token_get();
@@ -297,7 +305,7 @@ parse_lambda(Token *token){
default_value = parse_expr();
}
Ast_Lambda_Arg *param = ast_expr_lambda_arg(name, name->intern_val, typespec, default_value);
Ast_Decl *param = ast_var(name, typespec, name->intern_val, default_value);
params.add(param);
}
else if(token_match(TK_ThreeDots)){
@@ -313,8 +321,8 @@ parse_lambda(Token *token){
token_expect(TK_CloseParen);
Ast_Expr *ret = parse_optional_type();
Ast_Block *block = token_is(OPEN_SCOPE) ? parse_block() : 0;
Ast_Lambda *result = ast_lambda(token, params, has_var_args, ret, block);
Ast_Scope *scope = token_is(OPEN_SCOPE) ? parse_stmt_scope() : 0;
Ast_Lambda *result = ast_lambda(token, params, has_var_args, ret, scope);
return result;
}
@@ -570,10 +578,17 @@ parse_decl(B32 is_global){
result = parse_enum(tname);
}
// @note parse constant expression
else{
Ast_Expr *expr = parse_expr();
result = ast_const(tname, tname->intern_val, expr);
if(expr->kind == AST_LAMBDA){
auto a = (Ast_Lambda *)expr;
if(a->scope){
result->kind = AST_LAMBDA;
}
}
}
}
else if(token_match(TK_Identifier, TK_Colon)){