aboutsummaryrefslogtreecommitdiff
path: root/assembler/fvm-as.scm
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-12-03 15:29:33 +0800
committerMistivia <i@mistivia.com>2024-12-03 15:29:33 +0800
commit8ef622fc576bc73334a33aadb3833bd8439623fb (patch)
tree9c862165c4f4478c8f74b5a0413bb468450a78b5 /assembler/fvm-as.scm
parent762f3cfc9ec0586e9b0d83d93ccaeb225550ebd1 (diff)
finish fvm-as
Diffstat (limited to 'assembler/fvm-as.scm')
-rw-r--r--assembler/fvm-as.scm30
1 files changed, 27 insertions, 3 deletions
diff --git a/assembler/fvm-as.scm b/assembler/fvm-as.scm
index bcc461a..68a2ca0 100644
--- a/assembler/fvm-as.scm
+++ b/assembler/fvm-as.scm
@@ -2,6 +2,8 @@
(import matchable)
(import (chicken io))
(import (chicken condition))
+(import (chicken keyword))
+(import (chicken process-context))
(define (make-opcode-table)
(define opcodes
@@ -50,6 +52,18 @@
(is-pseudo-op? sym)
(not (hash-table-ref/default tag-table sym #f)))))
+(define (preprocess prog)
+ (let loop ((lst prog) (ret '()))
+ (match lst
+ (() (reverse ret))
+ (('imm num . r) (loop r (cons (list 'imm num) ret)))
+ ((x . r) (if (keyword? x)
+ (loop r
+ (cons (list 'tag
+ (string->symbol (keyword->string x)))
+ ret))
+ (loop r (cons x ret)))))))
+
(define (pseudo-op-pass prog)
(define (add-to-prog oplist ret)
(if (null? oplist)
@@ -91,7 +105,7 @@
(cons (compose-tag curseg cur) ret)
curseg)
(impl (cdr prog) (cons cur ret) curseg)))
- ((is-tag-op? cur) (if (local-tag? (cadr cur))
+ ((is-tag-op? cur) (if (is-local-tag? (cadr cur))
(impl (cdr prog)
(cons (list 'tag (compose-tag curseg (cadr cur))) ret)
curseg)
@@ -129,7 +143,7 @@
(cons (list 'imm (+ -9 (- sym-pos cur-pos))) ret)
(+ 9 cur-pos))
`(error "symbol not found:" ,cur-op)))) ;; error
- ((is-tag-op? cur-op) (do-nothing 0))
+ ((is-tag-op? cur-op) (impl (cdr prog) ret cur-pos))
((is-op? cur-op) (do-nothing 1))
(else (do-nothing 9))))))
(impl prog '() 0))
@@ -169,6 +183,7 @@
;; read s-exp from file
(call-with-input-file input-file
(lambda (port) (set! prog (read port))))
+ (set! prog (preprocess prog))
(set! prog (pseudo-op-pass prog))
(set! prog (tag-preprocess-pass prog))
(let ((new-prog (tag-pass prog)))
@@ -177,4 +192,13 @@
(display new-prog) ;; error
(output-prog new-prog output-file))))
-(main "input" "output")
+(define args (argv))
+
+(if (not (= (length args) 3))
+ (let ()
+ (display "Usage: fvm-as <input-file> <output-file>")
+ (newline)
+ (exit))
+ '())
+
+(main (cadr args) (caddr args))