Skip to content

Commit e67a07b

Browse files
committed
Redo "variable" and other table identifier rules
- Remove unnecessary intermediate identifier rules and "name" fields - Rewrite table access rules for a more cohesive representation - Add more "table"/"field" fields - Use the "variable" alias as appropriate
1 parent 88dcdcd commit e67a07b

File tree

6 files changed

+5352
-4367
lines changed

6 files changed

+5352
-4367
lines changed

grammar.js

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const PREC = {
1111
MULTIPLICATIVE: 10, // "*" "/" "//" "%"
1212
UNARY: 11, // "not" "#" "-" "~"
1313
POWER: 12, // "^"
14+
CALL: 13,
1415
};
1516

1617
const WHITESPACE = /\s/;
@@ -77,9 +78,26 @@ module.exports = grammar({
7778
seq("local", "function", field("name", $.identifier), $._function_body),
7879

7980
function_definition_statement: ($) =>
80-
seq("function", field("name", $.function_identifier), $._function_body),
81-
function_identifier: ($) =>
82-
seq(_list($.identifier, "."), optional($._method)),
81+
seq(
82+
"function",
83+
field(
84+
"name",
85+
choice($.identifier, alias($._table_function_variable, $.variable)),
86+
),
87+
$._function_body,
88+
),
89+
_table_function_variable: ($) =>
90+
seq(
91+
$._table_identifier,
92+
choice($._named_field_identifier, $._method_identifier),
93+
),
94+
_table_identifier: ($) =>
95+
field(
96+
"table",
97+
choice($.identifier, alias($._table_field_variable, $.variable)),
98+
),
99+
_table_field_variable: ($) =>
100+
seq($._table_identifier, $._named_field_identifier),
83101

84102
for_generic_statement: ($) =>
85103
seq(
@@ -259,38 +277,47 @@ module.exports = grammar({
259277
),
260278
field_separator: () => choice(",", ";"),
261279

262-
prefix_expression: ($) =>
263-
choice($.variable, $.call, $.parenthesized_expression),
264-
_prefix_expression: ($) => prec(1, $.prefix_expression),
280+
prefix: ($) => choice($.variable, $.call, $.parenthesized_expression),
281+
prefix_expression: ($) => $.prefix,
282+
_prefix_expression: ($) => prec(PREC.CALL, $.prefix),
265283

266284
parenthesized_expression: ($) => seq("(", $.expression, ")"),
267285

268286
call: ($) =>
269287
seq(
270-
field("function", $.call_identifier),
288+
field(
289+
"function",
290+
choice(
291+
$._prefix_expression,
292+
alias($._table_method_variable, $.variable),
293+
),
294+
),
271295
field("arguments", $.argument_list),
272296
),
273-
call_identifier: ($) => seq($._prefix_expression, optional($._method)),
274-
_method: ($) => seq(":", field("method", $.identifier)),
297+
_table_method_variable: ($) =>
298+
seq(field("table", $.prefix_expression), $._method_identifier),
299+
_method_identifier: ($) => seq(":", field("method", $.identifier)),
275300
argument_list: ($) =>
276301
choice(seq("(", optional($.expression_list), ")"), $.table, $.string),
277302
expression_list: ($) => _list($.expression, ","),
278303

279-
variable: ($) =>
280-
choice(
281-
field("name", $.identifier),
282-
seq(
283-
field("table", $._prefix_expression),
284-
"[",
285-
field("field", $.expression),
286-
"]",
287-
),
288-
seq(
289-
field("table", $._prefix_expression),
290-
".",
291-
field("field", $.identifier),
304+
variable: ($) => choice(field("name", $.identifier), $._table_variable),
305+
_table_variable: ($) =>
306+
seq(
307+
field(
308+
"table",
309+
choice(
310+
$.identifier,
311+
alias($._table_variable, $.variable),
312+
$.call,
313+
$.parenthesized_expression,
314+
),
292315
),
316+
choice($._indexed_field_identifier, $._named_field_identifier),
293317
),
318+
_named_field_identifier: ($) => seq(".", field("field", $.identifier)),
319+
_indexed_field_identifier: ($) =>
320+
seq("[", field("field", $.expression), "]"),
294321

295322
function_definition: ($) => seq("function", $._function_body),
296323
_function_body: ($) =>
@@ -354,9 +381,9 @@ module.exports = grammar({
354381
$._string_end,
355382
],
356383

357-
inline: ($) => [$.prefix_expression, $.field_separator],
384+
inline: ($) => [$.prefix, $.field_separator],
358385

359-
supertypes: ($) => [$._prefix_expression, $.expression, $.statement],
386+
supertypes: ($) => [$.prefix_expression, $.expression, $.statement],
360387

361388
word: ($) => $.identifier,
362389
});

0 commit comments

Comments
 (0)