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

(declaim (ftype (function (parser string) result) parse))
(defun parse (parser data)
  (funcall parser (make-cursor :data data)))

(declaim (ftype (function (parser string) parser) append-on-failure))
(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)))
    (if (and (listp args) (every #'symbolp args))
      (let (definition)
        (when (= (length args) 0)
          (push `(defparameter ,name (,name)) definition))
        (push `(defun ,name (,@args) (append-on-failure ,parser ,message))
              definition)
        (push 'progn definition)
        definition)
      (error "Malformed argument list."))))