1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
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')
}
});
|