branch: master
commit 2e8c52b1360f0cf05dc6adf4da9ab0874b66a3e6
Author: Junpeng Qiu <[email protected]>
Commit: Junpeng Qiu <[email protected]>
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.