diff options
Diffstat (limited to 'tnslc')
-rw-r--r-- | tnslc/compile/compile.tnsl | 125 | ||||
-rw-r--r-- | tnslc/dummy.tnsl | 6 |
2 files changed, 107 insertions, 24 deletions
diff --git a/tnslc/compile/compile.tnsl b/tnslc/compile/compile.tnsl index 7df7acb..0aade7b 100644 --- a/tnslc/compile/compile.tnsl +++ b/tnslc/compile/compile.tnsl @@ -22,22 +22,121 @@ ;{}{}charp COMMON_ASM = { - "\tret" + "\tret", + "push %", + "pop %" } +;struct VType { + uint _size, + {}charp name +} + +;struct VTrack { + {}{}charp + sym_names, + + {}VType + sym_types +} + +# Null type +;VType NT = {0, "null"} + +/; find_var ({}charp name, ~VTrack tab) [{}charp] + /; loop (int i = 0; i < 8) [i++] + /; if (string_equate(tab`.sym_names{i}, name)) + ;{}charp out = "r" + ;{}charp n = string_from_int(i + 8) + ;add_strings(~out, ~n) + /; if (tab`.sym_sizes{i}._size == 4) + ;out.append('d') + ;; else if (tab`.sym_sizes{i}._size == 2) + ;out.append('w') + ;; else if (tab`.sym_sizes{i}._size == 1) + ;out.append('b') + ;/ + ;return out + ;/ + ;/ + + ;tnsl.io.print("Failed to find vairable ") + ;tnsl.io.println(name) +;/ + +/; token_is(~int cur, ~{}Token data, {}charp str) [bool] + ;return string_equate(data`{cur`}.data`, str) +;/ + +/; setup_vtrack (~int cur, ~{}Token data, ~VTrack tab) + ;cur`++ + + /; loop (cur` < len data`) [cur`++] + /; if (token_is(cur, data, ")")) + ;break + ;; + ;/ + ;/ +;/ + +/; header_guard (~VTrack tab, ~{}charp csec) + +;/ + +/; ret_guard (~VTrack tab, {}charp to_ret, ~{}charp csec) + ;tail_guard(csec) + +;/ + +/; tail_guard (~{}charp csec) +;/ + +/; compile_statement (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) + ;cur`++ + /; if (cur` < len data`) + /; if (token_is(cur, data, "asm")) + ;cur`++ + ;{}charp raw_asm = unquote_string(data`{cur`}.data`) + ;raw_asm.append('\n') + ;csec`.append('\t') + ;add_strings(csec, ~raw_asm) + ;/ + ;/ +;/ + /; compile_block (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) + ;VTrack tab = { + {"", "", "", "", "", "", "", ""}, + {NT, NT, NT, NT, NT, NT, NT, NT} + } + ;{}charp name = {} + ;bool r = false /; loop (cur`++; cur` < len data`) [cur`++] /; if (data`{cur`}.token_type == TOKEN_TYPE.DEFWORD && len name == 0) ;name = data`{cur`}.data` ;add_strings(csec, ~name) ;csec`.append(':') ;csec`.append('\n') + ;; else if (token_is(cur, data, "(")) + ;setup_vtrack(cur, data, ~tab) + ;; else if (token_is(cur, data, "[")) + /; loop (cur`++; cur` < len data`) [cur`++] + /; if (token_is(cur, data, "]")) + ;break + ;/ + ;/ + ;; else if (token_is(cur, data, "raw")) + ;r = true ;; else ;break ;/ ;/ + /; if (!r) + ;header_guard(tab, csec) + ;/ + /; loop (cur` < len data`) [cur`++] /; if (string_equate(data`{cur`}.data`, ";/")) ;add_strings(csec, ~(tnslc.COMMON_ASM{0})) @@ -61,20 +160,11 @@ ;/ ;/ - ;csec`.append('\n') -;/ - -/; compile_statement (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) - ;cur`++ - /; if (cur` < len data`) - /; if (string_equate(data`{cur`}.data`, "asm")) - ;cur`++ - ;{}charp raw_asm = unquote_string(data`{cur`}.data`) - ;raw_asm.append('\n') - ;csec`.append('\t') - ;add_strings(csec, ~raw_asm) - ;/ + /; if (!r) + ;tail_guard(csec) ;/ + + ;csec`.append('\n') ;/ /; do_compile ({}charp file, ~{}Token data) @@ -116,10 +206,3 @@ ;out.close() ;/ -;struct Symtab { - {}{}charp - sym_names, - - {}uint - sym_sizes -} diff --git a/tnslc/dummy.tnsl b/tnslc/dummy.tnsl index 2a624a2..003e428 100644 --- a/tnslc/dummy.tnsl +++ b/tnslc/dummy.tnsl @@ -1,4 +1,4 @@ -/; _alloc +/; raw _alloc ;asm "mov %rax, %rdi" ;asm "push %r8" ;asm "push %r9" @@ -10,7 +10,7 @@ ;asm "pop %r8" ;/ -/; _delete +/; raw _delete ;asm "mov %rax, %rdi" ;asm "push %r9" ;asm "push %r10" @@ -20,7 +20,7 @@ ;asm "pop %r9" ;/ -/; main +/; main [int] ;asm "mov $10, %rax" ;asm "call _alloc" ;asm "call _delete" |