blob: f802d2585e5dbd0c35771243952b9ee90e11eb89 (
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
|
(in-package #:monparser)
(defun parse (parser data)
(let* ((result (funcall parser
(make-instance 'parser-input
:data data))))
(if (parsing-p result)
(let ((finished? (not (has-data? (parsing-left 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)))
(if (null args)
`(defparameter ,name (append-on-failure ,parser ,message))
`(defun ,name ,args (append-on-failure ,parser ,message)))))
|