Parse import statements
This commit is contained in:
parent
9dc9e95e85
commit
969bbc548f
|
@ -690,6 +690,31 @@
|
||||||
:exprs (conj exprs (::ast expr))})
|
:exprs (conj exprs (::ast expr))})
|
||||||
)))))
|
)))))
|
||||||
|
|
||||||
|
(defn- parse-import [parser]
|
||||||
|
(let [path (parse-atom (advance parser))
|
||||||
|
as (expect* #{::token/as} "Expected as after path" path)
|
||||||
|
named? (if (:success as)
|
||||||
|
(expect* #{::token/word} "Expected name binding after as" (:parser as))
|
||||||
|
nil)
|
||||||
|
name (if (:success named?)
|
||||||
|
(parse-word (:parser as))
|
||||||
|
nil
|
||||||
|
)]
|
||||||
|
(cond
|
||||||
|
(not= ::token/string (token-type (advance parser)))
|
||||||
|
(panic parser "Expected path after import" #{::token/newline})
|
||||||
|
|
||||||
|
(not (:success as))
|
||||||
|
(panic parser "Expected as after path" #{::token/newline})
|
||||||
|
|
||||||
|
(not (:success named?))
|
||||||
|
(panic parser "Expected name binding after as")
|
||||||
|
|
||||||
|
:else
|
||||||
|
(assoc name ::ast {::ast/type ::ast/import
|
||||||
|
:path (get-in path [::ast :value])
|
||||||
|
:name (get-in name [::ast :word])}))))
|
||||||
|
|
||||||
(defn- parse-expr
|
(defn- parse-expr
|
||||||
([parser] (parse-expr parser sync-on))
|
([parser] (parse-expr parser sync-on))
|
||||||
([parser sync-on]
|
([parser sync-on]
|
||||||
|
@ -742,6 +767,8 @@
|
||||||
|
|
||||||
::token/ns (parse-ns parser)
|
::token/ns (parse-ns parser)
|
||||||
|
|
||||||
|
::token/import (parse-import parser)
|
||||||
|
|
||||||
;; TODO: improve handling of comments?
|
;; TODO: improve handling of comments?
|
||||||
;; Scanner now just skips comments
|
;; Scanner now just skips comments
|
||||||
;; ::token/comment (advance parser)
|
;; ::token/comment (advance parser)
|
||||||
|
@ -762,9 +789,9 @@
|
||||||
(parser)
|
(parser)
|
||||||
(parse-script)))
|
(parse-script)))
|
||||||
|
|
||||||
(do
|
(comment
|
||||||
(def pp pp/pprint)
|
(def pp pp/pprint)
|
||||||
(def source "let _foo = 42
|
(def source "import \"f\" as foo
|
||||||
|
|
||||||
")
|
")
|
||||||
(def lexed (scanner/scan source))
|
(def lexed (scanner/scan source))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user