summaryrefslogtreecommitdiff
path: root/base.lisp
blob: bbfab80bfba4336bcd36d006e8a81bd59dd6a7ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(in-package #:monparser)

(defstruct parsing
  tree
  left)

(defstruct failure
  place
  message)

(defun new (tree)
  (lambda (input &key lazy)
    (declare (ignore lazy))
    (make-parsing :tree tree :left input)))

(defmacro bind (parser f)
  `(lambda (input &key lazy)
     (let ((r (funcall ,parser input)))
       (cond ((parsing-p r)
              (if lazy
                (lambda (ignored-input &key lazy)
                  (declare (ignore ignored-input))
                  (funcall (funcall ,f (parsing-tree r) input)
                           (parsing-left r)
                           :lazy lazy))
                (funcall (funcall ,f (parsing-tree r) input)
                         (parsing-left r))))
             ((failure-p r)
              r)
             (t (error (format nil "Invalid return value: ~a" r)))))))