KOTH almost functional.
[jars.git] / parser.scm
index 7bc3f90..f116033 100644 (file)
@@ -56,6 +56,7 @@
           (mode-post-indirect-A-irx (irregex "^\\}"))
           (mode-post-indirect-B-irx (irregex "^>"))
           (number-irx (irregex "^(\\+|-)?[0-9]+")))
+
       (define (accept-token irx . rest)
         (let ((wsmatch (irregex-search whitespace-irx (substring str idx))))
           (if wsmatch
@@ -69,6 +70,7 @@
               (if mandatory
                   (error "Unexpected token at input string index" idx)
                   #f))))
+
       (define (load-file)
         (accept-token redcode-irx #t)
         (let loop ((instrs '())
                   ((org) (loop instrs (cdr this-line) name author))
                   ((instr) (loop (cons (cdr this-line) instrs) offset name author)))
                 (make-prog name author (reverse instrs) offset)))))
+
       (define (line)
         (or (name-line)
             (author-line)
             (comment-line)
             (org-line)
             (instruction-line)))
+
       (define (name-line)
         (if (accept-token name-start-irx)
             (cons 'name (string-trim (accept-token name-irx #t)))
             #f))
+
       (define (author-line)
         (if (accept-token author-start-irx)
             (cons 'author (string-trim (accept-token author-irx #t)))
             #f))
+
       (define (comment-line)
         (if (accept-token comment-irx)
             '(comment)
             #f))
+
       (define (org-line)
         (if (accept-token org-irx)
             (cons 'org (string->number (accept-token number-irx #t)))
             #f))
+
       (define (instruction-line)
         (let ((oc (opcode)))
           (if oc
                     (z (accept-token comment-irx #t)))
                 (cons 'instr (make-instr oc modif A-mode A-num B-mode B-num)))
               #f)))
+
       (define (opcode)
         (let ((res (or (accept-token opcode-DAT-irx)
                        (accept-token opcode-MOV-irx)
                        (accept-token opcode-SPL-irx)
                        (accept-token opcode-NOP-irx))))
           (if res (string->symbol res) #f)))
+
       (define (modifier)
         (string->symbol
          (or (accept-token modifier-AB-irx)
              (accept-token modifier-F-irx)
              (accept-token modifier-X-irx)
              (accept-token modifier-I-irx))))
+
       (define (mode)
         (or (mode-immediate)
             (mode-direct)
             (mode-pre-indirect-B)
             (mode-post-indirect-A)
             (mode-post-indirect-B)))
+
       (define (mode-immediate)
         (and (accept-token mode-immediate-irx)
              'immediate))
+
       (define (mode-direct)
         (and (accept-token mode-direct-irx)
              'direct))
+
       (define (mode-indirect-A)
         (and (accept-token mode-indirect-A-irx)
              'indirect-A))
+
       (define (mode-indirect-B)
         (and (accept-token mode-indirect-B-irx)
              'indirect-B))
+
       (define (mode-pre-indirect-A)
         (and (accept-token mode-pre-indirect-A-irx)
              'pre-indirect-A))
+
       (define (mode-pre-indirect-B)
         (and (accept-token mode-pre-indirect-B-irx)
              'pre-indirect-B))
+
       (define (mode-post-indirect-A)
         (and (accept-token mode-post-indirect-A-irx)
              'post-indirect-A))
+
       (define (mode-post-indirect-B)
         (and (accept-token mode-post-indirect-B-irx)
              'post-indirect-B))
+
       (load-file))))