summaryrefslogtreecommitdiff
path: root/src/modules/tuple-generator
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-01-12 15:10:23 -0700
committerbd <bdunahu@operationnull.com>2025-01-12 15:10:23 -0700
commit000b28c88bbfd1fde94b5e01ce2766230077e013 (patch)
tree2da470f7fe73f4d1e6ba3cbf25db9c89aa2ff5eb /src/modules/tuple-generator
parent2bc7c77b7f63b1df0340112db6272dc9a78139c1 (diff)
Expansion of complex expressions into set of instructions
Diffstat (limited to 'src/modules/tuple-generator')
-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))