diff options
-rw-r--r-- | argot.lisp | 12 | ||||
-rw-r--r-- | package.lisp | 3 |
2 files changed, 8 insertions, 7 deletions
@@ -217,16 +217,16 @@ any pattern fails the whole parse fails." (defun parse-rule (nonterminal) (if-let (rule (gethash nonterminal *grammar*)) - (try-parse (result) (parse-pattern (rule-pattern rule)) - (if (rule-action rule) - (succeed (funcall (rule-action rule))) - (succeed result))) + (let ((*bindings* nil)) + (try-parse (result) (parse-pattern (rule-pattern rule)) + (if (rule-action rule) + (succeed (funcall (rule-action rule) *bindings*)) + (succeed result)))) (fail))) (defun parse (grammar rule tokens) (let ((*position* 0) (*grammar* grammar) - (*tokens* tokens) - (*bindings* nil)) + (*tokens* tokens)) (parse-rule rule))) diff --git a/package.lisp b/package.lisp index a759685..19880cb 100644 --- a/package.lisp +++ b/package.lisp @@ -3,4 +3,5 @@ (defpackage #:argot (:use #:cl) (:import-from #:trivia #:match #:ematch #:guard) - (:import-from #:alexandria #:if-let)) + (:import-from #:alexandria #:if-let) + (:export #:defgrammar #:parse)) |