summaryrefslogtreecommitdiff
path: root/src/modules/generator/generator.scm
blob: 4c08e328daea77e2b6b87a957f6b9b803dfe6487 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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))