diff options
| author | Mistivia <i@mistivia.com> | 2024-12-03 15:29:33 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-12-03 15:29:33 +0800 |
| commit | 8ef622fc576bc73334a33aadb3833bd8439623fb (patch) | |
| tree | 9c862165c4f4478c8f74b5a0413bb468450a78b5 /assembler/fvm-as.scm | |
| parent | 762f3cfc9ec0586e9b0d83d93ccaeb225550ebd1 (diff) | |
finish fvm-as
Diffstat (limited to 'assembler/fvm-as.scm')
| -rw-r--r-- | assembler/fvm-as.scm | 30 |
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)) |
