branch: master commit 2e8c52b1360f0cf05dc6adf4da9ab0874b66a3e6 Author: Junpeng Qiu <qjpchm...@gmail.com> Commit: Junpeng Qiu <qjpchm...@gmail.com>
Make sure parsec-not-followed-by consumes no input --- parsec-tests.el | 9 +++++++++ parsec.el | 13 +++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/parsec-tests.el b/parsec-tests.el index 661411f..fdf2055 100644 --- a/parsec-tests.el +++ b/parsec-tests.el @@ -342,6 +342,15 @@ (parsec-str "ab") (parsec-not-followed-by (parsec-ch ?c)) (parsec-ch ?d))) + '("ab" "d"))) + (should + (equal + (parsec-with-input "abd" + (parsec-collect* + (parsec-str "ab") + (parsec-or (parsec-not-followed-by (parsec-ch ?d)) + (parsec-not-followed-by (parsec-ch ?c))) + (parsec-ch ?d))) '("ab" "d")))) (ert-deftest test-parsec-endby () diff --git a/parsec.el b/parsec.el index 295aea8..1e27d5e 100644 --- a/parsec.el +++ b/parsec.el @@ -394,12 +394,13 @@ meaning as `parsec-many-till'." "Succeed only when PARSER fails. Consume no input." (let ((res-sym (make-symbol "results"))) `(catch 'parsec-not-followed-by - (let ((,res-sym - (catch 'parsec-immediate-stop - (throw 'parsec-not-followed-by - (parsec-or (throw 'parsec-immediate-stop (parsec-try ,parser)) - nil))))) - (parsec-stop :message (format "Unexpected followed by: %s" ,res-sym)))))) + (parsec-try + (let ((,res-sym + (catch 'parsec-immediate-stop + (throw 'parsec-not-followed-by + (parsec-or (throw 'parsec-immediate-stop (parsec-try ,parser)) + nil))))) + (parsec-stop :message (format "Unexpected followed by: %s" ,res-sym))))))) (defmacro parsec-endby (parser end) "Parse zero or more occurrences of PARSER, separated and ended by END.