[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 6001a70 12/60: Refine and add more parsec API
From: |
Junpeng Qiu |
Subject: |
[elpa] master 6001a70 12/60: Refine and add more parsec API |
Date: |
Tue, 25 Oct 2016 17:45:12 +0000 (UTC) |
branch: master
commit 6001a708d4051cda38222e17d775c13ea414cba7
Author: Junpeng Qiu <address@hidden>
Commit: Junpeng Qiu <address@hidden>
Refine and add more parsec API
---
parsec.el | 115 ++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 68 insertions(+), 47 deletions(-)
diff --git a/parsec.el b/parsec.el
index d48e352..0c4c772 100644
--- a/parsec.el
+++ b/parsec.el
@@ -48,7 +48,7 @@
(defalias 'parsec-msg-get 'cdr)
(defsubst parsec-throw (msg)
- (throw 'failed msg))
+ (throw 'parsec-failed msg))
(defun parsec-stop (&rest args)
(parsec-throw
@@ -142,84 +142,105 @@
(let ((outer-sym (make-symbol "outer"))
(parser-sym (make-symbol "parser"))
(msg-sym (make-symbol "msg"))
- (error-sym (make-symbol "err")))
- `(let (,error-sym)
+ (error-list-sym (make-symbol "err-list")))
+ `(let (,error-list-sym)
(cl-loop named ,outer-sym for ,parser-sym in ',parsers
finally (parsec-stop
:message
(replace-regexp-in-string
"\n" "\n\t"
(concat "None of the parsers succeeds:\n"
- (mapconcat #'identity ,error-sym "\n"))))
+ (mapconcat #'identity ,error-list-sym
"\n"))))
do
- (parsec-try
- (cl-return-from ,outer-sym
- (parsec-with-error ,msg-sym
- (eval ,parser-sym)
- (add-to-list ',error-sym (parsec-msg-get ,msg-sym)))))))))
+ (parsec--if-catch-and-forward 'parsec-failed-at-half
+ (parsec-start
+ (cl-return-from ,outer-sym
+ (parsec--if-handle-and-forward ,msg-sym
+ (parsec-as-single (eval ,parser-sym))
+ (push (parsec-msg-get ,msg-sym) ,error-list-sym)))))))))
(defalias 'parsec-and 'progn)
(defalias 'parsec-return 'prog1)
-(defmacro parsec-try (&rest forms)
- `(catch 'failed ,@forms))
+(defmacro parsec-start (&rest forms)
+ `(catch 'parsec-failed ,@forms))
+
+(defalias 'parsec-parse 'parsec-start)
-(defmacro parsec-save (&rest forms)
+(defmacro parsec-try (&rest forms)
(let ((orig-pt-sym (make-symbol "orig-pt"))
(msg-sym (make-symbol "msg")))
`(let ((,orig-pt-sym (point)))
- (parsec-with-error ,msg-sym
+ (parsec--if-handle-and-forward ,msg-sym
(parsec-and ,@forms)
(goto-char ,orig-pt-sym)))))
-(defmacro parsec-with-error (error-sym parser &rest handler)
+(defmacro parsec--if-catch (tag body &rest forms)
(declare (indent 2))
- `(catch 'success
- (let ((,error-sym (parsec-try
- (throw 'success ,parser))))
- ,@handler
- (parsec-throw ,error-sym))))
+ `(catch 'parsec-success
+ (catch ,tag
+ (throw 'parsec-success ,body))
+ ,@forms))
-(defmacro parsec-try-with-message (msg &rest forms)
+(defmacro parsec--if-catch-and-forward (tag parser)
(declare (indent 1))
- (let ((res-sym (make-symbol "result")))
- `(let ((,res-sym (parsec-try ,@forms)))
- ,(if msg
- `(if (parsec-msg-p ,res-sym)
- (parsec-msg ,msg)
- ,res-sym)
- `,res-sym))))
+ (let ((error-sym (make-symbol "err")))
+ `(catch 'parsec-success
+ (parsec-throw (catch ,tag
+ (throw 'parsec-success ,parser))))))
-(defmacro parsec-ensure-with-message (msg &rest forms)
+(defmacro parsec--if-handle-and-forward (error-sym parser &rest handler)
+ (declare (indent 2))
+ `(catch 'parsec-success
+ (let ((,error-sym (parsec-start
+ (throw 'parsec-success ,parser))))
+ ,@handler
+ (parsec-throw ,error-sym))))
+
+(defmacro parsec-with-message (msg &rest forms)
(declare (indent 1))
- (let ((error-sym (make-symbol "err")))
- `(let (,error-sym)
- (if (parsec-msg-p (setq ,error-sym
- (parsec-try-with-message ,msg ,@forms)))
- (error (parsec-msg-get ,error-sym))
- ,error-sym))))
+ `(parsec--if-catch 'parsec-failed
+ (parsec-and ,@forms)
+ (parsec-throw (parsec-msg msg))))
(defmacro parsec-ensure (&rest forms)
- `(parsec-ensure-with-message nil ,@forms))
+ `(parsec--if-handle-and-forward msg
+ (parsec-and ,@forms)
+ (error "%s" (parsec-msg-get msg))))
-(defalias 'parsec-parse 'parsec-try)
+(defmacro parsec-ensure-with-message (msg &rest forms)
+ (declare (indent 1))
+ `(parsec-ensure
+ (parsec-with-message msg
+ (parsec-and ,@forms))))
(cl-defmacro parsec-until (parser &optional &key skip)
`(catch 'done
(while (not (eobp))
- (parsec-try
+ (parsec-start
(throw 'done ,parser))
,(if skip
`(,skip 1)
`(forward-char 1)))))
+(defmacro parsec-as-single (parser)
+ (let ((orig-pt-sym (make-symbol "orig-pt"))
+ (error-sym (make-symbol "err")))
+ `(let ((,orig-pt-sym (point)))
+ (parsec--if-handle-and-forward ,error-sym
+ ,parser
+ (unless (= (point) ,orig-pt-sym)
+ (throw 'parsec-failed-at-half ,error-sym))))))
+
(defmacro parsec-many (parser)
- (let ((res (make-symbol "results")))
+ (let ((res (make-symbol "results"))
+ (error-sym (make-symbol "err")))
`(let (,res)
- (parsec-try
- (while (not (eobp))
- (push ,parser ,res)))
+ (parsec--if-catch-and-forward 'parsec-failed-at-half
+ (parsec-start
+ (while (not (eobp))
+ (push (parsec-as-single ,parser) ,res))))
(nreverse ,res))))
(defmacro parsec-many1 (parser)
@@ -244,10 +265,10 @@
nil))
(defmacro parsec-between (open close parser)
- `(parsec-save
- ,open
- (parsec-return ,parser
- ,close)))
+ `(parsec-and
+ ,open
+ (parsec-return ,parser
+ ,close)))
(defun parsec-just (x) (cons 'Just x))
@@ -261,7 +282,7 @@
(defmacro parsec-make-maybe (&rest body)
(let ((res (make-symbol "result")))
- `(let ((,res (parsec-try
+ `(let ((,res (parsec-start
,@body)))
(if (parsec-msg-p ,res)
parsec-nothing
@@ -272,7 +293,7 @@
`(with-temp-buffer
(insert ,input)
(goto-char (point-min))
- (parsec-try
+ (parsec-start
,@parsers)))
(provide 'parsec)
- [elpa] master fa2e6f1 27/60: Add gitignore, (continued)
- [elpa] master fa2e6f1 27/60: Add gitignore, Junpeng Qiu, 2016/10/25
- [elpa] master a06220c 42/60: Update README, Junpeng Qiu, 2016/10/25
- [elpa] master f7e8629 26/60: Add tests, Junpeng Qiu, 2016/10/25
- [elpa] master bc11325 50/60: Add file examples/.nosearch, Junpeng Qiu, 2016/10/25
- [elpa] master 1da4344 32/60: Update url-str-parser, Junpeng Qiu, 2016/10/25
- [elpa] master 89dd2ac 54/60: Fix some wording in README, Junpeng Qiu, 2016/10/25
- [elpa] master 55515ca 48/60: Add missing dependencies, Junpeng Qiu, 2016/10/25
- [elpa] master 2e9f962 59/60: Add new package parsec to externals-list, Junpeng Qiu, 2016/10/25
- [elpa] master 3827d26 36/60: Add docs for user-interface functions & combinators, Junpeng Qiu, 2016/10/25
- [elpa] master 8c108be 56/60: Add parsec-peek and parsec-peek-p, Junpeng Qiu, 2016/10/25
- [elpa] master 6001a70 12/60: Refine and add more parsec API,
Junpeng Qiu <=
- [elpa] master da878fa 18/60: Use parsec-query for other return values, Junpeng Qiu, 2016/10/25
- [elpa] master 054a753 06/60: Rename to parsec, Junpeng Qiu, 2016/10/25
- [elpa] master 2cce1e3 37/60: Rename parsec-from-just to parsec-from-maybe, Junpeng Qiu, 2016/10/25
- [elpa] master cdb8c0d 47/60: Remove unused symbols, Junpeng Qiu, 2016/10/25
- [elpa] master fdb3d99 44/60: Fix some code in simple-csv-parser.el, Junpeng Qiu, 2016/10/25
- [elpa] master 701964f 57/60: Prepare headers for GNU ELPA, Junpeng Qiu, 2016/10/25
- [elpa] master cbd3352 55/60: Add parsec-lookahead, Junpeng Qiu, 2016/10/25
- [elpa] master a951fbe 41/60: Unify tag names, Junpeng Qiu, 2016/10/25
- [elpa] master dfb3af0 60/60: Add 'packages/parsec/' from commit '8f0c266d8b9b0ee5fcf9b80c518644b2849ff3b3', Junpeng Qiu, 2016/10/25
- [elpa] master 6cc3100 07/60: Fix indentations, Junpeng Qiu, 2016/10/25