From 8d01ea5fcf183ac6adccb97a4355d4a437ac0bad Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 22 Jun 2020 10:51:02 -0500 Subject: [PATCH] Added proper symbol resolution Compiler is now in a working state --- Makefile | 1 + include/onyxparser.h | 19 +-- include/onyxsempass.h | 29 ++++ onyx | Bin 165088 -> 173936 bytes progs/minimal.onyx | 52 ++++--- progs/new_minimal.onyx | 13 ++ src/onyx.c | 31 ++-- src/onyxparser.c | 215 +++++----------------------- src/onyxsempass.c | 316 +++++++++++++++++++++++++++++++++++++++++ src/onyxutils.c | 20 ++- 10 files changed, 470 insertions(+), 226 deletions(-) create mode 100644 include/onyxsempass.h create mode 100644 progs/new_minimal.onyx create mode 100644 src/onyxsempass.c diff --git a/Makefile b/Makefile index 54dc1cbb..bf09e282 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ OBJ_FILES=\ build/onyxlex.o \ build/onyxparser.o \ + build/onyxsempass.o \ build/onyxmsgs.o \ build/onyxutils.o \ build/onyxwasm.o \ diff --git a/include/onyxparser.h b/include/onyxparser.h index 081e2adc..39becb23 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -22,12 +22,9 @@ typedef struct OnyxParser { OnyxToken *prev_token; OnyxToken *curr_token; - // NOTE: A table of the current identifiers in the current scope. - // If the identifier doesn't at the time of parsing, it is an error. - // Cleared at the end of a block. - bh_table(OnyxAstNode*) identifiers; - OnyxAstNodeScope *curr_scope; - + // NOTE: Identifiers currently is only used to resolve type names + // at parse time, since these are the only symbols we know. + bh_table(OnyxAstNode *) identifiers; OnyxMessages *msgs; bh_allocator allocator; @@ -42,6 +39,7 @@ typedef enum OnyxAstNodeKind { ONYX_AST_NODE_KIND_BLOCK, ONYX_AST_NODE_KIND_SCOPE, ONYX_AST_NODE_KIND_LOCAL, + ONYX_AST_NODE_KIND_SYMBOL, ONYX_AST_NODE_KIND_ADD, ONYX_AST_NODE_KIND_MINUS, @@ -119,7 +117,6 @@ struct OnyxAstNodeNumLit { OnyxTypeInfo *type; OnyxAstNode *next; union { i32 i; i64 l; f32 f; f64 d; } value; - ptr unused; }; struct OnyxAstNodeLocal { @@ -127,20 +124,17 @@ struct OnyxAstNodeLocal { u32 flags; OnyxToken *token; OnyxTypeInfo *type; + OnyxAstNode *next; OnyxAstNodeLocal *prev_local; - OnyxAstNode *shadowed; - ptr unused; }; -// NOTE: Needs to have shadowed in the same position as OnyxAstNodeLocal struct OnyxAstNodeParam { OnyxAstNodeKind kind; u32 flags; OnyxToken *token; // Symbol name i.e. 'a', 'b' OnyxTypeInfo *type; OnyxAstNodeParam *next; - OnyxAstNode *shadowed; - ptr unused; + OnyxAstNodeLocal *prev_local; }; struct OnyxAstNodeScope { @@ -150,7 +144,6 @@ struct OnyxAstNodeScope { OnyxTypeInfo *type; // NOTE: UNUSED OnyxAstNodeScope *prev_scope; OnyxAstNodeLocal *last_local; - OnyxAstNode *unused; }; struct OnyxAstNodeBlock { diff --git a/include/onyxsempass.h b/include/onyxsempass.h new file mode 100644 index 00000000..fc5f4eca --- /dev/null +++ b/include/onyxsempass.h @@ -0,0 +1,29 @@ +#ifndef ONYXSEMPASS_H +#define ONYXSEMPASS_H + +#include "bh.h" + +#include "onyxlex.h" +#include "onyxparser.h" +#include "onyxmsgs.h" + +typedef struct SemPassSymbol { + OnyxAstNode *node; + struct SemPassSymbol *shadowed; +} SemPassSymbol; + +typedef struct OnyxSemPassState { + // NOTE: Adding node_allocator in case we need + // to make any more node in the tree + bh_allocator allocator, node_allocator; + OnyxMessages *msgs; + + OnyxAstNodeScope* curr_scope; + + bh_table(SemPassSymbol *) symbols; +} OnyxSemPassState; + +OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs); +void onyx_sempass(OnyxSemPassState* state, OnyxAstNode* root_node); + +#endif diff --git a/onyx b/onyx index cfd3f20a370ecf787b69acd09c5917471cdf4918..8cec77ebea577bbd812aee7adc52b376c672fb05 100755 GIT binary patch literal 173936 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 Qf9NBo{7q>E(jJ}v2_Xq-*Z=?k delta 65990 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 i32 { + if n <= 1 { return 1; } + + return n * factorial(n - 1); +} + foo :: proc -> i32 { return 10; } @@ -26,6 +53,11 @@ diff_square :: proc (a i32, b i32) -> i32 { c := a - b; // Mutable d :: a + b; // Constant + { + c := a * 2; + d := (b + a) * 2; + } + return c * d; } @@ -38,23 +70,3 @@ do_stuff :: proc -> i32 { float_test :: proc -> f32 { return 3.14159f; } - -export main :: proc { - output := do_stuff(); - - if output == -66 { - new_output :: abs(output) * 2; - print(new_output); - - } elseif output == -67 { - print(1234); - - } else { - print(-1); - } - - print(output); - print_float(float_test()); - - print_if(output, float_test()); -} diff --git a/progs/new_minimal.onyx b/progs/new_minimal.onyx new file mode 100644 index 00000000..cbb7fe06 --- /dev/null +++ b/progs/new_minimal.onyx @@ -0,0 +1,13 @@ +print :: foreign "host" "print" proc (value i32) --- + +foo :: proc -> i32 { + a := 2 + 4; + a = 5; + bar(a + 1); + print(bar(a)); + return a; +} + +bar :: proc (val i32) -> i32 { + return val + 1; +} diff --git a/src/onyx.c b/src/onyx.c index 2a57a80e..788be323 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -5,6 +5,7 @@ #include "onyxlex.h" #include "onyxmsgs.h" #include "onyxparser.h" +#include "onyxsempass.h" #include "onyxutils.h" #include "onyxwasm.h" @@ -49,27 +50,39 @@ int main(int argc, char *argv[]) { OnyxParser parser = onyx_parser_create(ast_alloc, &tokenizer, &msgs); OnyxAstNode* program = onyx_parse(&parser); + bh_printf("BEFORE SYMBOL_RESOLUTION: "); + onyx_ast_print(program, 1); + + bh_arena sp_arena; + bh_arena_init(&sp_arena, alloc, 16 * 1024); + bh_allocator sp_alloc = bh_arena_allocator(&sp_arena); + + OnyxSemPassState sp_state = onyx_sempass_create(sp_alloc, ast_alloc, &msgs); + onyx_sempass(&sp_state, program); + // NOTE: if there are errors, assume the parse tree was generated wrong, // even if it may have still been generated correctly. if (onyx_message_has_errors(&msgs)) { onyx_message_print(&msgs); goto main_exit; } else { - onyx_ast_print(program, 0); + bh_printf("\n\nAFTER SYMBOL RESOLUTION: "); + onyx_ast_print(program, 1); bh_printf("\nNo errors.\n"); } // NOTE: 4th: Generate a WASM module from the parse tree and // write it to a file. - OnyxWasmModule wasm_mod = onyx_wasm_generate_module(alloc, program); - - bh_file out_file; - bh_file_create(&out_file, "out.wasm"); - onyx_wasm_module_write_to_file(&wasm_mod, out_file); - bh_file_close(&out_file); - - onyx_wasm_module_free(&wasm_mod); +// OnyxWasmModule wasm_mod = onyx_wasm_generate_module(alloc, program); +// +// bh_file out_file; +// bh_file_create(&out_file, "out.wasm"); +// onyx_wasm_module_write_to_file(&wasm_mod, out_file); +// bh_file_close(&out_file); +// +// onyx_wasm_module_free(&wasm_mod); main_exit: // NOTE: Cleanup, since C doesn't have defer + bh_arena_free(&sp_arena); bh_arena_free(&msg_arena); bh_arena_free(&ast_arena); onyx_parser_free(&parser); diff --git a/src/onyxparser.c b/src/onyxparser.c index 0d0146ec..01dc0fec 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -12,6 +12,7 @@ static const char* ast_node_names[] = { "BLOCK", "SCOPE", "LOCAL", + "SYMBOL", "ADD", "MINUS", @@ -80,7 +81,7 @@ static OnyxAstNode* parse_expression(OnyxParser* parser); static OnyxAstNodeIf* parse_if_stmt(OnyxParser* parser); static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret); static OnyxAstNode* parse_return_statement(OnyxParser* parser); -static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function); +static OnyxAstNodeBlock* parse_block(OnyxParser* parser); static OnyxAstNode* parse_statement(OnyxParser* parser); static OnyxTypeInfo* parse_type(OnyxParser* parser); static OnyxAstNodeParam* parse_function_params(OnyxParser* parser); @@ -134,66 +135,6 @@ static OnyxToken* expect(OnyxParser* parser, OnyxTokenType token_type) { return token; } -static OnyxAstNodeScope* enter_scope(OnyxParser* parser) { - OnyxAstNodeScope* scope = (OnyxAstNodeScope*) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_SCOPE); - scope->prev_scope = parser->curr_scope; - parser->curr_scope = scope; - return scope; -} - -static OnyxAstNodeScope* leave_scope(OnyxParser* parser) { - // NOTE: Can't leave a scope if there is no scope - assert(parser->curr_scope != NULL); - - for (OnyxAstNodeLocal *walker = parser->curr_scope->last_local; walker != NULL; walker = walker->prev_local) { - remove_identifier(parser, (OnyxAstNode *) walker); - } - - parser->curr_scope = parser->curr_scope->prev_scope; - return parser->curr_scope; -} - -static OnyxAstNode* lookup_identifier(OnyxParser* parser, OnyxToken* token) { - OnyxAstNode* ident = NULL; - - onyx_token_null_toggle(*token); - if (bh_table_has(OnyxAstNode*, parser->identifiers, token->token)) { - ident = bh_table_get(OnyxAstNode*, parser->identifiers, token->token); - } - onyx_token_null_toggle(*token); - - return ident; -} - -static void insert_identifier(OnyxParser* parser, OnyxAstNode* ident, b32 is_local) { - OnyxAstNodeLocal* local = (OnyxAstNodeLocal *) ident; - if (is_local) { - OnyxAstNodeScope* scope = parser->curr_scope; - local->prev_local = scope->last_local; - scope->last_local = local; - } - - onyx_token_null_toggle(*local->token); - if (bh_table_has(OnyxAstNode*, parser->identifiers, local->token->token)) { - local->shadowed = bh_table_get(OnyxAstNode*, parser->identifiers, local->token->token); - } - - bh_table_put(OnyxAstNodeLocal*, parser->identifiers, local->token->token, local); - onyx_token_null_toggle(*local->token); -} - -static void remove_identifier(OnyxParser* parser, OnyxAstNode* ident) { - OnyxAstNodeLocal* local = (OnyxAstNodeLocal *) ident; - - onyx_token_null_toggle(*local->token); - if (local->shadowed) { - bh_table_put(OnyxAstNode*, parser->identifiers, local->token->token, local->shadowed); - } else { - bh_table_delete(OnyxAstNode*, parser->identifiers, local->token->token); - } - onyx_token_null_toggle(*local->token); -} - static OnyxAstNodeNumLit* parse_numeric_literal(OnyxParser* parser) { OnyxAstNodeNumLit* lit_node = (OnyxAstNodeNumLit *) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_LITERAL); lit_node->token = expect(parser, TOKEN_TYPE_LITERAL_NUMERIC); @@ -260,16 +201,8 @@ static OnyxAstNode* parse_factor(OnyxParser* parser) { case TOKEN_TYPE_SYMBOL: { OnyxToken* sym_token = expect(parser, TOKEN_TYPE_SYMBOL); - OnyxAstNode* sym_node = lookup_identifier(parser, sym_token); - if (sym_node == NULL) { - onyx_token_null_toggle(*sym_token); - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_UNKNOWN_SYMBOL, - sym_token->pos, sym_token->token); - onyx_token_null_toggle(*sym_token); - - return sym_node; - } + OnyxAstNode* sym_node = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_SYMBOL); + sym_node->token = sym_token; if (parser->curr_token->type != TOKEN_TYPE_OPEN_PAREN) { return sym_node; @@ -406,16 +339,6 @@ static OnyxAstNode* parse_expression(OnyxParser* parser) { bin_op->type = parse_type(parser); } else { right = parse_factor(parser); - if (left->type != right->type) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, - bin_op_tok->pos, - left->type->name, right->type->name); - - find_token(parser, TOKEN_TYPE_SYM_SEMICOLON); - return &error_node; - } - bin_op->right = right; bin_op->type = right->type; @@ -434,25 +357,25 @@ static OnyxAstNodeIf* parse_if_stmt(OnyxParser* parser) { expect(parser, TOKEN_TYPE_KEYWORD_IF); OnyxAstNode* cond = parse_expression(parser); - OnyxAstNode* true_block = (OnyxAstNode *) parse_block(parser, 0); + OnyxAstNode* true_block = (OnyxAstNode *) parse_block(parser); OnyxAstNodeIf* if_node = (OnyxAstNodeIf *) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_IF); OnyxAstNodeIf* root_if = if_node; if_node->cond = cond; if (true_block != NULL) - if_node->true_block = true_block->as_block.body; + if_node->true_block = true_block; while (parser->curr_token->type == TOKEN_TYPE_KEYWORD_ELSEIF) { parser_next_token(parser); OnyxAstNodeIf* elseif_node = (OnyxAstNodeIf *) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_IF); cond = parse_expression(parser); - true_block = (OnyxAstNode *) parse_block(parser, 0); + true_block = (OnyxAstNode *) parse_block(parser); elseif_node->cond = cond; if (true_block != NULL) - elseif_node->true_block = true_block->as_block.body; + elseif_node->true_block = true_block; if_node->false_block = (OnyxAstNode *) elseif_node; if_node = elseif_node; @@ -461,9 +384,9 @@ static OnyxAstNodeIf* parse_if_stmt(OnyxParser* parser) { if (parser->curr_token->type == TOKEN_TYPE_KEYWORD_ELSE) { parser_next_token(parser); - OnyxAstNode* false_block = (OnyxAstNode *) parse_block(parser, 0); + OnyxAstNode* false_block = (OnyxAstNode *) parse_block(parser); if (false_block != NULL) - if_node->false_block = false_block->as_block.body; + if_node->false_block = false_block; } return root_if; @@ -490,9 +413,8 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { OnyxAstNodeLocal* local = (OnyxAstNodeLocal*) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_LOCAL); local->token = symbol; local->type = type; - local->flags |= ONYX_AST_FLAG_LVAL; - - insert_identifier(parser, (OnyxAstNode *) local, 1); + local->flags |= ONYX_AST_FLAG_LVAL; // NOTE: DELETE + *ret = (OnyxAstNode *) local; if (parser->curr_token->type == TOKEN_TYPE_SYM_EQUALS || parser->curr_token->type == TOKEN_TYPE_SYM_COLON) { if (parser->curr_token->type == TOKEN_TYPE_SYM_COLON) { @@ -500,6 +422,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { } OnyxAstNode* assignment = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_ASSIGNMENT); + local->next = assignment; assignment->token = parser->curr_token; parser_next_token(parser); @@ -514,18 +437,10 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { return 1; } assignment->right = expr; - assignment->left = (OnyxAstNode*) local; - if (local->type->is_known && local->type != expr->type) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_ASSIGNMENT_TYPE_MISMATCH, - assignment->token->pos, - local->type->name, expr->type->name); - return 1; - } else if (!local->type->is_known) { - local->type = expr->type; - } - *ret = assignment; + OnyxAstNode* left_symbol = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_SYMBOL); + left_symbol->token = symbol; + assignment->left = left_symbol; } return 1; } @@ -535,39 +450,15 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { { parser_next_token(parser); - OnyxAstNode* lval = lookup_identifier(parser, symbol); - - if (lval != NULL && lval->flags & ONYX_AST_FLAG_LVAL && (lval->flags & ONYX_AST_FLAG_CONST) == 0) { - OnyxAstNode* rval = parse_expression(parser); - OnyxAstNode* assignment = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_ASSIGNMENT); - assignment->right = rval; - assignment->left = lval; - *ret = assignment; - return 1; - } - - onyx_token_null_toggle(*symbol); - if (lval == NULL) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_UNKNOWN_SYMBOL, - symbol->pos, symbol->token); - } - - else if ((lval->flags & ONYX_AST_FLAG_LVAL) == 0) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_NOT_LVAL, - symbol->pos, symbol->token); - } - - else if (lval->flags & ONYX_AST_FLAG_CONST) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_ASSIGN_CONST, - symbol->pos, symbol->token); - } - onyx_token_null_toggle(*symbol); + OnyxAstNode* lval = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_SYMBOL); + lval->token = symbol; - find_token(parser, TOKEN_TYPE_SYM_SEMICOLON); - return 1; + OnyxAstNode* rval = parse_expression(parser); + OnyxAstNode* assignment = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_ASSIGNMENT); + assignment->right = rval; + assignment->left = lval; + *ret = assignment; + return 1; } default: @@ -608,7 +499,7 @@ static OnyxAstNode* parse_statement(OnyxParser* parser) { case TOKEN_TYPE_OPEN_BRACE: needs_semicolon = 0; - retval = (OnyxAstNode *) parse_block(parser, 0); + retval = (OnyxAstNode *) parse_block(parser); break; case TOKEN_TYPE_SYMBOL: @@ -649,7 +540,7 @@ static OnyxAstNode* parse_statement(OnyxParser* parser) { return retval; } -static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function) { +static OnyxAstNodeBlock* parse_block(OnyxParser* parser) { // --- is for an empty block if (parser->curr_token->type == TOKEN_TYPE_SYM_MINUS) { expect(parser, TOKEN_TYPE_SYM_MINUS); @@ -661,10 +552,8 @@ static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function expect(parser, TOKEN_TYPE_OPEN_BRACE); OnyxAstNodeBlock* block = (OnyxAstNodeBlock *) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_BLOCK); - if (belongs_to_function) { - OnyxAstNodeScope* scope = enter_scope(parser); - block->scope = scope; - } + OnyxAstNodeScope* scope = (OnyxAstNodeScope *) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_SCOPE); + block->scope = scope; OnyxAstNode** next = &block->body; OnyxAstNode* stmt = NULL; @@ -673,16 +562,14 @@ static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function if (stmt != NULL && stmt->kind != ONYX_AST_NODE_KIND_ERROR) { *next = stmt; + + while (stmt->next != NULL) stmt = stmt->next; next = &stmt->next; } } expect(parser, TOKEN_TYPE_CLOSE_BRACE); - if (belongs_to_function) { - leave_scope(parser); - } - return block; } @@ -762,15 +649,7 @@ static OnyxAstNodeFuncDef* parse_function_definition(OnyxParser* parser) { func_def->return_type = &builtin_types[ONYX_TYPE_INFO_KIND_VOID]; } - for (OnyxAstNodeParam* p = func_def->params; p != NULL; p = p->next) { - insert_identifier(parser, (OnyxAstNode *) p, 0); - } - - func_def->body = parse_block(parser, 1); - - for (OnyxAstNodeParam* p = func_def->params; p != NULL; p = p->next) { - remove_identifier(parser, (OnyxAstNode *) p); - } + func_def->body = parse_block(parser); return func_def; } @@ -801,26 +680,6 @@ static OnyxAstNode* parse_top_level_symbol(OnyxParser* parser) { } } -static b32 define_function(OnyxParser* parser, OnyxAstNodeFuncDef* func) { - onyx_token_null_toggle(*func->token); - - if (!bh_table_has(OnyxAstNode *, parser->identifiers, func->token->token)) { - bh_table_put(OnyxAstNode *, parser->identifiers, func->token->token, func); - } else { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_FUNCTION_REDEFINITION, - func->token->pos, - func->token->token); - - // NOTE: I really wish C had defer... - onyx_token_null_toggle(*func->token); - return 0; - } - - onyx_token_null_toggle(*func->token); - return 1; -} - static OnyxAstNode* parse_top_level_statement(OnyxParser* parser) { switch (parser->curr_token->type) { case TOKEN_TYPE_KEYWORD_USE: @@ -855,21 +714,12 @@ static OnyxAstNode* parse_top_level_statement(OnyxParser* parser) { OnyxAstNode* node = parse_top_level_symbol(parser); if (node->kind == ONYX_AST_NODE_KIND_FUNCDEF) { node->token = symbol; - - if (!define_function(parser, &node->as_funcdef)) { - return NULL; - } } if (node->kind == ONYX_AST_NODE_KIND_FOREIGN) { OnyxAstNodeForeign* foreign = &node->as_foreign; foreign->import->token = symbol; - if (foreign->import->kind == ONYX_AST_NODE_KIND_FUNCDEF) { - if (!define_function(parser, &foreign->import->as_funcdef)) { - return NULL; - } - } } return node; @@ -921,7 +771,6 @@ OnyxParser onyx_parser_create(bh_allocator alloc, OnyxTokenizer *tokenizer, Onyx parser.curr_token = tokenizer->tokens; parser.prev_token = NULL; parser.msgs = msgs; - parser.curr_scope = NULL; return parser; } @@ -941,6 +790,8 @@ OnyxAstNode* onyx_parse(OnyxParser *parser) { // Building a linked list of statements down the "next" chain if (curr_stmt != NULL && curr_stmt != &error_node) { *prev_stmt = curr_stmt; + + while (curr_stmt->next != NULL) curr_stmt = curr_stmt->next; prev_stmt = &curr_stmt->next; } } diff --git a/src/onyxsempass.c b/src/onyxsempass.c new file mode 100644 index 00000000..233646fd --- /dev/null +++ b/src/onyxsempass.c @@ -0,0 +1,316 @@ +#define BH_DEBUG +#include "onyxsempass.h" + +OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs) { + OnyxSemPassState state = { + .allocator = alloc, + .node_allocator = node_alloc, + + .msgs = msgs, + + .curr_scope = NULL, + .symbols = NULL, + }; + + bh_table_init(bh_heap_allocator(), state.symbols, 61); + + return state; +} + +static void symbol_introduce(OnyxSemPassState* state, OnyxAstNode* symbol); +static void symbol_remove(OnyxSemPassState* state, OnyxAstNode* symbol); +static OnyxAstNode* symbol_resolve(OnyxSemPassState* state, OnyxAstNode* symbol); +static void scope_enter(OnyxSemPassState* state, OnyxAstNodeScope* scope); +static OnyxAstNodeScope* scope_leave(OnyxSemPassState* state); +static b32 define_function(OnyxSemPassState* state, OnyxAstNodeFuncDef* func); +static void symres_local(OnyxSemPassState* state, OnyxAstNodeLocal** local); +static void symres_call(OnyxSemPassState* state, OnyxAstNode* call); +static void symres_expression(OnyxSemPassState* state, OnyxAstNode** expr); +static void symres_assignment(OnyxSemPassState* state, OnyxAstNode* assign); +static void symres_return(OnyxSemPassState* state, OnyxAstNode* ret); +static void symres_if(OnyxSemPassState* state, OnyxAstNodeIf* ifnode); +static void symres_statement_chain(OnyxSemPassState* state, OnyxAstNode* walker, OnyxAstNode** trailer); +static b32 symres_statement(OnyxSemPassState* state, OnyxAstNode* stmt); +static void symres_block(OnyxSemPassState* state, OnyxAstNodeBlock* block); +static void symres_function_definition(OnyxSemPassState* state, OnyxAstNodeFuncDef* func); + +static void symbol_introduce(OnyxSemPassState* state, OnyxAstNode* symbol) { + onyx_token_null_toggle(*symbol->token); + + SemPassSymbol* sp_sym = (SemPassSymbol *) bh_alloc_item(state->allocator, SemPassSymbol); + sp_sym->node = symbol; + sp_sym->shadowed = NULL; + + if (bh_table_has(SemPassSymbol *, state->symbols, symbol->token->token)) { + sp_sym->shadowed = bh_table_get(SemPassSymbol *, state->symbols, symbol->token->token); + } + + bh_table_put(SemPassSymbol *, state->symbols, symbol->token->token, sp_sym); + + if (symbol->kind == ONYX_AST_NODE_KIND_LOCAL) { + OnyxAstNodeLocal* local = &symbol->as_local; + local->prev_local = state->curr_scope->last_local; + state->curr_scope->last_local = local; + } + + onyx_token_null_toggle(*symbol->token); +} + +static void symbol_remove(OnyxSemPassState* state, OnyxAstNode* symbol) { + onyx_token_null_toggle(*symbol->token); + + SemPassSymbol* sp_sym = bh_table_get(SemPassSymbol *, state->symbols, symbol->token->token); + + if (sp_sym->shadowed) { + bh_table_put(SemPassSymbol *, state->symbols, symbol->token->token, sp_sym->shadowed); + } else { + bh_table_delete(SemPassSymbol *, state->symbols, symbol->token->token); + } + + onyx_token_null_toggle(*symbol->token); +} + +static OnyxAstNode* symbol_resolve(OnyxSemPassState* state, OnyxAstNode* symbol) { + onyx_token_null_toggle(*symbol->token); + + if (!bh_table_has(SemPassSymbol *, state->symbols, symbol->token->token)) { + onyx_message_add(state->msgs, + ONYX_MESSAGE_TYPE_UNKNOWN_SYMBOL, + symbol->token->pos, + symbol->token->token); + + onyx_token_null_toggle(*symbol->token); + return NULL; + } + + SemPassSymbol* sp_sym = bh_table_get(SemPassSymbol *, state->symbols, symbol->token->token); + + onyx_token_null_toggle(*symbol->token); + return sp_sym->node; +} + +static void scope_enter(OnyxSemPassState* state, OnyxAstNodeScope* scope) { + scope->prev_scope = state->curr_scope; + state->curr_scope = scope; +} + +static OnyxAstNodeScope* scope_leave(OnyxSemPassState* state) { + // NOTE: Can't leave a scope if there is no scope + assert(state->curr_scope != NULL); + + for (OnyxAstNodeLocal *walker = state->curr_scope->last_local; walker != NULL; walker = walker->prev_local) { + symbol_remove(state, (OnyxAstNode *) walker); + } + + state->curr_scope = state->curr_scope->prev_scope; + return state->curr_scope; +} + +static b32 define_function(OnyxSemPassState* state, OnyxAstNodeFuncDef* func) { + onyx_token_null_toggle(*func->token); + + // NOTE: If the function hasn't already been defined + if (!bh_table_has(SemPassSymbol *, state->symbols, func->token->token)) { + SemPassSymbol* sp_sym = bh_alloc_item(state->allocator, SemPassSymbol); + sp_sym->node = (OnyxAstNode *) func; + sp_sym->shadowed = NULL; + bh_table_put(SemPassSymbol *, state->symbols, func->token->token, sp_sym); + } else { + onyx_message_add(state->msgs, + ONYX_MESSAGE_TYPE_FUNCTION_REDEFINITION, + func->token->pos, + func->token->token); + + // NOTE: I really wish C had defer... + onyx_token_null_toggle(*func->token); + return 0; + } + + onyx_token_null_toggle(*func->token); + return 1; +} + +static void symres_local(OnyxSemPassState* state, OnyxAstNodeLocal** local) { + symbol_introduce(state, (OnyxAstNode *) *local); +} + +static void symres_call(OnyxSemPassState* state, OnyxAstNode* stmt) { + OnyxAstNodeCall* call = &stmt->as_call; + + OnyxAstNode* callee = symbol_resolve(state, call->callee); + if (callee) call->callee = callee; + else DEBUG_HERE; + + symres_statement_chain(state, call->arguments, &call->arguments); +} + +static void symres_expression(OnyxSemPassState* state, OnyxAstNode** expr) { + switch ((*expr)->kind) { + case ONYX_AST_NODE_KIND_ADD: + case ONYX_AST_NODE_KIND_MINUS: + case ONYX_AST_NODE_KIND_MULTIPLY: + case ONYX_AST_NODE_KIND_DIVIDE: + case ONYX_AST_NODE_KIND_MODULUS: + case ONYX_AST_NODE_KIND_EQUAL: + case ONYX_AST_NODE_KIND_NOT_EQUAL: + case ONYX_AST_NODE_KIND_LESS: + case ONYX_AST_NODE_KIND_LESS_EQUAL: + case ONYX_AST_NODE_KIND_GREATER: + case ONYX_AST_NODE_KIND_GREATER_EQUAL: + symres_expression(state, &(*expr)->left); + symres_expression(state, &(*expr)->right); + break; + + case ONYX_AST_NODE_KIND_NEGATE: + symres_expression(state, &(*expr)->left); + break; + + case ONYX_AST_NODE_KIND_CAST: + if ((*expr)->type == NULL) { + DEBUG_HERE; + return; + } + symres_expression(state, &(*expr)->left); + break; + + case ONYX_AST_NODE_KIND_CALL: symres_call(state, *expr); break; + + case ONYX_AST_NODE_KIND_BLOCK: symres_block(state, &(*expr)->as_block); + + case ONYX_AST_NODE_KIND_SYMBOL: + *expr = symbol_resolve(state, *expr); + break; + + // NOTE: This is a good case, since it means the symbol is already resolved + case ONYX_AST_NODE_KIND_LOCAL: break; + + case ONYX_AST_NODE_KIND_LITERAL: break; + + default: + DEBUG_HERE; + break; + } +} + +static void symres_assignment(OnyxSemPassState* state, OnyxAstNode* assign) { + OnyxAstNode* lval = symbol_resolve(state, assign->left); + if (lval == NULL) return; + assign->left = lval; + + symres_expression(state, &assign->right); +} + +static void symres_return(OnyxSemPassState* state, OnyxAstNode* ret) { + if (ret->left) + symres_expression(state, &ret->left); +} + +static void symres_if(OnyxSemPassState* state, OnyxAstNodeIf* ifnode) { + symres_expression(state, &ifnode->cond); + if (ifnode->true_block) { + if (ifnode->true_block->kind == ONYX_AST_NODE_KIND_BLOCK) + symres_block(state, &ifnode->true_block->as_block); + + else if (ifnode->true_block->kind == ONYX_AST_NODE_KIND_IF) + symres_if(state, &ifnode->true_block->as_if); + + else DEBUG_HERE; + } + + if (ifnode->false_block) { + if (ifnode->false_block->kind == ONYX_AST_NODE_KIND_BLOCK) + symres_block(state, &ifnode->false_block->as_block); + + else if (ifnode->false_block->kind == ONYX_AST_NODE_KIND_IF) + symres_if(state, &ifnode->false_block->as_if); + + else DEBUG_HERE; + } +} + +// NOTE: Returns 1 if the statment should be removed +static b32 symres_statement(OnyxSemPassState* state, OnyxAstNode* stmt) { + switch (stmt->kind) { + case ONYX_AST_NODE_KIND_LOCAL: symres_local(state, (OnyxAstNodeLocal **) &stmt); return 1; + case ONYX_AST_NODE_KIND_ASSIGNMENT: symres_assignment(state, stmt); return 0; + case ONYX_AST_NODE_KIND_RETURN: symres_return(state, stmt); return 0; + case ONYX_AST_NODE_KIND_IF: symres_if(state, &stmt->as_if); return 0; + case ONYX_AST_NODE_KIND_CALL: symres_call(state, stmt); return 0; + case ONYX_AST_NODE_KIND_ARGUMENT: symres_expression(state, (OnyxAstNode **) &stmt->left); return 0; + + default: return 0; + } +} + +static void symres_statement_chain(OnyxSemPassState* state, OnyxAstNode* walker, OnyxAstNode** trailer) { + while (walker) { + if (symres_statement(state, walker)) { + *trailer = walker->next; + + OnyxAstNode* tmp = walker->next; + walker->next = NULL; + walker = tmp; + } else { + trailer = &walker; + walker = walker->next; + } + } +} + +static void symres_block(OnyxSemPassState* state, OnyxAstNodeBlock* block) { + scope_enter(state, block->scope); + if (block->body) + symres_statement_chain(state, block->body, &block->body); + scope_leave(state); +} + +static void symres_function_definition(OnyxSemPassState* state, OnyxAstNodeFuncDef* func) { + forll(OnyxAstNodeParam, param, func->params, next) { + symbol_introduce(state, (OnyxAstNode *) param); + } + + symres_block(state, func->body); + + forll(OnyxAstNodeParam, param, func->params, next) { + symbol_remove(state, (OnyxAstNode *) param); + } +} + +void onyx_sempass(OnyxSemPassState* state, OnyxAstNode* root_node) { + OnyxAstNode* walker = root_node; + while (walker) { + switch (walker->kind) { + case ONYX_AST_NODE_KIND_FUNCDEF: + if (!define_function(state, &walker->as_funcdef)) return; + break; + + case ONYX_AST_NODE_KIND_FOREIGN: + if (walker->as_foreign.import->kind == ONYX_AST_NODE_KIND_FUNCDEF) { + if (!define_function(state, &walker->as_foreign.import->as_funcdef)) return; + } + break; + + default: break; + } + + walker = walker->next; + } + + bh_printf("\n\n"); + bh_table_each_start(SemPassSymbol*, state->symbols) { + bh_printf("%s -> %l\n", key, (u64) value); + } bh_table_each_end; + + // NOTE: First, resolve all symbols + walker = root_node; + while (walker) { + switch (walker->kind) { + case ONYX_AST_NODE_KIND_FUNCDEF: + symres_function_definition(state, &walker->as_funcdef); + break; + default: break; + } + + walker = walker->next; + } +} diff --git a/src/onyxutils.c b/src/onyxutils.c index 732be585..2964b344 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -88,10 +88,20 @@ void onyx_ast_print(OnyxAstNode* node, i32 indent) { if (local->prev_local && indent == 0) { bh_printf(", "); onyx_ast_print((OnyxAstNode *) local->prev_local, 0); - } + } else if (local->next && indent != 0) { + onyx_ast_print(local->next, indent); + } break; } + case ONYX_AST_NODE_KIND_SYMBOL: { + bh_printf("%b", node->token->token, node->token->length); + if (node->next) { + onyx_ast_print(node->next, indent); + } + break; + } + case ONYX_AST_NODE_KIND_RETURN: { if (node->left) { onyx_ast_print(node->left, indent + 1); @@ -119,7 +129,13 @@ void onyx_ast_print(OnyxAstNode* node, i32 indent) { case ONYX_AST_NODE_KIND_CALL: { OnyxAstNodeCall* call = &node->as_call; - bh_printf("%b", call->callee->token->token, call->callee->token->length); + if (call->callee) { + if (call->callee->kind == ONYX_AST_NODE_KIND_FUNCDEF) { + bh_printf("function: %b", call->callee->token->token, call->callee->token->length); + } else { + onyx_ast_print(call->callee, indent + 1); + } + } onyx_ast_print(call->arguments, indent + 1); if (call->next) { onyx_ast_print(call->next, indent); -- 2.25.1