Skip to content

Commit 0f3a579

Browse files
committed
Add fields
1 parent 393b380 commit 0f3a579

File tree

6 files changed

+8937
-7284
lines changed

6 files changed

+8937
-7284
lines changed

grammar.js

Lines changed: 106 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -73,78 +73,101 @@ module.exports = grammar({
7373
empty_statement: () => ";",
7474

7575
scoped_function_definition_statement: ($) =>
76-
seq("local", "function", $.identifier, $._function_body),
76+
seq("local", "function", field("name", $.identifier), $._function_body),
7777

7878
function_definition_statement: ($) =>
79-
seq("function", $.function_identifier, $._function_body),
79+
seq("function", field("name", $.function_identifier), $._function_body),
8080
function_identifier: ($) =>
81-
seq(_list($.identifier, "."), optional(seq(":", $.identifier))),
81+
seq(
82+
_list($.identifier, "."),
83+
optional(seq(":", field("method", $.identifier))),
84+
),
8285

8386
scoped_variable_declaration: ($) =>
8487
seq(
8588
"local",
8689
alias($.scoped_variable_list, $.variable_list),
87-
optional(seq("=", $.expression_list)),
90+
optional(seq("=", alias($.value_list, $.expression_list))),
8891
),
89-
scoped_variable_list: ($) => _list($.scoped_variable, ","),
90-
scoped_variable: ($) => seq($.identifier, optional($.attribute)),
91-
attribute: ($) => seq("<", $.identifier, ">"),
92-
93-
variable_assignment: ($) => seq($.variable_list, "=", $.expression_list),
92+
scoped_variable_list: ($) =>
93+
_list(alias($.scoped_variable, $.variable), ","),
94+
scoped_variable: ($) =>
95+
seq(field("name", $.identifier), optional($.attribute)),
96+
attribute: ($) => seq("<", field("name", $.identifier), ">"),
97+
98+
variable_assignment: ($) =>
99+
seq($.variable_list, "=", alias($.value_list, $.expression_list)),
94100
variable_list: ($) => _list($.variable, ","),
95101

96-
goto_statement: ($) => seq("goto", $.identifier),
97-
label_statement: ($) => seq("::", $.identifier, "::"),
102+
goto_statement: ($) => seq("goto", field("name", $.identifier)),
103+
label_statement: ($) => seq("::", field("name", $.identifier), "::"),
98104

99105
break_statement: () => "break",
100106

101107
repeat_statement: ($) =>
102-
seq("repeat", optional($.block), "until", $._expression),
108+
seq(
109+
"repeat",
110+
optional(field("body", $.block)),
111+
"until",
112+
field("condition", $._expression),
113+
),
103114

104115
while_statement: ($) =>
105-
seq("while", $._expression, "do", optional($.block), "end"),
116+
seq(
117+
"while",
118+
field("condition", $._expression),
119+
"do",
120+
optional(field("body", $.block)),
121+
"end",
122+
),
106123

107124
for_generic_statement: ($) =>
108125
seq(
109126
"for",
110-
alias($.identifier_list, $.variable_list),
127+
field("left", alias($.name_list, $.variable_list)),
111128
"in",
112-
$.expression_list,
129+
field("right", alias($.value_list, $.expression_list)),
113130
"do",
114-
optional($.block),
131+
optional(field("body", $.block)),
115132
"end",
116133
),
117-
identifier_list: ($) => _list($.identifier, ","),
134+
name_list: ($) => _list(field("name", $.identifier), ","),
135+
value_list: ($) => _list(field("value", $._expression), ","),
118136

119137
for_numeric_statement: ($) =>
120138
seq(
121139
"for",
122-
$.identifier,
140+
field("name", $.identifier),
123141
"=",
124-
$._expression,
142+
field("start", $._expression),
125143
",",
126-
$._expression,
127-
optional(seq(",", $._expression)),
144+
field("end", $._expression),
145+
optional(seq(",", field("step", $._expression))),
128146
"do",
129-
optional($.block),
147+
optional(field("body", $.block)),
130148
"end",
131149
),
132150

133151
if_statement: ($) =>
134152
seq(
135153
"if",
136-
$._expression,
154+
field("condition", $._expression),
137155
"then",
138-
optional($.block),
139-
repeat($.elseif_clause),
140-
optional($.else_clause),
156+
optional(field("consequence", $.block)),
157+
repeat(field("alternative", $.elseif_clause)),
158+
optional(field("alternative", $.else_clause)),
141159
"end",
142160
),
143161
elseif_clause: ($) =>
144-
seq("elseif", $._expression, "then", optional($.block)),
145-
else_clause: ($) => seq("else", optional($.block)),
162+
seq(
163+
"elseif",
164+
field("condition", $._expression),
165+
"then",
166+
optional(field("consequence", $.block)),
167+
),
168+
else_clause: ($) => seq("else", optional(field("body", $.block))),
146169

147-
do_statement: ($) => seq("do", optional($.block), "end"),
170+
do_statement: ($) => seq("do", optional(field("body", $.block)), "end"),
148171

149172
// expressions
150173
_expression: ($) =>
@@ -167,27 +190,45 @@ module.exports = grammar({
167190
parenthesized_expression: ($) => seq("(", $._expression, ")"),
168191
variable: ($) =>
169192
choice(
170-
$.identifier,
171-
seq($._prefix_expression, ".", $.identifier),
172-
seq($._prefix_expression, "[", $._expression, "]"),
193+
field("name", $.identifier),
194+
seq(
195+
field("table", $._prefix_expression),
196+
".",
197+
field("field", $.identifier),
198+
),
199+
seq(
200+
field("table", $._prefix_expression),
201+
"[",
202+
field("field", $._expression),
203+
"]",
204+
),
173205
),
174206
function_call: ($) =>
175207
seq(
176208
$._prefix_expression,
177-
optional(seq(":", $.identifier)),
178-
$.argument_list,
209+
optional(seq(":", field("method", $.identifier))),
210+
field("arguments", $.argument_list),
179211
),
180212
argument_list: ($) =>
181213
choice($.string, $.table, seq("(", optional($.expression_list), ")")),
182214
expression_list: ($) => _list($._expression, ","),
183215

184216
function_definition: ($) => seq("function", $._function_body),
185217
_function_body: ($) =>
186-
seq("(", optional($.parameter_list), ")", optional($.block), "end"),
218+
seq(
219+
"(",
220+
optional(field("parameters", $.parameter_list)),
221+
")",
222+
optional(field("body", $.block)),
223+
"end",
224+
),
187225
parameter_list: ($) =>
188226
choice(
189227
$.vararg_expression,
190-
seq(_list($.identifier, ","), optional(seq(",", $.vararg_expression))),
228+
seq(
229+
_list(field("name", $.identifier), ","),
230+
optional(seq(",", $.vararg_expression)),
231+
),
191232
),
192233

193234
vararg_expression: () => "...",
@@ -197,9 +238,15 @@ module.exports = grammar({
197238
seq(_list($.field, $._field_separator), optional($._field_separator)),
198239
field: ($) =>
199240
choice(
200-
$._expression,
201-
seq($.identifier, "=", $._expression),
202-
seq("[", $._expression, "]", "=", $._expression),
241+
field("value", $._expression),
242+
seq(field("key", $.identifier), "=", field("value", $._expression)),
243+
seq(
244+
"[",
245+
field("key", $._expression),
246+
"]",
247+
"=",
248+
field("value", $._expression),
249+
),
203250
),
204251
_field_separator: () => choice(",", ";"),
205252

@@ -226,20 +273,37 @@ module.exports = grammar({
226273
["//", PREC.MULTIPLICATIVE],
227274
["%", PREC.MULTIPLICATIVE],
228275
].map(([operator, priority]) =>
229-
prec.left(priority, seq($._expression, operator, $._expression)),
276+
prec.left(
277+
priority,
278+
seq(
279+
field("left", $._expression),
280+
field("operator", operator),
281+
field("right", $._expression),
282+
),
283+
),
230284
),
231285
...[
232286
["..", PREC.CONCATENATION],
233287
["^", PREC.POWER],
234288
].map(([operator, priority]) =>
235-
prec.right(priority, seq($._expression, operator, $._expression)),
289+
prec.right(
290+
priority,
291+
seq(
292+
field("left", $._expression),
293+
field("operator", operator),
294+
field("right", $._expression),
295+
),
296+
),
236297
),
237298
),
238299

239300
unary_expression: ($) =>
240301
choice(
241302
...["not", "#", "-", "~"].map((operator) =>
242-
prec.left(PREC.UNARY, seq(operator, $._expression)),
303+
prec.left(
304+
PREC.UNARY,
305+
seq(field("operator", operator), field("argument", $._expression)),
306+
),
243307
),
244308
),
245309

0 commit comments

Comments
 (0)