From 43894180e763ac46c3cc013dbc3474ba6cd4aed4 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 2 Jul 2020 19:59:09 -0500 Subject: [PATCH] Added verbose output option --- onyx | Bin 222736 -> 223000 bytes progs/other.onyx | 1 - src/onyx.c | 69 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/onyx b/onyx index 28115a9de62cdf4498bb6fd3a3889669ce38740f..2f2f2d9b1e3ac8320f2eb21d76a722a2cce8bee4 100755 GIT binary patch delta 23769 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 lMzqXv3}7ptKSpceot`a8hxwK4A{|{aAsapU5 delta 23132 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 U4zY7I^xYk#nthnqHPjOEe*$Y~R{#J2 diff --git a/progs/other.onyx b/progs/other.onyx index a9202ace..db004617 100644 --- a/progs/other.onyx +++ b/progs/other.onyx @@ -1,4 +1,3 @@ - use "progs/test" other_value :: proc (n: i32) -> i32 { diff --git a/src/onyx.c b/src/onyx.c index 4c1975c4..1239491d 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -16,11 +16,12 @@ static const char* docstring = "Onyx compiler version " VERSION "\n" "The compiler for the Onyx programming language.\n" "\n" "Usage:\n" - "\tonyx [-o ] [-ast] \n" + "\tonyx [-o ] [-ast] [-verbose] \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-verbose Verbose output\n" "\t-help Print this help message\n"; typedef enum CompileAction { @@ -33,6 +34,7 @@ typedef struct OnyxCompileOptions { bh_allocator allocator; CompileAction action; + u32 verbose_output : 1; u32 print_ast : 1; bh_arr(const char *) files; @@ -49,6 +51,8 @@ typedef enum CompilerProgress { } CompilerProgress; typedef struct CompilerState { + OnyxCompileOptions* options; + bh_arena ast_arena, msg_arena, sp_arena; bh_allocator token_alloc, ast_alloc, msg_alloc, sp_alloc; @@ -65,6 +69,7 @@ static OnyxCompileOptions compile_opts_parse(bh_allocator alloc, int argc, char .allocator = alloc, .action = ONYX_COMPILE_ACTION_PRINT_HELP, + .verbose_output = 0, .print_ast = 0, .files = NULL, @@ -85,6 +90,9 @@ static OnyxCompileOptions compile_opts_parse(bh_allocator alloc, int argc, char else if (!strcmp(argv[i], "-ast")) { options.print_ast = 1; } + else if (!strcmp(argv[i], "-verbose")) { + options.verbose_output = 1; + } else { options.action = ONYX_COMPILE_ACTION_COMPILE; bh_arr_push(options.files, argv[i]); @@ -94,22 +102,26 @@ static OnyxCompileOptions compile_opts_parse(bh_allocator alloc, int argc, char return options; } -void compile_opts_free(OnyxCompileOptions* opts) { +static void compile_opts_free(OnyxCompileOptions* opts) { bh_arr_free(opts->files); } -OnyxAstNode* parse_source_file(CompilerState* compiler_state, bh_file_contents* file_contents) { +static OnyxAstNode* 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); + OnyxTokenizer tokenizer = onyx_tokenizer_create(compiler_state->token_alloc, file_contents); - bh_printf("[Lexing] %s\n", file_contents->filename); onyx_lex_tokens(&tokenizer); - bh_printf("[Parsing] %s\n", file_contents->filename); + if (compiler_state->options->verbose_output) + 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) { +static CompilerProgress process_source_file(CompilerState* compiler_state, char* filename) { if (bh_table_has(bh_file_contents, compiler_state->loaded_files, filename)) return ONYX_COMPILER_PROGRESS_SUCCESS; bh_file file; @@ -120,7 +132,9 @@ CompilerProgress process_source_file(CompilerState* compiler_state, OnyxCompileO return ONYX_COMPILER_PROGRESS_FAILED_READ; } - bh_printf("[Reading] %s\n", file.filename); + if (compiler_state->options->verbose_output) + bh_printf("[Reading] %s\n", file.filename); + bh_file_contents fc = bh_file_read_contents(compiler_state->token_alloc, &file); bh_file_close(&file); @@ -130,7 +144,7 @@ CompilerProgress process_source_file(CompilerState* compiler_state, OnyxCompileO OnyxAstNode* root_node = parse_source_file(compiler_state, &fc); - if (opts->print_ast) { + if (compiler_state->options->print_ast) { onyx_ast_print(root_node, 0); bh_printf("\n"); } @@ -183,7 +197,13 @@ CompilerProgress process_source_file(CompilerState* compiler_state, OnyxCompileO } } -i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { +static void compiler_state_init(CompilerState* compiler_state, OnyxCompileOptions* opts) { + compiler_state->options = opts; + + bh_arr_new(global_heap_allocator, compiler_state->program.uses, 4); + bh_arr_new(global_heap_allocator, compiler_state->program.foreigns, 4); + bh_arr_new(global_heap_allocator, compiler_state->program.globals, 4); + bh_arr_new(global_heap_allocator, compiler_state->program.functions, 4); bh_arena_init(&compiler_state->msg_arena, opts->allocator, 4096); compiler_state->msg_alloc = bh_arena_allocator(&compiler_state->msg_arena); @@ -207,11 +227,13 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { // 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); +} +static i32 onyx_compile(CompilerState* compiler_state) { // 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]); + CompilerProgress result = process_source_file(compiler_state, (char *) compiler_state->queued_files[0]); if (result != ONYX_COMPILER_PROGRESS_SUCCESS) return result; @@ -221,7 +243,9 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { // NOTE: Check types and semantic rules - bh_printf("[Checking semantics]\n"); + if (compiler_state->options->verbose_output) + 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, &compiler_state->program); @@ -231,8 +255,10 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { // NOTE: Generate WASM instructions - bh_printf("[Generating WASM]\n"); - compiler_state->wasm_mod = onyx_wasm_module_create(opts->allocator, &compiler_state->msgs); + if (compiler_state->options->verbose_output) + bh_printf("[Generating WASM]\n"); + + compiler_state->wasm_mod = onyx_wasm_module_create(compiler_state->options->allocator, &compiler_state->msgs); onyx_wasm_module_compile(&compiler_state->wasm_mod, &compiler_state->program); if (onyx_message_has_errors(&compiler_state->msgs)) { @@ -242,17 +268,19 @@ i32 onyx_compile(OnyxCompileOptions* opts, CompilerState* compiler_state) { // NOTE: Output to file bh_file output_file; - if (bh_file_create(&output_file, opts->target_file) != BH_FILE_ERROR_NONE) { + if (bh_file_create(&output_file, compiler_state->options->target_file) != BH_FILE_ERROR_NONE) { return ONYX_COMPILER_PROGRESS_FAILED_OUTPUT; } - bh_printf("[Writing WASM] %s\n", output_file.filename); + if (compiler_state->options->verbose_output) + 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; } -void compiler_state_free(CompilerState* cs) { +static void compiler_state_free(CompilerState* cs) { bh_arena_free(&cs->ast_arena); bh_arena_free(&cs->msg_arena); bh_arena_free(&cs->sp_arena); @@ -279,10 +307,7 @@ int main(int argc, char *argv[]) { .wasm_mod = { 0 } }; - bh_arr_new(global_heap_allocator, compile_state.program.uses, 4); - bh_arr_new(global_heap_allocator, compile_state.program.foreigns, 4); - bh_arr_new(global_heap_allocator, compile_state.program.globals, 4); - bh_arr_new(global_heap_allocator, compile_state.program.functions, 4); + compiler_state_init(&compile_state, &compile_opts); CompilerProgress compiler_progress = ONYX_COMPILER_PROGRESS_FAILED_READ; @@ -293,7 +318,7 @@ int main(int argc, char *argv[]) { return 1; case ONYX_COMPILE_ACTION_COMPILE: - compiler_progress = onyx_compile(&compile_opts, &compile_state); + compiler_progress = onyx_compile(&compile_state); break; default: break; @@ -315,7 +340,7 @@ int main(int argc, char *argv[]) { break; case ONYX_COMPILER_PROGRESS_SUCCESS: - bh_printf("Successfully compiled to '%s'\n", compile_opts.target_file); + if (compile_opts.verbose_output) bh_printf("Successfully compiled to '%s'\n", compile_opts.target_file); break; } -- 2.25.1