summaryrefslogtreecommitdiff
path: root/src/gscc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gscc')
-rwxr-xr-xsrc/gscc39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/gscc b/src/gscc
index 27ee6b0..3a5c2ba 100755
--- a/src/gscc
+++ b/src/gscc
@@ -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)))))))