summaryrefslogtreecommitdiff
path: root/src/modules/tuple-generator/tuple-generator.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/tuple-generator/tuple-generator.scm')
-rw-r--r--src/modules/tuple-generator/tuple-generator.scm36
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))