From 4e9c1e7ccebfa6784746d6e8f59f0e3d9283d4a5 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 8 Jul 2020 13:54:21 -0500 Subject: [PATCH] Starting to refactor the linked-list nature --- docs/new_symbol_resolution | 19 +++++++++++++++++++ docs/optimizations | 11 +++++++++++ include/onyxparser.h | 2 +- onyx | Bin 213744 -> 213816 bytes src/onyx.c | 28 ++++++++-------------------- src/onyxparser.c | 23 +++++++++-------------- 6 files changed, 48 insertions(+), 35 deletions(-) create mode 100644 docs/new_symbol_resolution create mode 100644 docs/optimizations diff --git a/docs/new_symbol_resolution b/docs/new_symbol_resolution new file mode 100644 index 00000000..71c909ca --- /dev/null +++ b/docs/new_symbol_resolution @@ -0,0 +1,19 @@ +The current way I do symbol resolution is: + - Join all top level symbols at parse time into a single struct + - Add all top level symbols to a string table that maps from + their name to their AST node + - Then step through every function linearly and resolve each symbol using the table + * Function locals are added when they are declared and then removed at the end + of their scope as would be expected + +This method works, but it is not great and feels like a hack. + - References to other things are just pointers to the AST node + - This produces a heavy reliance on the AST instead of other, more efficient data structures + + + + +PROPOSED NEW METHOD: + Every top level declaration will add a declinfo entry that will contain the following information: + - Identifier + - Pointer to AST node diff --git a/docs/optimizations b/docs/optimizations new file mode 100644 index 00000000..abbe5aaf --- /dev/null +++ b/docs/optimizations @@ -0,0 +1,11 @@ +Some optimizations to make to the output WASM: + [ ] local.set followed by local.get turns into local.tee + [ ] Dead code elimination + - Function level: If a function is not explicitly called or exported, it may be removed + - Local level: If a local is not read, it may be removed + [ ] Add compile-time evaluation for simple operations + [ ] If statement compile-time condition evaluation + - If the condition of an if statement is compile time known, only generate the case that + is used + [ ] Inline-ing functions that have been explicitly marked + diff --git a/include/onyxparser.h b/include/onyxparser.h index 76886e14..37743009 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -24,6 +24,6 @@ const char* onyx_ast_node_kind_string(AstNodeKind kind); void* onyx_ast_node_new(bh_allocator alloc, i32 size, AstNodeKind kind); OnyxParser onyx_parser_create(bh_allocator alloc, OnyxTokenizer *tokenizer, OnyxMessages* msgs); void onyx_parser_free(OnyxParser* parser); -AstNode* onyx_parse(OnyxParser *parser); +bh_arr(AstNode *) onyx_parse(OnyxParser *parser); #endif // #ifndef ONYXPARSER_H diff --git a/onyx b/onyx index 5b8ecd947fd64cc24d11ac298b2521f261bdeaa2..e0cd5c77f1552d18e67b77a739aeb7e08a87196d 100755 GIT binary patch delta 58891 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 RVtx%w+~JvE?;m95{XeKXwLbs= delta 59012 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 diff --git a/src/onyx.c b/src/onyx.c index 4fbe8464..d843c498 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -106,7 +106,7 @@ static void compile_opts_free(OnyxCompileOptions* opts) { bh_arr_free(opts->files); } -static AstNode* parse_source_file(CompilerState* compiler_state, bh_file_contents* file_contents) { +static bh_arr(AstNode *) parse_source_file(CompilerState* compiler_state, bh_file_contents* file_contents) { // NOTE: Maybe don't want to recreate the tokenizer and parser for every file if (compiler_state->options->verbose_output) bh_printf("[Lexing] %s\n", file_contents->filename); @@ -142,42 +142,30 @@ static CompilerProgress process_source_file(CompilerState* compiler_state, char* bh_table_put(bh_file_contents, compiler_state->loaded_files, (char *) filename, fc); fc = bh_table_get(bh_file_contents, compiler_state->loaded_files, (char *) filename); - AstNode* root_node = parse_source_file(compiler_state, &fc); + bh_arr(AstNode *) top_nodes = parse_source_file(compiler_state, &fc); - if (compiler_state->options->print_ast) { - onyx_ast_print(root_node, 0); - bh_printf("\n"); - } - - AstNode* walker = root_node; - while (walker) { - switch (walker->kind) { + bh_arr_each(AstNode *, node, top_nodes) { + switch ((*node)->kind) { case AST_NODE_KIND_USE: - bh_arr_push(compiler_state->program.uses, (AstNodeUse *) walker); + bh_arr_push(compiler_state->program.uses, (AstNodeUse *) (*node)); break; case AST_NODE_KIND_GLOBAL: - bh_arr_push(compiler_state->program.globals, (AstNodeGlobal *) walker); + bh_arr_push(compiler_state->program.globals, (AstNodeGlobal *) (*node)); break; case AST_NODE_KIND_FOREIGN: - bh_arr_push(compiler_state->program.foreigns, (AstNodeForeign *) walker); + bh_arr_push(compiler_state->program.foreigns, (AstNodeForeign *) (*node)); break; case AST_NODE_KIND_FUNCTION: - bh_arr_push(compiler_state->program.functions, (AstNodeFunction *) walker); - break; - - case AST_NODE_KIND_PROGRAM: - // Dummy initial node + bh_arr_push(compiler_state->program.functions, (AstNodeFunction *) (*node)); break; default: assert(("Invalid top level node", 0)); break; } - - walker = walker->next; } bh_arr_each(AstNodeUse *, use_node, compiler_state->program.uses) { diff --git a/src/onyxparser.c b/src/onyxparser.c index f0590eb2..83f2b627 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -32,10 +32,6 @@ static void parser_next_token(OnyxParser* parser); static void parser_prev_token(OnyxParser* parser); static b32 is_terminating_token(TokenType token_type); static OnyxToken* expect(OnyxParser* parser, TokenType token_type); -static AstNodeScope* enter_scope(OnyxParser* parser); -static AstNodeScope* leave_scope(OnyxParser* parser); -static void insert_identifier(OnyxParser* parser, AstNode* ident, b32 is_local); -static void remove_identifier(OnyxParser* parser, AstNode* ident); static AstNodeNumLit* parse_numeric_literal(OnyxParser* parser); static AstNodeTyped* parse_factor(OnyxParser* parser); static AstNodeTyped* parse_expression(OnyxParser* parser); @@ -901,22 +897,21 @@ void onyx_parser_free(OnyxParser* parser) { bh_table_free(parser->identifiers); } -AstNode* onyx_parse(OnyxParser *parser) { - AstNode* program = make_node(AstNode, AST_NODE_KIND_PROGRAM); +bh_arr(AstNode *) onyx_parse(OnyxParser *parser) { + bh_arr(AstNode *) top_level_nodes = NULL; + bh_arr_new(global_heap_allocator, top_level_nodes, 4); - AstNode** prev_stmt = &program->next; - AstNode* curr_stmt = NULL; while (parser->curr_token->type != TOKEN_TYPE_END_STREAM) { - curr_stmt = parse_top_level_statement(parser); + AstNode* curr_stmt = parse_top_level_statement(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; + while (curr_stmt != NULL) { + bh_arr_push(top_level_nodes, curr_stmt); + curr_stmt = curr_stmt->next; + } } } - return program; + return top_level_nodes; } -- 2.25.1