aboutsummaryrefslogtreecommitdiff
path: root/src/lang/parser.clj
diff options
context:
space:
mode:
authorEduardo Julian2014-12-09 00:11:32 -0400
committerEduardo Julian2014-12-09 00:11:32 -0400
commit36de85ef43d60e29f4aeb622fb449cabb506e2d8 (patch)
treeccbaeb52afd37a8111593ae966d498def24a2791 /src/lang/parser.clj
parent04259ac74894f5e0b3319efe17c833b179d483e3 (diff)
Modules can now contain definitions of simple interfaces, with only method declarations.
Diffstat (limited to '')
-rw-r--r--src/lang/parser.clj9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/lang/parser.clj b/src/lang/parser.clj
index beb14302d..2d104be94 100644
--- a/src/lang/parser.clj
+++ b/src/lang/parser.clj
@@ -115,6 +115,14 @@
[?class ?field]))]
(return [::defclass ?name fields])))
+(defparser ^:private parse-definterface
+ [::&lexer/list ([[::&lexer/ident "definterface"] [::&lexer/ident ?name] & ?members] :seq)]
+ (let [members (for [field ?members]
+ (match field
+ [::&lexer/list ([[::&lexer/ident ":"] [::&lexer/ident ?member] [::&lexer/list ([[::&lexer/ident "->"] [::&lexer/tuple ?inputs] ?output] :seq)]] :seq)]
+ [?member [(map ident->string ?inputs) (ident->string ?output)]]))]
+ (return [::definterface ?name members])))
+
(defparser ^:private parse-tagged
[::&lexer/list ([[::&lexer/tag ?tag] ?data] :seq)]
(exec [=data (apply-m parse-form (list ?data))]
@@ -199,6 +207,7 @@
parse-ann-class
parse-module
parse-defclass
+ parse-definterface
parse-fn-call]))
;; [Interface]