1(require-extension comparse)23(define parse-spaces4 (zero-or-more (in #\newline #\tab #\ )))56(define (parse-string str)7 (sequence* ((_ parse-spaces)8 (v (char-seq str))9 (_ parse-spaces))10 (result v)))1112(define parse-variable13 (bind (as-string (char-seq-match "^[a-zA-Z_][a-zA-Z0-9_]*"))14 (lambda (s)15 (result (cons 'var s)))))1617(define parse-operator18 (any-of19 (parse-string "+")20 (parse-string "-")))2122(define parse-operation23 (bind (as-string parse-operator)24 (lambda (s)25 (result (cons 'op (cond ((equal? s "+") 'plus)26 ((equal? s "-") 'minus)))))))2728(define parse-literal29 (bind (as-string (char-seq-match "^[0-9]*"))30 (lambda (s) (result (cons 'lit (string->number s))))))3132(define parse-primitive33 (any-of parse-variable parse-literal))3435(define parse-expression36 (bind (sequence parse-primitive parse-operation parse-primitive)37 (lambda (s) (result (cons 'expr s)))))3839(define parse-value40 (any-of parse-expression parse-primitive))4142(define parse-assign43 (sequence* ((var parse-variable)44 (_ (parse-string ":="))45 (val parse-value))46 (result (list 'assign var val))))4748(define parse-loop49 (sequence* ((_ (parse-string "LOOP"))50 (cond parse-value)51 (body parse-loop-body))52 (result (list 'loop cond body))))5354(define (parse-command)55 (bind (sequence (any-of parse-loop parse-assign) (parse-string ";"))56 (lambda (s) (result (car s)))))5758(define parse-commands59 (sequence* ((_ parse-spaces)60 (cmds (zero-or-more (parse-command)))61 (_ parse-spaces))62 (result cmds)))6364(define parse-loop-body65 (enclosed-by (parse-string "DO") parse-commands (parse-string "DONE")))6667(define parse-program68 (sequence* ((prog parse-commands)69 (_ end-of-input))70 (result prog)))7172(define (parse-loop-prog input)73 (let ((prog (parse parse-program input)))74 (if prog prog #f)))