;;; test case (import (scheme base) (picrin test) (picrin procedure) (picrin parser) (picrin parser string)) (test-begin "(picrin parser) and (picrin parser string)") (define LPAREN (string "(")) (define RPAREN (string ")")) (define PLUS (string "+")) (define MINUS (string "-")) (define ONE (fapply (constant 1) (string "1"))) (define S (lazy (fapply (>> list car) A eof))) (define A (lazy (choice (fapply (lambda (p _ a) (list '+ p a)) P PLUS A) (fapply (lambda (p _ a) (list '- p a)) P MINUS A) P))) (define P (lazy (choice (between LPAREN A RPAREN) ONE))) (define-syntax test-success (syntax-rules () ((_ expect str) (test (cons expect (cons (string-length str) str)) (parse-string S str))))) (test-success 1 "(1)") (test-success '(- (+ 1 1) 1) "((1+1)-1)") (test-success '(- (+ 1 1) 1) "((1+(1))-1)") (test-success '(+ 1 (- 1 (+ 1 (- 1 (+ 1 1))))) "(1+(1-(1+(1-(1+1)))))") (test-success '(+ 1 (+ 1(- 1 (+ 1 (- 1 (+ 1 1)))))) "(1+1+(1-(1+(1-(1+1)))))") (test-end)