(import (chicken irregex)) (define (string->instr str) (let ((idx 0) (l (string-length str)) (whitespace-irx (irregex "[ \t]*")) (newline-irx (irregex "\n")) (comment-irx (irregex ";[^\n]*"))) (define (accept-token irx mandatory) (let ((wsmatch (irregex-match whitespace-irx (substr str idx)))) (set! idx (+ idx (irregex-match-end-index wsmatch)))) ;Skip leading whitespace (let ((res (irregex-match irx (substring str idx)))) (if res (begin (set! idx (+ idx (irregex-match-end-index res))) (irregex-match-substring res)) (if mandatory (error "Unexpected token at input string index" idx) #f)))) (define (accept-token-string token-str mandatory) (accept-token (irregex token-str) mandatory)) (define (load-file) (let loop () (if (line) (loop)))) (define (line) (or (accept-token comment-irx #f) (accept-token newline-irx #f) (and(accept-token newline-irx #t)))) (define (instruction) (and (opcode) (accept-token period-irx #t) (accept-modifier)))))