summaryrefslogtreecommitdiff
path: root/main.lisp
blob: 6cc0007e225a408504b59a071c35ff623ee20b26 (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
(in-package #:monparser)

(defun parse (parser data)
  (let* ((result (funcall parser
                          (make-instance 'cursed:text
                                         :data data))))
    (if (parsing-p result)
      (let ((finished? (not (cursed:has-data? (parsing-end result)))))
        (values (parsing-tree result) finished?))
      result)))

(defun append-on-failure (p message)
  (lambda (input)
    (let ((result (funcall p input)))
      (if (failure-p result)
        (make-failure :place (failure-place result)
                      :message (concatenate 'string message (failure-message result))
                      :priority (failure-priority result))
        result))))

(defmacro defparser (name args parser)
  (let ((message (format nil "In ~a:~&" name)))
    (cond ((equal args :const)
           `(defparameter ,name (append-on-failure ,parser ,message)))
          ((listp args)
           `(defun ,name ,args (append-on-failure ,parser ,message)))
          (t (error
               (format nil "Cannot define ~a: ~a is not :const or a list." name args))))))