about summary refs log tree commit diff
path: root/boot
diff options
context:
space:
mode:
Diffstat (limited to 'boot')
-rw-r--r--boot/catboot.c38
-rw-r--r--boot/tests/test.c2
-rw-r--r--boot/tests/transpile/basic.cskt16
3 files changed, 55 insertions, 1 deletions
diff --git a/boot/catboot.c b/boot/catboot.c
index 9afb710..8412ffc 100644
--- a/boot/catboot.c
+++ b/boot/catboot.c
@@ -60,6 +60,7 @@ usage(void)
         "options:\n"
         "        --test-lex <file>\t output token stream for file\n"
         "        --test-parse <file>\t output abstract syntax tree for file in s-expr format\n"
+        "        --test-transpile <file>\t output transpiled c language source from file\n"
         "    -?, --help\t\t\t print this help message\n"
         "    -v, --version\t\t print current version\n");
 }
@@ -112,6 +113,27 @@ debug_parse_pass(struct Source_File source_file)
     return parser_result;
 }
 
+integer
+debug_transpile_pass(struct Source_File source_file)
+{
+    struct Lexer lexer;
+    lexer_new(&lexer, source_file.source);
+
+    struct Parser parser;
+    parser_new(&parser, &lexer, source_file);
+
+    struct Tree tree;
+    int parser_result = parser_do_your_thing(&parser, &tree);
+    if (parser_result != 0) {
+        fprintf(stderr, "parser finished with errors\n");
+        return parser_result;
+    }
+
+    struct Transpiler transpiler;
+    transpiler_new(&transpiler, stdout);
+    return transpiler_catskill_to_c(&transpiler, &tree);
+}
+
 enum Command_Result
 {
     COMMAND_OK,
@@ -164,6 +186,20 @@ test_parse_command(struct Command_Arguments* arguments)
 }
 
 enum Command_Result
+test_transpile_command(struct Command_Arguments* arguments)
+{
+    struct String source = read_file(arguments->input);
+    struct Source_File source_file = {
+        .source = source,
+        .path = string_from_static_c_string(arguments->input),
+    };
+
+    if (debug_transpile_pass(source_file)) return COMMAND_FAIL;
+
+    return COMMAND_OK;
+}
+
+enum Command_Result
 default_command(struct Command_Arguments* arguments)
 {
     enum Command_Result result = COMMAND_OK;
@@ -225,6 +261,8 @@ struct Command_Definition
 struct Command_Definition command_definitions[] = {
     { .name = "test-lex", .function = test_lex_command },
     { .name = "test-parse", .function = test_parse_command },
+    { .name = "test-transpile", .function = test_transpile_command },
+
     { .name = "version", .short_name = 'v', .function = version_command },
     { .name = "help", .short_name = '?', .function = help_command },
 
diff --git a/boot/tests/test.c b/boot/tests/test.c
index b8db80c..841df09 100644
--- a/boot/tests/test.c
+++ b/boot/tests/test.c
@@ -535,7 +535,7 @@ struct Result_Summary
 transpile_tests(bool adjust)
 {
     const ascii* base_path = "./boot/tests/transpile/";
-    const ascii* base_command = "./build/catboot";
+    const ascii* base_command = "./build/catboot --test-transpile";
 
     return tests(base_path, base_command, adjust);
 }
diff --git a/boot/tests/transpile/basic.cskt b/boot/tests/transpile/basic.cskt
new file mode 100644
index 0000000..f904259
--- /dev/null
+++ b/boot/tests/transpile/basic.cskt
@@ -0,0 +1,16 @@
+the transpiler has to follow a simple pattern of
+the files it creates to make viable c source.
+here we check that the simplest possible file has
+all of the expected parts needed.
+
+<<<
+
+main = fun () {
+}
+
+>>>
+
+#include "boot/runtime/core.c"
+void catskill_main(void) {
+}
+#include "boot/runtime/runtime.c"
\ No newline at end of file