summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c32
-rw-r--r--src/parser/parser_type.c114
-rw-r--r--src/zprep.h1
3 files changed, 90 insertions, 57 deletions
diff --git a/src/main.c b/src/main.c
index 5bd84d1..583f735 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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];