Add splats to dict & struct patterns in parser
This commit is contained in:
parent
07c21494cf
commit
e30a8b973b
|
@ -484,7 +484,7 @@
|
||||||
|
|
||||||
(def sync-pattern (s/union sync-on #{::token/equals ::token/rarrow}))
|
(def sync-pattern (s/union sync-on #{::token/equals ::token/rarrow}))
|
||||||
|
|
||||||
(defn- parse-splat-pattern [origin]
|
(defn- parse-list-tuple-splat-pattern [origin]
|
||||||
(let [splatted (advance origin)]
|
(let [splatted (advance origin)]
|
||||||
(case (token-type splatted)
|
(case (token-type splatted)
|
||||||
::token/word
|
::token/word
|
||||||
|
@ -536,7 +536,7 @@
|
||||||
(panic (assoc origin ::errors (::errors parser)) "Unterminated list pattern" ::token/eof)
|
(panic (assoc origin ::errors (::errors parser)) "Unterminated list pattern" ::token/eof)
|
||||||
|
|
||||||
::token/splat
|
::token/splat
|
||||||
(let [splatted (parse-splat-pattern parser)]
|
(let [splatted (parse-list-tuple-splat-pattern parser)]
|
||||||
(recur splatted members (::ast splatted)))
|
(recur splatted members (::ast splatted)))
|
||||||
|
|
||||||
(let [parsed (parse-pattern parser)]
|
(let [parsed (parse-pattern parser)]
|
||||||
|
@ -548,11 +548,12 @@
|
||||||
current_member nil]
|
current_member nil]
|
||||||
(let [curr (current parser)]
|
(let [curr (current parser)]
|
||||||
(case (token-type parser)
|
(case (token-type parser)
|
||||||
::token/rbrace (let [ms (add-member members current_member)]
|
::token/rbrace
|
||||||
(assoc (advance parser) ::ast
|
(let [ms (add-member members current_member)]
|
||||||
{::ast/type ::ast/dict
|
(assoc (advance parser) ::ast
|
||||||
:token (current origin)
|
{::ast/type ::ast/dict
|
||||||
:members ms}))
|
:token (current origin)
|
||||||
|
:members ms}))
|
||||||
|
|
||||||
(::token/comma ::token/newline)
|
(::token/comma ::token/newline)
|
||||||
(recur
|
(recur
|
||||||
|
@ -565,6 +566,21 @@
|
||||||
::token/eof
|
::token/eof
|
||||||
(panic (assoc origin ::errors (::errors parser)) "Unterminated dict pattern" ::token/eof)
|
(panic (assoc origin ::errors (::errors parser)) "Unterminated dict pattern" ::token/eof)
|
||||||
|
|
||||||
|
::token/splat
|
||||||
|
(cond
|
||||||
|
current_member
|
||||||
|
(panic parser "Unexpected splat after keyword in dict pattern.")
|
||||||
|
|
||||||
|
(::ast/splatted members)
|
||||||
|
(panic parser "Dict patterns may only have one splat.")
|
||||||
|
|
||||||
|
(not= ::token/word (::token/type (current (advance parser))))
|
||||||
|
(panic parser "Splats in dicts may only splat into words.")
|
||||||
|
|
||||||
|
:else
|
||||||
|
(let [splatted (parse-word (advance parser))]
|
||||||
|
(recur splatted members {::ast/splatted (::ast splatted)})))
|
||||||
|
|
||||||
::token/word
|
::token/word
|
||||||
(if (not current_member)
|
(if (not current_member)
|
||||||
(let [parsed (parse-word parser) word (get-in parsed [::ast :word])]
|
(let [parsed (parse-word parser) word (get-in parsed [::ast :word])]
|
||||||
|
@ -602,6 +618,21 @@
|
||||||
::token/eof
|
::token/eof
|
||||||
(panic (assoc origin ::errors (::errors parser)) "Unterminated struct pattern" ::token/eof)
|
(panic (assoc origin ::errors (::errors parser)) "Unterminated struct pattern" ::token/eof)
|
||||||
|
|
||||||
|
::token/splat
|
||||||
|
(cond
|
||||||
|
current_member
|
||||||
|
(panic parser "Unexpected splat after keyword in struct pattern.")
|
||||||
|
|
||||||
|
(::ast/splatted members)
|
||||||
|
(panic parser "Struct patterns may only have one splat.")
|
||||||
|
|
||||||
|
(not= ::token/word (::token/type (current (advance parser))))
|
||||||
|
(panic parser "Splats in structs may only splat into words.")
|
||||||
|
|
||||||
|
:else
|
||||||
|
(let [splatted (parse-word (advance parser))]
|
||||||
|
(recur splatted members {::ast/splatted (::ast splatted)})))
|
||||||
|
|
||||||
::token/word
|
::token/word
|
||||||
(if (not current_member)
|
(if (not current_member)
|
||||||
(let [parsed (parse-word parser) word (get-in parsed [::ast :word])]
|
(let [parsed (parse-word parser) word (get-in parsed [::ast :word])]
|
||||||
|
@ -646,7 +677,7 @@
|
||||||
(panic (assoc origin ::errors (::errors parser)) "Unterminated tuple" ::token/eof)
|
(panic (assoc origin ::errors (::errors parser)) "Unterminated tuple" ::token/eof)
|
||||||
|
|
||||||
::token/splat
|
::token/splat
|
||||||
(let [splatted (parse-splat-pattern parser)]
|
(let [splatted (parse-list-tuple-splat-pattern parser)]
|
||||||
(recur splatted members (::ast splatted)))
|
(recur splatted members (::ast splatted)))
|
||||||
|
|
||||||
(let [parsed (parse-pattern parser)]
|
(let [parsed (parse-pattern parser)]
|
||||||
|
@ -1113,7 +1144,7 @@
|
||||||
|
|
||||||
(do
|
(do
|
||||||
(def pp pp/pprint)
|
(def pp pp/pprint)
|
||||||
(def source "let (a, ...b) = :foo")
|
(def source "let @{a, ...foo, :c d} = :foo")
|
||||||
|
|
||||||
(println "")
|
(println "")
|
||||||
(println "")
|
(println "")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user