From 3f44c64802100ff173e4341b21a7b6af624cb6fd Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Wed, 1 Jun 2022 18:00:29 -0400 Subject: [PATCH] Fix tuple/list/set parsing bug --- src/ludus/parser.clj | 60 +++++++++++--------------------------------- 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/src/ludus/parser.clj b/src/ludus/parser.clj index d6c41b9..bb31956 100644 --- a/src/ludus/parser.clj +++ b/src/ludus/parser.clj @@ -199,8 +199,10 @@ ::token/eof (panic (assoc origin ::errors (::errors parser)) "Unterminated tuple" ::token/eof) - (let [parsed (parse-expr parser #{::token/comma ::token/newline ::token/rparen})] - (recur parsed members (::ast parsed))))))) + (if current_member + (panic parser "Comma expected between tuple members") + (let [parsed (parse-expr parser #{::token/comma ::token/newline ::token/rparen})] + (recur parsed members (::ast parsed)))))))) (defn- parse-list [origin] (loop [parser (accept-many #{::token/newline ::token/comma} (advance origin)) @@ -233,8 +235,10 @@ :token curr :expr (::ast splatted)}) (panic parser "You may only splat words and synthetic expressions"))) - (let [parsed (parse-expr parser #{::token/comma ::token/newline ::token/rbracket})] - (recur parsed members (::ast parsed))))))) + (if current_member + (panic parser "Comma expected between list members") + (let [parsed (parse-expr parser #{::token/comma ::token/newline ::token/rbracket})] + (recur parsed members (::ast parsed)))))))) (defn- parse-set [origin] (loop [parser (accept-many #{::token/newline ::token/comma} (advance origin)) @@ -267,8 +271,10 @@ :token curr :expr (::ast splatted)}) (panic parser "You may only splat words and synthetic expressions"))) - (let [parsed (parse-expr parser #{::token/comma ::token/newline ::token/rbrace})] - (recur parsed members (::ast parsed))))))) + (if current_member + (panic parser "Comma expected between set members") + (let [parsed (parse-expr parser #{::token/comma ::token/newline ::token/rbrace})] + (recur parsed members (::ast parsed)))))))) (defn- parse-dict [origin] (loop [parser (accept-many #{::token/newline ::token/comma} (advance origin)) @@ -1066,44 +1072,8 @@ (comment (def pp pp/pprint) - (def source1 " -fn echo () -> { - loop () with () -> { - receive { - msg -> { - print (msg) - recur () - } - } - } -} + (def source "(asdf 1)") -& let my = spawn echo () - ") - (def source2 " -fn echo () -> { - loop () with () -> { - receive { - msg -> { - print (msg) - recur () - } - } - } -} - - - ") - - (time (do (def lexed2 (scanner/scan source2)) - (def tokens2 (:tokens lexed2)) - (def p2 (parser tokens2)) - (def ast2 (::ast (parse-script p2))))) - - (time (do (def lexed1 (scanner/scan source1)) - (def tokens1 (:tokens lexed1)) - (def p1 (parser tokens1)) - (def ast1 (::ast (parse-script p1))))) (println "") (println "") @@ -1111,9 +1081,7 @@ fn echo () -> { (println "") (println "*** *** TEST PARSE *** ***") - (println "asts are the same?" (= ast1 ast2)) - (pp ast1) - (pp ast2)) + (pp/pprint (parse (scanner/scan source)))) (comment " Further thoughts/still to do: