diff options
Diffstat (limited to 'core.lisp')
-rw-r--r-- | core.lisp | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -1,5 +1,14 @@ (in-package #:monparser) +(defun opposite (p) + (lambda (input &key lazy) + (let ((result (funcall p input))) + (cond ((parsing-p result) + (make-failure :place input :message "Unexpected match.")) + ((failure-p result) + (make-parsing :tree nil :left input)) + (t (error "Unexpected result type.")))))) + (defun fail (message) (lambda (input &key lazy) (make-failure :place input :message message))) @@ -28,7 +37,8 @@ (make-parsing :tree it :left (advance input)) (make-failure :place input :message (format nil "Expected: ~a, Got: ~a" ',predicate it)))) - (make-failure :place input :message "Reached end of input.")))) + (make-failure :place input + :message (format nil "Reached end of input. Expected: ~a" ',predicate))))) (defun lazily-select-parser (input parsers) (let ((intermediate-parsers '()) @@ -46,8 +56,7 @@ (input-cursor (parsing-left result)))) (setf result r))) ((failure-p r) - (when (or (failure-p result) - (= (length parsers) 1)) + (when (failure-p result) (setf result r))) (t (error (format nil "Invalid return value: ~a" r)))))) (if intermediate-parsers |