Basic resolving, codegen with packages
This commit is contained in:
49
parsing.cpp
49
parsing.cpp
@@ -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)){
|
||||
|
||||
Reference in New Issue
Block a user