From 2121c6858fc942839070f98b1d1de50c8468199b Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Tue, 26 Apr 2016 19:04:49 -0400 Subject: - Now, the parser no longer ignores uneven-record errors. --- src/lux/base.clj | 6 ------ src/lux/parser.clj | 28 +++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/lux/base.clj b/src/lux/base.clj index 5451cf4da..e82143521 100644 --- a/src/lux/base.clj +++ b/src/lux/base.clj @@ -614,12 +614,6 @@ ))) )) -(defn repeat% [monad] - (try-all% (|list (|do [head monad - tail (repeat% monad)] - (return ($Cons head tail))) - (return $Nil)))) - (defn exhaust% [step] (fn [state] (|case (step state) diff --git a/src/lux/parser.clj b/src/lux/parser.clj index 4fb42e0fa..e0f35df3d 100644 --- a/src/lux/parser.clj +++ b/src/lux/parser.clj @@ -11,33 +11,51 @@ [lexer :as &lexer]))) ;; [Utils] +(def ^:private base-uneven-record-error + "[Parser Error] Records must have an even number of elements.") + +(defn ^:private repeat% [action] + (fn [state] + (|case (action state) + (&/$Left ^String error) + (if (.contains error base-uneven-record-error) + (&/$Left error) + (&/$Right (&/T [state &/$Nil]))) + + (&/$Right state* head) + ((|do [tail (repeat% action)] + (return (&/$Cons head tail))) + state*)))) + (do-template [ ] (defn [parse] - (|do [elems (&/repeat% parse) + (|do [elems (repeat% parse) token &lexer/lex] (|case token [meta ( _)] (return ( (&/fold &/|++ &/$Nil elems))) _ - (fail (str "[Parser Error] Unbalanced " "."))))) + (fail (str "[Parser Error] Unbalanced " ".")) + ))) ^:private parse-form &lexer/$Close_Paren "parantheses" &/$FormS ^:private parse-tuple &lexer/$Close_Bracket "brackets" &/$TupleS ) (defn ^:private parse-record [parse] - (|do [elems* (&/repeat% parse) + (|do [elems* (repeat% parse) token &lexer/lex :let [elems (&/fold &/|++ &/$Nil elems*)]] (|case token [meta (&lexer/$Close_Brace _)] (if (even? (&/|length elems)) (return (&/$RecordS (&/|as-pairs elems))) - (fail (str "[Parser Error] Records must have an even number of elements."))) + (fail (str base-uneven-record-error))) _ - (fail (str "[Parser Error] Unbalanced braces."))))) + (fail (str "[Parser Error] Unbalanced braces.")) + ))) ;; [Interface] (def parse -- cgit v1.2.3