Iterator + start to add core to core codegen

This commit is contained in:
Krzosa Karol
2023-03-31 17:38:32 +02:00
parent 1839279235
commit 277404fe95
6 changed files with 198 additions and 61 deletions

View File

@@ -266,7 +266,9 @@ parse_expr_call(Ast_Expr *left, Token_Kind close_kind) {
CORE_Static Ast_Expr *
parse_optional_type() {
Ast_Expr *result = 0;
if (token_match(TK_Colon)) result = parse_expr();
if (token_match(TK_Colon)) {
result = parse_expr();
}
return result;
}
@@ -418,6 +420,8 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0) {
Ast_If *result_if = ast_if(token, if_nodes);
scope->stmts.add(result_if);
}
// Var unpack
else if (token_is(TK_Identifier) && token_is(TK_Comma, 1)) {
Array<Ast_Decl *> decls = {scratch.arena};
do {
@@ -431,6 +435,8 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0) {
Ast_Var_Unpack *vars = ast_var_unpack(token, decls, expr);
scope->stmts.add(vars);
}
// Declaration or init stmt
else {
Ast *result = parse_decl(false);
if (result && result->kind != AST_VAR && result->kind != AST_CONST) {
@@ -470,6 +476,7 @@ parse_parameter_list(Arena *arena) {
Ast_Decl *param = ast_new(Ast_Decl, AST_VAR, name, AST_DECL);
param->name = name->intern_val;
param->typespec = parse_expr();
set_flag(param->typespec->flags, AST_TYPESPEC);
propagate_polymorphic(param, param->typespec);
propagate_polymorphic(param, name);
@@ -499,6 +506,7 @@ parse_lambda(Token *token) {
if (token_match(TK_Colon)) {
do {
Ast_Expr *typespec = parse_expr();
set_flag(typespec->flags, AST_TYPESPEC);
ret.add(typespec);
} while (token_match(TK_Comma));
}
@@ -595,7 +603,7 @@ parse_expr(S64 min_bp) {
Token *token = token_next();
Binding_Power prefix_bp = binding_power(Binding_Prefix, token->kind);
// @note: parse prefix expression
// parse prefix expression
switch (token->kind) {
case TK_StringLit: left = ast_str(token, token->intern_val); break;
case TK_Identifier: left = ast_ident(token, token->intern_val); break;
@@ -611,14 +619,14 @@ parse_expr(S64 min_bp) {
case TK_Decrement: left = ast_expr_unary(token, TK_Decrement, parse_expr(prefix_bp.right)); break;
case TK_Dereference: left = ast_expr_unary(token, TK_Dereference, parse_expr(prefix_bp.right)); break;
// Pointer typespec
// Pointer -> *int, Deref -> *var
case TK_Pointer: {
left = ast_expr_unary(token, TK_Pointer, parse_expr(prefix_bp.right));
auto unary = (Ast_Unary *)left;
propagate_polymorphic(unary, unary->expr);
} break;
// Array typespec
// Array subscript -> [32]int
case TK_OpenBracket: {
Ast_Expr *expr = 0;
if (!token_is(TK_CloseBracket))
@@ -669,7 +677,7 @@ parse_expr(S64 min_bp) {
Binding_Power postfix_bp = binding_power(Binding_Postfix, token->kind);
Binding_Power infix_bp = binding_power(Binding_Infix, token->kind);
// @note: parse postfix expression
// parse postfix expression
if (postfix_bp.left > min_bp) {
token_next();
switch (token->kind) {
@@ -694,7 +702,7 @@ parse_expr(S64 min_bp) {
}
}
// @note: parse infix expression
// parse infix expression
else if (infix_bp.left > min_bp) {
token = token_next();
Ast_Expr *right = parse_expr(infix_bp.right);
@@ -734,6 +742,8 @@ parse_struct(Token *pos, Ast_Kind kind) {
token_expect(TK_Colon);
Ast_Expr *typespec = parse_expr();
set_flag(typespec->flags, AST_TYPESPEC);
Ast_Decl *decl = ast_var(token, typespec, token->intern_val, 0);
set_flag(decl->flags, AST_AGGREGATE_CHILD);
add(pctx->perm, &scope->decls, decl);
@@ -953,8 +963,10 @@ parse_decl(B32 is_global) {
result->kind = AST_LAMBDA;
result->flags = set_flag(result->flags, AST_OPERATOR_OVERLOAD);
}
else if (token_match(TK_Identifier, TK_Colon)) {
Ast_Expr *typespec = parse_expr();
set_flag(typespec->flags, AST_TYPESPEC);
Ast_Expr *expr = parse_assign_expr();
if (token_match_pound(pctx->intern_foreign))
set_flag(flags, AST_FOREIGN);