Iterator + start to add core to core codegen
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user