diff options
author | bd <bdunahu@operationnull.com> | 2025-01-12 15:10:23 -0700 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-01-12 15:10:23 -0700 |
commit | 000b28c88bbfd1fde94b5e01ce2766230077e013 (patch) | |
tree | 2da470f7fe73f4d1e6ba3cbf25db9c89aa2ff5eb /src/gscc | |
parent | 2bc7c77b7f63b1df0340112db6272dc9a78139c1 (diff) |
Expansion of complex expressions into set of instructions
Diffstat (limited to 'src/gscc')
-rwxr-xr-x | src/gscc | 39 |
1 files changed, 24 insertions, 15 deletions
@@ -5,9 +5,11 @@ (use-modules (ice-9 getopt-long) (ice-9 popen) + (ice-9 pretty-print) (modules lexer lexer) (modules parser parser) (modules generator generator) + (modules tuple-generator tuple-generator) (modules emitter emitter)) @@ -23,14 +25,15 @@ Options: --debug, -d: turn on verbose output --lex, -l: run the lexer, but stop before assembly generation --parse, -p: run the lexer and parser, but stop before assembly generation - --codegen, -c: perform lexing, parsing, and assembly generation, but stop before code emission\n"))) + --tacky, -t: run the tacky generation stage, but stop before assembly generation + --codegen, -c: perform lexing, parsing, tacky, and assembly generation, but stop before code emission\n"))) (exit #f)) (define (c-extension? file) (let ((extension (string-drop file (- (string-length file) 2)))) (string=? extension ".c"))) -(define (process file parse? generate? write? dest) +(define (process file parse? tack? generate? write? dest) "Driver for lexing, parsing, and assembly generation." (let* ((port (preprocess file)) (tokens (begin (set-current-input-port port) @@ -38,18 +41,21 @@ Options: (close-input-port port) (when parse? (let ((c-ast (p-program tokens))) - (when generate? - (let ((assembly-ast (g-program c-ast))) - (when write? - (let ((program (e-program assembly-ast)) - (a-file (string-append dest ".s"))) - (when (file-exists? a-file) - (delete-file a-file)) - (let ((port (open-output-file a-file))) - (display program port) - (close-port port)) - (when (postprocess a-file dest) - (display (string-concatenate `("Postprocess reported success (wrote " ,dest ").\n")))))))))))) + (when tack? + (let ((tacky-ast (t-program c-ast))) + (when generate? + (let ((assembly-ast (g-program tacky-ast))) + (display tacky-ast) + (when write? + (let ((program (e-program assembly-ast)) + (a-file (string-append dest ".s"))) + (when (file-exists? a-file) + (delete-file a-file)) + (let ((port (open-output-file a-file))) + (display program port) + (close-port port)) + (when (postprocess a-file dest) + (display (string-concatenate `("Postprocess reported success (wrote " ,dest ").\n")))))))))))))) (define (preprocess file) "Returns an input port containing FILE processed with gcc." @@ -67,6 +73,7 @@ Returns #f on a failure, #t on a success." (debug (single-char #\d) (value #f)) (lex (single-char #\l) (value #f)) (parse (single-char #\p) (value #f)) + (tacky (single-char #\t) (value #f)) (codegen (single-char #\c) (value #f)))) (options (getopt-long args option-spec)) (rest (option-ref options '() #f)) @@ -81,10 +88,12 @@ Returns #f on a failure, #t on a success." (not (c-extension? file))) (error "The file could not be read, or it is not a C source code file.")) (#t (let ((parse? (not (option-ref options 'lex #f))) - (generate? (not (option-ref options 'parse #f))) + (tack? (not (option-ref options 'parse #f))) + (generate? (not (option-ref options 'tacky #f))) (write? (not (option-ref options 'codegen #f)))) (process file parse? + tack? generate? write? (string-drop-right file 2))))))) |