aboutsummaryrefslogtreecommitdiff
path: root/grammar.js
diff options
context:
space:
mode:
Diffstat (limited to 'grammar.js')
-rw-r--r--grammar.js105
1 files changed, 105 insertions, 0 deletions
diff --git a/grammar.js b/grammar.js
new file mode 100644
index 0000000..e74c27b
--- /dev/null
+++ b/grammar.js
@@ -0,0 +1,105 @@
+module.exports = grammar({
+ name: 'apinotation',
+
+ rules: {
+ source_file: $ => repeat(
+ seq(
+ choice(
+ $.definition,
+ $.comment
+ ),
+ repeat($._newline)
+ )
+ ),
+ definition: $ => prec.right(seq(
+ $.entry,
+ $._newline,
+ repeat(
+ choice(
+ $.member,
+ $.comment
+ )
+ )
+ )),
+ entry: $ => prec.right(seq(
+ $.identifier,
+ repeat(
+ seq(
+ token('.'),
+ $.identifier
+ )
+ )
+ )),
+ member: $ => seq(
+ $.member_type,
+ $._label,
+ optional($.type_annotation),
+ optional($.parameter_list),
+ optional($.return_statement),
+ optional($.throw_statement),
+ $._newline,
+ ),
+ member_type: $ => choice(
+ '::',
+ '->',
+ '<-',
+ '~>',
+ '<~',
+ '+>',
+ '<+',
+ '#',
+ '+',
+ '-'
+ ),
+ parameter_list: $ => seq(
+ '(',
+ optional($._identifier_list),
+ ')'
+ ),
+ return_statement: $ => seq(
+ '=>',
+ $.entry
+ ),
+ throw_statement: $ => seq(
+ '#>',
+ $._entry_list
+ ),
+ _entry_list: $ => prec.left(seq(
+ $.entry,
+ repeat(
+ seq(
+ ',',
+ $.entry
+ )
+ )
+ )),
+ _identifier_list: $ => seq(
+ $.identifier,
+ repeat(
+ seq(
+ ',',
+ $.identifier
+ )
+ )
+ ),
+ identifier: $ => prec.left(seq(
+ $._label,
+ optional($.type_annotation),
+ optional($.parameter_list),
+ optional($.return_statement),
+ optional($.throw_statement),
+ )),
+ type_annotation: $ => seq(
+ '<',
+ $._entry_list,
+ '>'
+ ),
+ comment: $ => seq(
+ '//',
+ /[^\n]*/,
+ $._newline,
+ ),
+ _label: $ => /[a-zA-Z0-9][a-zA-Z0-9_-]*/,
+ _newline: $ => token('\n')
+ }
+});