diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-12 21:48:19 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-12 21:48:45 +0000 |
| commit | 291650f52893682bfdb00a359461b6e4d5907a17 (patch) | |
| tree | 00f0dac5ba9ea5825367b4c1122daab4afbb3c58 | |
| parent | d0c9e962937c63bae9d101660dcc05cd38515dd0 (diff) | |
Added mode.
| -rw-r--r-- | src/main.c | 32 | ||||
| -rw-r--r-- | src/parser/parser_type.c | 114 | ||||
| -rw-r--r-- | src/zprep.h | 1 |
3 files changed, 90 insertions, 57 deletions
@@ -28,6 +28,7 @@ void print_usage() printf(" build Compile to executable\n"); printf(" check Check for errors only\n"); printf(" repl Start Interactive REPL\n"); + printf(" transpile Transpile to C code only (no compilation)\n"); printf(" lsp Start Language Server\n"); printf("Options:\n"); printf(" -o <file> Output executable name\n"); @@ -66,6 +67,11 @@ int main(int argc, char **argv) run_repl(argv[0]); // Pass self path for recursive calls return 0; } + else if (strcmp(command, "transpile") == 0) + { + g_config.mode_transpile = 1; + g_config.emit_c = 1; // Transpile implies emitting C + } else if (strcmp(command, "run") == 0) { g_config.mode_run = 1; @@ -266,6 +272,32 @@ int main(int argc, char **argv) codegen_node(&ctx, root, out); fclose(out); + if (g_config.mode_transpile) + { + if (g_config.output_file) + { + // If user specified -o, rename out.c to that + if (rename("out.c", g_config.output_file) != 0) + { + perror("rename out.c"); + return 1; + } + if (!g_config.quiet) + { + printf("[zc] Transpiled to %s\n", g_config.output_file); + } + } + else + { + if (!g_config.quiet) + { + printf("[zc] Transpiled to out.c\n"); + } + } + // Done, no C compilation + return 0; + } + // Compile C char cmd[8192]; char *outfile = g_config.output_file ? g_config.output_file : "a.out"; diff --git a/src/parser/parser_type.c b/src/parser/parser_type.c index 941c763..cc33d99 100644 --- a/src/parser/parser_type.c +++ b/src/parser/parser_type.c @@ -80,35 +80,35 @@ Type *parse_type_base(ParserContext *ctx, Lexer *l) resolved_suffix = "uint64_t"; } // Lowercase aliases - else if (strcmp(suffix, "i8") == 0) + else if (strcmp(suffix, "i8") == 0) { resolved_suffix = "int8_t"; } - else if (strcmp(suffix, "u8") == 0) + else if (strcmp(suffix, "u8") == 0) { resolved_suffix = "uint8_t"; } - else if (strcmp(suffix, "i16") == 0) + else if (strcmp(suffix, "i16") == 0) { resolved_suffix = "int16_t"; } - else if (strcmp(suffix, "u16") == 0) + else if (strcmp(suffix, "u16") == 0) { resolved_suffix = "uint16_t"; } - else if (strcmp(suffix, "i32") == 0) + else if (strcmp(suffix, "i32") == 0) { resolved_suffix = "int32_t"; } - else if (strcmp(suffix, "u32") == 0) + else if (strcmp(suffix, "u32") == 0) { resolved_suffix = "uint32_t"; } - else if (strcmp(suffix, "i64") == 0) + else if (strcmp(suffix, "i64") == 0) { resolved_suffix = "int64_t"; } - else if (strcmp(suffix, "u64") == 0) + else if (strcmp(suffix, "u64") == 0) { resolved_suffix = "uint64_t"; } @@ -246,55 +246,55 @@ Type *parse_type_base(ParserContext *ctx, Lexer *l) free(name); return type_new(TYPE_U128); } - if (strcmp(name, "i8") == 0) - { - free(name); - return type_new(TYPE_I8); - } - if (strcmp(name, "u8") == 0) - { - free(name); - return type_new(TYPE_U8); - } - if (strcmp(name, "i16") == 0) - { - free(name); - return type_new(TYPE_I16); - } - if (strcmp(name, "u16") == 0) - { - free(name); - return type_new(TYPE_U16); - } - if (strcmp(name, "i32") == 0) - { - free(name); - return type_new(TYPE_I32); - } - if (strcmp(name, "u32") == 0) - { - free(name); - return type_new(TYPE_U32); - } - if (strcmp(name, "i64") == 0) - { - free(name); - return type_new(TYPE_I64); - } - if (strcmp(name, "u64") == 0) - { - free(name); - return type_new(TYPE_U64); - } - if (strcmp(name, "i128") == 0) - { - free(name); - return type_new(TYPE_I128); - } - if (strcmp(name, "u128") == 0) - { - free(name); - return type_new(TYPE_U128); + if (strcmp(name, "i8") == 0) + { + free(name); + return type_new(TYPE_I8); + } + if (strcmp(name, "u8") == 0) + { + free(name); + return type_new(TYPE_U8); + } + if (strcmp(name, "i16") == 0) + { + free(name); + return type_new(TYPE_I16); + } + if (strcmp(name, "u16") == 0) + { + free(name); + return type_new(TYPE_U16); + } + if (strcmp(name, "i32") == 0) + { + free(name); + return type_new(TYPE_I32); + } + if (strcmp(name, "u32") == 0) + { + free(name); + return type_new(TYPE_U32); + } + if (strcmp(name, "i64") == 0) + { + free(name); + return type_new(TYPE_I64); + } + if (strcmp(name, "u64") == 0) + { + free(name); + return type_new(TYPE_U64); + } + if (strcmp(name, "i128") == 0) + { + free(name); + return type_new(TYPE_I128); + } + if (strcmp(name, "u128") == 0) + { + free(name); + return type_new(TYPE_U128); } if (strcmp(name, "rune") == 0) { diff --git a/src/zprep.h b/src/zprep.h index 17e7e02..5c4ab4e 100644 --- a/src/zprep.h +++ b/src/zprep.h @@ -174,6 +174,7 @@ typedef struct int quiet; // 1 if --quiet. int repl_mode; // 1 if --repl (internal flag for REPL usage). int is_freestanding; // 1 if --freestanding. + int mode_transpile; // 1 if 'transpile' command. // GCC Flags accumulator. char gcc_flags[4096]; |
