parse-seq should check for ignored value in fast paths as well (issue #757)

This commit is contained in:
Alex Shinn 2021-07-19 21:49:39 +09:00
parent 2d21500185
commit 5b8e196e0f
2 changed files with 16 additions and 2 deletions

View file

@ -53,6 +53,15 @@
(test-assert (parse f "aab"))
(test-error (parse-fully f "aab")))
(let ((f (parse-seq (parse-char #\a)
(parse-ignore (parse-char #\b)))))
(test '(#\a) (parse f "ab")))
(let ((f (parse-seq (parse-char #\a)
(parse-ignore (parse-char #\b))
(parse-char #\c))))
(test '(#\a #\c) (parse f "abc")))
;; grammars
(let ()

View file

@ -399,7 +399,9 @@
((null? (cdr o))
(let ((f (car o)))
(lambda (s i sk fk)
(f s i (lambda (r s i fk) (sk (list r) s i fk)) fk))))
(f s i (lambda (r s i fk)
(sk (if (eq? r ignored-value) '() (list r)) s i fk))
fk))))
(else
(let* ((f (car o))
(o (cdr o))
@ -408,7 +410,10 @@
(g (if (pair? o)
(apply parse-seq g o)
(lambda (s i sk fk)
(g s i (lambda (r s i fk) (sk (list r) s i fk)) fk)))))
(g s i (lambda (r s i fk)
(sk (if (eq? r ignored-value) '() (list r))
s i fk))
fk)))))
(lambda (source index sk fk)
(f source
index