diff options
Diffstat (limited to 'tnslc/compile/compile.tnsl')
-rw-r--r-- | tnslc/compile/compile.tnsl | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/tnslc/compile/compile.tnsl b/tnslc/compile/compile.tnsl index d1f72b4..d7e9416 100644 --- a/tnslc/compile/compile.tnsl +++ b/tnslc/compile/compile.tnsl @@ -21,10 +21,67 @@ ;/ +/; compile_block (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) + ;hsec`.append('b') + + ;cur`++ + + /; loop (cur` < len data`) [cur`++] + /; if (string_equate(data`{cur`}.data`, ";/") || string_equate(data`{cur`}.data`, ";;")) + ;break + ;; else if (string_equate(data`{cur`}.data`, "/;")) + ;bool ch = true + /; loop (ch) + ;compile_block(cur, data, hsec, csec, dsec) + ;ch = string_equate(data`{cur`}.data`, ";;") + ;/ + ;; else if (string_equate(data`{cur`}.data`, ";")) + ;compile_statement(cur, data, hsec, csec, dsec) + ;/ + ;/ +;/ + +/; compile_statement (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) + ;csec`.append('c') + ;dsec`.append('d') +;/ + /; do_compile ({}charp file, ~{}Token data) - /; + ;{}charp hsec = ".global _start\n" + ;{}charp csec = ".text\n" + ;{}charp dsec = ".data\n" + + ;int j = len data` + + /; loop (int i = 0; i < j) [i++] + /; if (string_equate(data`{i}.data`, "/;")) + ;compile_block(~i, data, ~hsec, ~csec, ~dsec) + ;; else if (string_equate(data`{i}.data`, ";")) + ;compile_statement(~i, data, ~hsec, ~csec, ~dsec) + ;; else + ;break + ;/ + ;/ + + ;tnsl.io.File out = tnsl.io.writeFile(file) + + /; loop (int i = 0; i < len hsec) [i++] + ;out.write(hsec{i}) + ;/ + + ;out.write('\n') + /; loop (int i = 0; i < len csec) [i++] + ;out.write(csec{i}) ;/ + + ;out.write('\n') + + /; loop (int i = 0; i < len dsec) [i++] + ;out.write(dsec{i}) + ;/ + + ;out.write('\n') ;/ ;struct Symtab { |