diff options
Diffstat (limited to 'src/modules/generator/generator.scm')
-rw-r--r-- | src/modules/generator/generator.scm | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/modules/generator/generator.scm b/src/modules/generator/generator.scm new file mode 100644 index 0000000..4c08e32 --- /dev/null +++ b/src/modules/generator/generator.scm @@ -0,0 +1,31 @@ +(define-module (modules generator generator) + #:use-module (modules ast syntax-tree) + #:use-module (modules ast assembly-tree) + #:export (generate)) + +(define (generate node) + (cond + ((program? node) (g-program node)) + ((function? node) (g-function node)) + ((stmt? node) (g-stmt node)) + ((expr? node) (g-expr node)) + ((id? node) (g-id node)) + (else (error "Unknown AST element")))) + +(define (g-program p) + (make-program (generate (program-function p)))) + +(define (g-function f) + (make-subroutine (generate (function-id f)) + (generate (function-stmt f)))) + +(define (g-stmt s) + (generate (stmt-expr s))) + +(define (g-expr e) + ;; for now, we assume only 'return'! + (list (make-instruction "mov1" "%eax" "$2") + (make-instruction "ret" #f #f))) + +(define (g-id i) + (id-symbol i)) |