diff options
Diffstat (limited to 'src/modules/tuple-generator/tuple-generator.scm')
-rw-r--r-- | src/modules/tuple-generator/tuple-generator.scm | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/modules/tuple-generator/tuple-generator.scm b/src/modules/tuple-generator/tuple-generator.scm new file mode 100644 index 0000000..a2dde2d --- /dev/null +++ b/src/modules/tuple-generator/tuple-generator.scm @@ -0,0 +1,36 @@ +(define-module (modules tuple-generator tuple-generator) + #:use-module (ice-9 receive) + #:use-module (modules utils t-factory) + #:use-module (modules ast syntax-tree) + #:use-module (modules ast assembly-tree) + #:export (t-program)) + + +(define (t-program p) + (make-program (t-function (program-function p)))) + +(define (t-function f) + (make-subroutine (t-id (function-id f)) + (t-stmt (function-stmt f)) + #f)) + +(define (t-stmt s) + (receive (src instrs) (t-expr (stmt-expr s)) + (append instrs + (list (make-instruction (make-register 'eax) 'mov src #f) + (make-instruction #f 'ret #f #f))))) + +(define (t-expr e) + (cond + ((unary? e) + (receive (src instrs) (t-expr (unary-expr e)) + (let ((dest (make-temporary))) + (values dest + (append instrs + (list (make-instruction dest 'mov src #f) + (make-instruction dest (unary-operator e) #f #f))))))) + (#t (values e '())))) + + +(define (t-id i) + (id-symbol i)) |