module.exports = grammar({ name: 'api_notation', 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( choice( $.optional_value, $._label, ), optional($.type_annotation), optional($.parameter_list), optional($.return_statement), optional($.throw_statement), )), optional_value: $ => seq( '[', $._label, ']' ), type_annotation: $ => seq( '<', $._entry_list, '>' ), comment: $ => seq( '//', /[^\n]*/, $._newline, ), _label: $ => /[a-zA-Z0-9][a-zA-Z0-9_-]*/, _newline: $ => token('\n') } });