diff options
author | Eduardo Julian | 2015-12-16 00:10:43 -0400 |
---|---|---|
committer | Eduardo Julian | 2015-12-16 00:10:43 -0400 |
commit | 405a7efaf6ba2f20c5d3c5c654da964bda1451c6 (patch) | |
tree | e5fbbffb81ed5d31a5d854ca8aad10b2aee0523e /src/lux/analyser/parser.clj | |
parent | 08aa828cd4f83b719ef8d1af75463fadc67bcddb (diff) |
- Changed the way methods are defined in class definitions.
Diffstat (limited to 'src/lux/analyser/parser.clj')
-rw-r--r-- | src/lux/analyser/parser.clj | 88 |
1 files changed, 56 insertions, 32 deletions
diff --git a/src/lux/analyser/parser.clj b/src/lux/analyser/parser.clj index 074b032ee..a0b83a9e9 100644 --- a/src/lux/analyser/parser.clj +++ b/src/lux/analyser/parser.clj @@ -26,14 +26,6 @@ _ (fail (str "[Analyser Error] Not text: " (&/show-ast ast))))) -(defn parse-ctor-arg [ast] - (|case ast - [_ (&/$TupleS (&/$Cons ?class (&/$Cons [_ (&/$TextS ?term)] (&/$Nil))))] - (return (&/T ?class ?term)) - - _ - (fail (str "[Analyser Error] Not constructor argument: " (&/show-ast ast))))) - (defn parse-gclass-decl [ast] (|case ast [_ (&/$FormS (&/$Cons [_ (&/$TextS class-name)] (&/$Cons [_ (&/$TupleS args)] (&/$Nil))))] @@ -68,6 +60,15 @@ _ (fail (str "[Analyser Error] Not generic super-class: " (&/show-ast ast))))) +(defn parse-ctor-arg [ast] + (|case ast + [_ (&/$TupleS (&/$Cons ?class (&/$Cons ?term (&/$Nil))))] + (|do [=class (parse-gclass ?class)] + (return (&/T =class ?term))) + + _ + (fail (str "[Analyser Error] Not constructor argument: " (&/show-ast ast))))) + (defn parse-handler [[catch+ finally+] token] (|case token [meta (&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_catch")] @@ -123,7 +124,7 @@ _ (fail (str "[Analyser Error] Invalid argument declaration: " (&/show-ast ast))))) -(defn ^:private parse-method-decl* [asts] +(defn parse-method-decl [asts] (|case asts (&/$Cons [_ (&/$TextS method-name)] (&/$Cons [_ (&/$TupleS anns)] @@ -135,7 +136,7 @@ (|do [=anns (&/map% parse-ann anns) =gvars (&/map% parse-text gvars) =exceptions (&/map% parse-gclass exceptions) - =inputs (&/map% parse-arg-decl inputs) + =inputs (&/map% parse-gclass inputs) =output (parse-gclass output)] (return (&/T (&/T method-name =anns =gvars =exceptions =inputs =output) *tail*))) @@ -143,30 +144,53 @@ _ (fail (str "[Analyser Error] Invalid method declaration: " (->> asts (&/|map &/show-ast) (&/|interpose " ") (&/fold str "")))))) -(defn parse-method-decl [ast] - (|case ast - [_ (&/$FormS tokens)] - (|do [[decl *tail*] (parse-method-decl* tokens)] - (|case *tail* - (&/$Nil) - (return decl) - - _ - (fail (str "[Analyser Error] Invalid method declaration: " (&/show-ast ast))))) - - _ - (fail (str "[Analyser Error] Invalid method declaration: " (&/show-ast ast))))) - (defn parse-method-def [ast] (|case ast - [_ (&/$FormS tokens)] - (|do [[decl *tail*] (parse-method-decl* tokens)] - (|case *tail* - (&/$Cons body (&/$Nil)) - (return (&/T decl body)) - - _ - (fail (str "[Analyser Error] Invalid method definition: " (&/show-ast ast))))) + [_ (&/$FormS (&/$Cons [_ (&/$TextS "init")] + (&/$Cons [_ (&/$TupleS anns)] + (&/$Cons [_ (&/$TupleS gvars)] + (&/$Cons [_ (&/$TupleS exceptions)] + (&/$Cons [_ (&/$TupleS inputs)] + (&/$Cons ?ctor-args + (&/$Cons body (&/$Nil)))))))))] + (|do [=anns (&/map% parse-ann anns) + =gvars (&/map% parse-text gvars) + =exceptions (&/map% parse-gclass exceptions) + =inputs (&/map% parse-arg-decl inputs) + =ctor-args (&/map% parse-ctor-arg ?ctor-args)] + (return (&/V &/$ConstructorMethodSyntax (&/T =anns =gvars =exceptions =inputs =ctor-args body)))) + + [_ (&/$FormS (&/$Cons [_ (&/$TextS "virtual")] + (&/$Cons [_ (&/$TextS ?name)] + (&/$Cons [_ (&/$TupleS anns)] + (&/$Cons [_ (&/$TupleS gvars)] + (&/$Cons [_ (&/$TupleS exceptions)] + (&/$Cons [_ (&/$TupleS inputs)] + (&/$Cons output + (&/$Cons body (&/$Nil))))))))))] + (|do [=anns (&/map% parse-ann anns) + =gvars (&/map% parse-text gvars) + =exceptions (&/map% parse-gclass exceptions) + =inputs (&/map% parse-arg-decl inputs) + =output (parse-gclass output)] + (return (&/V &/$VirtualMethodSyntax (&/T ?name =anns =gvars =exceptions =inputs =output body)))) + + [_ (&/$FormS (&/$Cons [_ (&/$TextS "override")] + (&/$Cons ?class-decl + (&/$Cons [_ (&/$TextS ?name)] + (&/$Cons [_ (&/$TupleS anns)] + (&/$Cons [_ (&/$TupleS gvars)] + (&/$Cons [_ (&/$TupleS exceptions)] + (&/$Cons [_ (&/$TupleS inputs)] + (&/$Cons output + (&/$Cons body (&/$Nil)))))))))))] + (|do [=class-decl (parse-gclass-decl ?class-decl) + =anns (&/map% parse-ann anns) + =gvars (&/map% parse-text gvars) + =exceptions (&/map% parse-gclass exceptions) + =inputs (&/map% parse-arg-decl inputs) + =output (parse-gclass output)] + (return (&/V &/$OverridenMethodSyntax (&/T =class-decl ?name =anns =gvars =exceptions =inputs =output body)))) _ (fail (str "[Analyser Error] Invalid method definition: " (&/show-ast ast))))) |