From 19af8b7a3724f959149428a2ed6adc5e332af550 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 1 Jul 2020 21:34:10 -0500 Subject: [PATCH] 'use' statements work; only initial version --- .vimspector.json | 2 +- docs/thoughts | 38 +++++------ include/onyxparser.h | 13 ++++ misc/onyx.vim | 5 +- onyx | Bin 220808 -> 222344 bytes progs/break_test.onyx | 2 +- progs/game.onyx | 14 ---- progs/minimal.onyx | 16 ++--- progs/mvp.onyx | 21 ------ progs/new_minimal.onyx | 6 +- progs/other.onyx | 8 ++- progs/print_funcs.onyx | 5 ++ progs/test.onyx | 26 ++----- src/onyx.c | 149 +++++++++++++++++++++++++++-------------- src/onyxparser.c | 11 ++- src/onyxutils.c | 10 +++ 16 files changed, 180 insertions(+), 146 deletions(-) delete mode 100644 progs/game.onyx delete mode 100644 progs/mvp.onyx create mode 100644 progs/print_funcs.onyx diff --git a/.vimspector.json b/.vimspector.json index b101bde4..e309f7f9 100644 --- a/.vimspector.json +++ b/.vimspector.json @@ -6,7 +6,7 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/onyx", - "args": ["-ast", "progs/other.onyx", "progs/test.onyx"], + "args": ["progs/test.onyx"], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], diff --git a/docs/thoughts b/docs/thoughts index de164d11..639488db 100644 --- a/docs/thoughts +++ b/docs/thoughts @@ -1,26 +1,18 @@ -Type checking at parse time: - Why couldn't this work? - * Every variable is of known type or the type must be known by immediate assignment - * This requires that functions are declared in a particular order like C - * This also requires immediate evaluation of external symbols (C #include style) - - Don't like this at all - - Want a proper module system <<<< +Memory design: + - Pointers will work very similar to how they do in C + - A pointer is a u32 + - Pointers will be notated: + ^u32 <- Pointer to u32 - /* foo.onyx */ - foo :: proc (a i32) -> f32 { - return a as f32; - } + - Pointer operations will be: + * will take the address of a value + - This operation will not be defined well for a while + - You can't take the address of a local since it doesn't exist in memory + << will take the value out of a pointer - /* main.onyx */ - use "foo"; - - export main :: proc () -> void { - a := 2.0f + foo(5); - } - - foo(5) would have a left node of SYMBOL:foo - This will be resolved in a later stage between the parsing and semantic pass - Type checking and resolving would have to occur afterwards - -Creating an IR: + Example use: + {{{ + ptr: ^i32 = 0; // Address starting at 0 + ptr_ptr := ^ptr; + }}} diff --git a/include/onyxparser.h b/include/onyxparser.h index 6f256564..137a1987 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -20,6 +20,7 @@ typedef struct OnyxAstNodeFuncDef OnyxAstNodeFuncDef; typedef struct OnyxAstNodeForeign OnyxAstNodeForeign; typedef struct OnyxAstNodeGlobal OnyxAstNodeGlobal; typedef struct OnyxAstNodeCall OnyxAstNodeCall; +typedef struct OnyxAstNodeUse OnyxAstNodeUse; typedef struct OnyxAstNodeFile OnyxAstNodeFile; typedef struct OnyxParser { @@ -38,6 +39,7 @@ typedef struct OnyxParser { typedef enum OnyxAstNodeKind { ONYX_AST_NODE_KIND_ERROR, ONYX_AST_NODE_KIND_PROGRAM, + ONYX_AST_NODE_KIND_USE, ONYX_AST_NODE_KIND_FUNCDEF, ONYX_AST_NODE_KIND_FOREIGN, @@ -265,6 +267,16 @@ struct OnyxAstNodeCall { // unless this becomes used by something else }; +struct OnyxAstNodeUse { + OnyxAstNodeKind kind; + u32 flags; + OnyxToken *token; + OnyxTypeInfo *type; + u64 data; + OnyxAstNode *next; + OnyxToken *filename; +}; + struct OnyxAstNodeFile { OnyxAstNodeKind kind; u32 flags; @@ -302,6 +314,7 @@ union OnyxAstNode { OnyxAstNodeGlobal as_global; OnyxAstNodeIf as_if; OnyxAstNodeWhile as_while; + OnyxAstNodeUse as_use; OnyxAstNodeFile as_file; }; diff --git a/misc/onyx.vim b/misc/onyx.vim index 6a375966..8edffc14 100644 --- a/misc/onyx.vim +++ b/misc/onyx.vim @@ -16,8 +16,9 @@ syn keyword onyxKeyword for while loop return do syn keyword onyxKeyword break continue return syn keyword onyxKeyword as -syn keyword onyxType i32 -syn keyword onyxType i64 +syn keyword onyxType unknown bool +syn keyword onyxType i32 u32 +syn keyword onyxType i64 u64 syn keyword onyxType f32 syn keyword onyxType f64 diff --git a/onyx b/onyx index eb5f54188bf77f3602b68b7d3035a7919f85bbc0..c8eaac115b5090e2c5c48a211ceb77d0c451fd4f 100755 GIT binary patch delta 81640 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 GuKx?HMFIZ+ delta 79294 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 i32 { +factorial :: proc (n: i32) -> i32 { if n <= 1 { return 1; } return n * factorial(n - 1); @@ -35,7 +35,7 @@ foo :: proc -> i32 { return 10; } -add :: proc (a i32, b i32) -> i32 { +add :: proc (a: i32, b: i32) -> i32 { return a + b; } @@ -43,18 +43,18 @@ add :: proc (a i32, b i32) -> i32 { // This is because the WASM embedder does not think that it // is possible that all code paths are covered with returning // an i32. This will need to be fixed. -abs :: proc (val i32) -> i32 { +abs :: proc (val: i32) -> i32 { if val <= 0 { return -val; } // else { return val; }; return val; } -fib :: proc (n i32) -> i32 { +fib :: proc (n: i32) -> i32 { if n <= 1 { return 1; } return fib(n - 1) + fib(n - 2); } -diff_square :: proc (a i32, b i32) -> i32 { +diff_square :: proc (a: i32, b: i32) -> i32 { // Typechecked c := a - b; // Mutable d :: a + b; // Constant diff --git a/progs/mvp.onyx b/progs/mvp.onyx deleted file mode 100644 index f75b65dd..00000000 --- a/progs/mvp.onyx +++ /dev/null @@ -1,21 +0,0 @@ -foreign console { - log :: proc (data ptr, length i32) -> void ---; -} - -export add :: proc (a i32, b i32) -> i32 { - return a + b; -} - -export max :: proc (a i32, b i32) -> i32 { - // Curly braces are always required - if a > b { - return a; - } else { - return b; - } -} - -export main :: proc () { - console.log(add(2, 3)); - console.log(max(5, 10)); -} diff --git a/progs/new_minimal.onyx b/progs/new_minimal.onyx index d0e74323..d561a466 100644 --- a/progs/new_minimal.onyx +++ b/progs/new_minimal.onyx @@ -1,4 +1,4 @@ -print :: foreign "host" "print" proc (value i32) --- +print :: foreign "host" "print" proc (value: i32) --- simple_test :: proc { a: i32 = 5; @@ -13,7 +13,7 @@ simple_test :: proc { print(c); } -fib :: proc (n i32) -> i32 { +fib :: proc (n: i32) -> i32 { if n <= 1 { return 1; } return fib(n - 1) + fib(n - 2); @@ -23,7 +23,7 @@ foo :: proc -> i32 { return 10; } -print_nums :: proc (a i32, b i32, c i32) { +print_nums :: proc (a: i32, b: i32, c: i32) { print(a); print(b); print(c); diff --git a/progs/other.onyx b/progs/other.onyx index 253c1a48..a9202ace 100644 --- a/progs/other.onyx +++ b/progs/other.onyx @@ -1,9 +1,11 @@ -other_value :: proc (n i32) -> i32 { +use "progs/test" + +other_value :: proc (n: i32) -> i32 { return 8675309 + something_else(n) + global_value; } -export fib :: proc (n i32) -> i32 { +export fib :: proc (n: i32) -> i32 { if n == 0 { return 1; } if n == 1 { return 1; } @@ -23,7 +25,7 @@ export fib :: proc (n i32) -> i32 { return a; } -export factorial :: proc (n i32) -> i32 { +export factorial :: proc (n: i32) -> i32 { if n <= 1 { return 1; } f := 1; diff --git a/progs/print_funcs.onyx b/progs/print_funcs.onyx new file mode 100644 index 00000000..bb2a3d60 --- /dev/null +++ b/progs/print_funcs.onyx @@ -0,0 +1,5 @@ +print_bool :: foreign "host" "print" proc (value: bool) --- +print_i32 :: foreign "host" "print" proc (value: i32) --- +print_f32 :: foreign "host" "print" proc (value: f32) --- +print_i64 :: foreign "host" "print" proc (value: i64) --- +print_f64 :: foreign "host" "print" proc (value: f64) --- diff --git a/progs/test.onyx b/progs/test.onyx index 54069430..74600384 100644 --- a/progs/test.onyx +++ b/progs/test.onyx @@ -1,27 +1,15 @@ +use "progs/print_funcs" +use "progs/other" -// Foreign functions are included this way: -// sym_name :: foreign "module" "name" proc ... - -// TODO: Make this work -// use "progs/other"; - -print_i32 :: foreign "host" "print" proc (value i32) --- -print_f32 :: foreign "host" "print" proc (value f32) --- -print_i64 :: foreign "host" "print" proc (value i64) --- -print_f64 :: foreign "host" "print" proc (value f64) --- - -something_else :: proc (n i32) -> i32 { +something_else :: proc (n: i32) -> i32 { return 100 * n + global_value; } -// symbol :: proc {} Global function -// symbol :: struct { x i32, y i32 } -// symbol :: foreign "" "" proc Global foreign function -// symbol :: foreign "" "" i32 Global foreign mutable i32 -// symbol :: 5 Global constant value -// symbol := 5 Global mutable variable +global_value := 100 -export global_value := 100 +export in_unit_circle :: proc (x: f32, y: f32) -> bool { + return (x * x) + (y * y) < 1.0f; +} // This is the entry point export main2 :: proc { diff --git a/src/onyx.c b/src/onyx.c index 4d3fafca..c7decfff 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -13,12 +13,15 @@ static const char* docstring = "Onyx compiler version " VERSION "\n" "\n" - "The standard compiler for the Onyx programming language.\n" + "The compiler for the Onyx programming language.\n" "\n" - " $ onyx [-o ] [--help] \n" - "\n" - " -o Specify the target file\n" - " --help Print this help message\n"; + "Usage:\n" + "\tonyx [-o ] [-ast] \n" + "\tonyx -help\n" + "\nFlags:\n" + "\t-o Specify the target file (default: out.wasm)\n" + "\t-ast Print the abstract syntax tree after parsing\n" + "\t-help Print this help message\n"; typedef enum CompileAction { ONYX_COMPILE_ACTION_COMPILE, @@ -48,7 +51,12 @@ typedef enum CompilerProgress { typedef struct CompilerState { bh_arena ast_arena, msg_arena, sp_arena; bh_allocator token_alloc, ast_alloc, msg_alloc, sp_alloc; + bh_table(bh_file_contents) loaded_files; + bh_arr(const char *) queued_files; + + OnyxAstNodeFile* first_file; + OnyxAstNodeFile* last_processed_file; OnyxMessages msgs; OnyxWasmModule wasm_mod; @@ -68,7 +76,7 @@ static OnyxCompileOptions compile_opts_parse(bh_allocator alloc, int argc, char bh_arr_new(alloc, options.files, 1); fori(i, 1, argc - 1) { - if (!strcmp(argv[i], "--help")) { + if (!strcmp(argv[i], "-help")) { options.action = ONYX_COMPILE_ACTION_PRINT_HELP; break; } @@ -92,17 +100,78 @@ void compile_opts_free(OnyxCompileOptions* opts) { bh_arr_free(opts->files); } -OnyxAstNodeFile* parse_source_file(bh_file_contents* file_contents, CompilerState* compiler_state) { +OnyxAstNodeFile* 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 OnyxTokenizer tokenizer = onyx_tokenizer_create(compiler_state->token_alloc, file_contents); - bh_printf("Lexing %s\n", file_contents->filename); + bh_printf("[Lexing] %s\n", file_contents->filename); onyx_lex_tokens(&tokenizer); - bh_printf("Parsing %s\n", file_contents->filename); + bh_printf("[Parsing] %s\n", file_contents->filename); OnyxParser parser = onyx_parser_create(compiler_state->ast_alloc, &tokenizer, &compiler_state->msgs); return onyx_parse(&parser); } +CompilerProgress process_source_file(CompilerState* compiler_state, OnyxCompileOptions* opts, char* filename) { + if (bh_table_has(bh_file_contents, compiler_state->loaded_files, filename)) return ONYX_COMPILER_PROGRESS_SUCCESS; + + bh_file file; + + bh_file_error err = bh_file_open(&file, filename); + if (err != BH_FILE_ERROR_NONE) { + bh_printf_err("Failed to open file %s\n", filename); + return ONYX_COMPILER_PROGRESS_FAILED_READ; + } + + bh_printf("[Reading] %s\n", file.filename); + bh_file_contents fc = bh_file_read_contents(compiler_state->token_alloc, &file); + bh_file_close(&file); + + bh_table_put(bh_file_contents, compiler_state->loaded_files, (char *) filename, fc); + // NOTE: Need to reget the value out of the table so token references work + fc = bh_table_get(bh_file_contents, compiler_state->loaded_files, (char *) filename); + + OnyxAstNodeFile* file_node = parse_source_file(compiler_state, &fc); + + if (opts->print_ast) { + onyx_ast_print((OnyxAstNode *) file_node, 0); + bh_printf("\n"); + } + + if (!compiler_state->first_file) + compiler_state->first_file = file_node; + + if (compiler_state->last_processed_file) + compiler_state->last_processed_file->next = file_node; + + compiler_state->last_processed_file = file_node; + + + // HACK: This is very cobbled together right now but it will + // do for now + OnyxAstNode* walker = file_node->contents; + while (walker) { + if (walker->kind == ONYX_AST_NODE_KIND_USE) { + OnyxAstNodeUse* use_node = &walker->as_use; + + char* formatted_name = bh_aprintf( + global_heap_allocator, + "%b.onyx", + use_node->filename->token, use_node->filename->length); + + bh_arr_push(compiler_state->queued_files, formatted_name); + } + + walker = walker->next; + } + + + if (onyx_message_has_errors(&compiler_state->msgs)) { + return ONYX_COMPILER_PROGRESS_FAILED_PARSE; + } else { + return ONYX_COMPILER_PROGRESS_SUCCESS; + } +} + i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { bh_arena_init(&compiler_state->msg_arena, opts->allocator, 4096); @@ -120,71 +189,53 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { bh_arena_init(&compiler_state->sp_arena, opts->allocator, 16 * 1024); compiler_state->sp_alloc = bh_arena_allocator(&compiler_state->sp_arena); - bh_table_init(opts->allocator, compiler_state->loaded_files, 7); + bh_table_init(opts->allocator, compiler_state->loaded_files, 15); - bh_arr_each(const char *, filename, opts->files) { - bh_file file; + bh_arr_new(opts->allocator, compiler_state->queued_files, 4); - bh_file_error err = bh_file_open(&file, *filename); - if (err != BH_FILE_ERROR_NONE) { - bh_printf_err("Failed to open file %s\n", *filename); - return ONYX_COMPILER_PROGRESS_FAILED_READ; - } + // NOTE: Add all files passed by command line to the queue + bh_arr_each(const char *, filename, opts->files) + bh_arr_push(compiler_state->queued_files, (char *) *filename); - bh_printf("Reading %s\n", file.filename); - bh_file_contents fc = bh_file_read_contents(compiler_state->token_alloc, &file); - bh_file_close(&file); - bh_table_put(bh_file_contents, compiler_state->loaded_files, (char *) filename, fc); - } + // NOTE: While the queue is not empty, process the next file + while (!bh_arr_is_empty(compiler_state->queued_files)) { + CompilerProgress result = process_source_file(compiler_state, opts, (char *) compiler_state->queued_files[0]); - OnyxAstNodeFile* root_file = NULL; - OnyxAstNodeFile* prev_file = NULL; - bh_table_each_start(bh_file_contents, compiler_state->loaded_files); - OnyxAstNodeFile* file_node = parse_source_file(&value, compiler_state); - - if (opts->print_ast) { - onyx_ast_print((OnyxAstNode *) file_node, 0); - bh_printf("\n"); - } + if (result != ONYX_COMPILER_PROGRESS_SUCCESS) + return result; - if (!root_file) { - root_file = file_node; - } - - if (prev_file) { - prev_file->next = file_node; - } - - prev_file = file_node; - bh_table_each_end; - - if (onyx_message_has_errors(&compiler_state->msgs)) { - return ONYX_COMPILER_PROGRESS_FAILED_PARSE; + bh_arr_fastdelete(compiler_state->queued_files, 0); } - bh_printf("Checking semantics and types\n"); + + // NOTE: Check types and semantic rules + bh_printf("[Checking semantics]\n"); OnyxSemPassState sp_state = onyx_sempass_create(compiler_state->sp_alloc, compiler_state->ast_alloc, &compiler_state->msgs); - onyx_sempass(&sp_state, root_file); + onyx_sempass(&sp_state, compiler_state->first_file); if (onyx_message_has_errors(&compiler_state->msgs)) { return ONYX_COMPILER_PROGRESS_FAILED_SEMPASS; } - bh_printf("Creating WASM code\n"); + + // NOTE: Generate WASM instructions + bh_printf("[Generating WASM]\n"); compiler_state->wasm_mod = onyx_wasm_module_create(opts->allocator, &compiler_state->msgs); - onyx_wasm_module_compile(&compiler_state->wasm_mod, root_file); + onyx_wasm_module_compile(&compiler_state->wasm_mod, compiler_state->first_file); if (onyx_message_has_errors(&compiler_state->msgs)) { return ONYX_COMPILER_PROGRESS_FAILED_BINARY_GEN; } + + // NOTE: Output to file bh_file output_file; if (bh_file_create(&output_file, opts->target_file) != BH_FILE_ERROR_NONE) { return ONYX_COMPILER_PROGRESS_FAILED_OUTPUT; } - bh_printf("Writing WASM to %s\n", output_file.filename); + bh_printf("[Writing WASM] %s\n", output_file.filename); onyx_wasm_module_write_to_file(&compiler_state->wasm_mod, output_file); return ONYX_COMPILER_PROGRESS_SUCCESS; diff --git a/src/onyxparser.c b/src/onyxparser.c index 3a698b6a..5cf6f232 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -6,6 +6,7 @@ static const char* ast_node_names[] = { "ERROR", "PROGRAM", + "USE", "FUNCDEF", "FOREIGN", @@ -669,6 +670,7 @@ static OnyxAstNodeParam* parse_function_params(OnyxParser* parser) { if (parser->curr_token->type == TOKEN_TYPE_SYM_COMMA) parser_next_token(parser); symbol = expect(parser, TOKEN_TYPE_SYMBOL); + expect(parser, TOKEN_TYPE_SYM_COLON); curr_param = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_PARAM); curr_param->token = symbol; @@ -759,8 +761,13 @@ static OnyxAstNode* parse_top_level_constant_symbol(OnyxParser* parser) { static OnyxAstNode* parse_top_level_statement(OnyxParser* parser) { switch (parser->curr_token->type) { case TOKEN_TYPE_KEYWORD_USE: - assert(0); - break; + { + OnyxAstNodeUse* use_node = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_USE); + use_node->token = expect(parser, TOKEN_TYPE_KEYWORD_USE); + use_node->filename = expect(parser, TOKEN_TYPE_LITERAL_STRING); + + return (OnyxAstNode *) use_node; + } case TOKEN_TYPE_KEYWORD_EXPORT: { diff --git a/src/onyxutils.c b/src/onyxutils.c index cae6546a..b40a44c0 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -28,6 +28,16 @@ void onyx_ast_print(OnyxAstNode* node, i32 indent) { break; } + case ONYX_AST_NODE_KIND_USE: { + OnyxAstNodeUse* use_node = &node->as_use; + bh_printf("%b", use_node->filename->token, use_node->filename->length); + + if (use_node->next) + onyx_ast_print(use_node->next, indent); + + break; + } + case ONYX_AST_NODE_KIND_FUNCDEF: { if (node->token) bh_printf("(%b) ", node->token->token, node->token->length); -- 2.25.1