diff options
Diffstat (limited to 'grammar.js')
| -rw-r--r-- | grammar.js | 105 |
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') + } +}); |