Skip to content

Commit 57d4e90

Browse files
committed
Reorder rules
1 parent d3ae50a commit 57d4e90

File tree

4 files changed

+4546
-4546
lines changed

4 files changed

+4546
-4546
lines changed

docs/extended_bnf.md

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,34 @@ block = return_statement | statement {statement} [return_statement];
1111
(* statements *)
1212
return_statement = "return" [expression_list] [empty_statement];
1313
14-
statement = do_statement | if_statement | for_numeric_statement | for_generic_statement
15-
| while_statement | repeat_statement | break_statement | label_statement | goto_statement
16-
| variable_assignment | scoped_variable_declaration | function_definition_statement
17-
| scoped_function_definition_statement | function_call | empty_statement;
18-
19-
empty_statement = ";";
14+
statement = empty_statement | variable_assignment | scoped_variable_declaration | function_call
15+
| label_statement | goto_statement | break_statement | do_statement | while_statement | repeat_statement
16+
| if_statement | for_numeric_statement | for_generic_statement | function_definition_statement
17+
| scoped_function_definition_statement;
2018
2119
scoped_function_definition_statement = "local" "function" identifier function_body;
2220
2321
function_definition_statement = "function" function_identifier function_body;
2422
function_identifier = identifier {"." identifier} [":" identifier];
2523
24+
for_generic_statement = "for" identifier_list "in" expression_list "do" [block] "end";
25+
26+
for_numeric_statement = "for" identifier "=" expression "," expression ["," expression] "do" [block] "end";
27+
28+
if_statement = "if" expression "then" [block] {"elseif" expression "then" [block]}
29+
["else" [block]] "end";
30+
31+
repeat_statement = "repeat" [block] "until" expression;
32+
33+
while_statement = "while" expression "do" [block] "end";
34+
35+
do_statement = "do" [block] "end";
36+
37+
break_statement = "break";
38+
39+
goto_statement = "goto" identifier;
40+
label_statement = "::" identifier "::";
41+
2642
scoped_variable_declaration = "local" scoped_variable_list ["=" expression_list];
2743
scoped_variable_list = scoped_variable {',' scoped_variable};
2844
scoped_variable = identifier [attribute];
@@ -31,40 +47,28 @@ attribute = '<' identifier '>';
3147
variable_assignment = variable_list "=" expression_list;
3248
variable_list = variable {"," variable};
3349
34-
goto_statement = "goto" identifier;
35-
label_statement = "::" identifier "::";
36-
37-
break_statement = "break";
38-
repeat_statement = "repeat" [block] "until" expression;
39-
while_statement = "while" expression "do" [block] "end";
40-
for_generic_statement = "for" identifier_list "in" expression_list "do" [block] "end";
41-
for_numeric_statement = "for" identifier "=" expression "," expression ["," expression] "do" [block] "end";
42-
43-
if_statement = "if" expression "then" [block] {"elseif" expression "then" [block]}
44-
["else" [block]] "end";
45-
46-
do_statement = "do" [block] "end";
50+
empty_statement = ";";
4751
4852
(* expressions *)
49-
expression = nil | boolean | number | string | unary_expression | binary_expression
50-
| table | vararg_expression | function_definition | prefix_expression;
53+
expression = "nil" | "false" | "true" | number | string | vararg_expression | function_definition
54+
| prefix_expression | table | unary_expression | binary_expression;
5155
5256
prefix_expression = variable | function_call | "(" expression ")";
53-
variable = identifier | prefix_expression "." identifier | prefix_expression "[" expression "]";
57+
variable = identifier | prefix_expression "[" expression "]" | prefix_expression "." identifier;
5458
function_call = prefix_expression [":" identifier] argument_list;
55-
argument_list = string | table | "(" [expression_list] ")";
59+
argument_list = "(" [expression_list] ")" | table | string;
5660
expression_list = expression {"," expression};
5761
5862
function_definition = "function" function_body;
5963
function_body = "(" [parameter_list] ")" [block] "end";
60-
parameter_list = vararg_expression | identifier_list ["," vararg_expression];
64+
parameter_list = identifier_list ["," vararg_expression] | vararg_expression;
6165
identifier_list = identifier {"," identifier};
6266
6367
vararg_expression = "...";
6468
6569
table = "{" [field_list] "}";
6670
field_list = field {field_separator field} [field_separator];
67-
field = expression | identifier "=" expression | "[" expression "]" "=" expression;
71+
field = "[" expression "]" "=" expression | identifier "=" expression | expression;
6872
field_separator = "," | ";";
6973
7074
binary_expression = expression binary_operator expression;
@@ -95,10 +99,6 @@ decimal_digit = ? decimal numeric character ?;
9599
96100
exponent = [("+" | "-") ,] decimal_digit {, decimal_digit};
97101
98-
boolean = "false" | "true";
99-
100-
nil = "nil";
101-
102102
identifier = (letter | "_") {, letter | decimal_digit | "_"};
103103
letter = ? case insensitive alphabetic character ?;
104104

grammar.js

Lines changed: 118 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -56,26 +56,24 @@ module.exports = grammar({
5656

5757
_statement: ($) =>
5858
choice(
59+
$.empty_statement,
60+
$.variable_assignment,
61+
$.scoped_variable_declaration,
62+
// conflict: $._statement and $._prefix_expression
63+
prec(1, $.function_call),
64+
$.label_statement,
65+
$.goto_statement,
66+
$.break_statement,
5967
$.do_statement,
68+
$.while_statement,
69+
$.repeat_statement,
6070
$.if_statement,
6171
$.for_numeric_statement,
6272
$.for_generic_statement,
63-
$.while_statement,
64-
$.repeat_statement,
65-
$.break_statement,
66-
$.label_statement,
67-
$.goto_statement,
68-
$.variable_assignment,
69-
$.scoped_variable_declaration,
7073
$.function_definition_statement,
7174
$.scoped_function_definition_statement,
72-
// conflict: $._statement and $._prefix_expression
73-
prec(1, $.function_call),
74-
$.empty_statement,
7575
),
7676

77-
empty_statement: () => ";",
78-
7977
scoped_function_definition_statement: ($) =>
8078
seq("local", "function", field("name", $.identifier), $._function_body),
8179

@@ -87,44 +85,6 @@ module.exports = grammar({
8785
optional(seq(":", field("method", $.identifier))),
8886
),
8987

90-
scoped_variable_declaration: ($) =>
91-
seq(
92-
"local",
93-
alias($.scoped_variable_list, $.variable_list),
94-
optional(seq("=", alias($.value_list, $.expression_list))),
95-
),
96-
scoped_variable_list: ($) =>
97-
_list(alias($.scoped_variable, $.variable), ","),
98-
scoped_variable: ($) =>
99-
seq(field("name", $.identifier), optional($.attribute)),
100-
attribute: ($) => seq("<", field("name", $.identifier), ">"),
101-
102-
variable_assignment: ($) =>
103-
seq($.variable_list, "=", alias($.value_list, $.expression_list)),
104-
variable_list: ($) => _list($.variable, ","),
105-
106-
goto_statement: ($) => seq("goto", field("name", $.identifier)),
107-
label_statement: ($) => seq("::", field("name", $.identifier), "::"),
108-
109-
break_statement: () => "break",
110-
111-
repeat_statement: ($) =>
112-
seq(
113-
"repeat",
114-
optional(field("body", $.block)),
115-
"until",
116-
field("condition", $._expression),
117-
),
118-
119-
while_statement: ($) =>
120-
seq(
121-
"while",
122-
field("condition", $._expression),
123-
"do",
124-
optional(field("body", $.block)),
125-
"end",
126-
),
127-
12888
for_generic_statement: ($) =>
12989
seq(
13090
"for",
@@ -171,8 +131,48 @@ module.exports = grammar({
171131
),
172132
else_clause: ($) => seq("else", optional(field("body", $.block))),
173133

134+
repeat_statement: ($) =>
135+
seq(
136+
"repeat",
137+
optional(field("body", $.block)),
138+
"until",
139+
field("condition", $._expression),
140+
),
141+
142+
while_statement: ($) =>
143+
seq(
144+
"while",
145+
field("condition", $._expression),
146+
"do",
147+
optional(field("body", $.block)),
148+
"end",
149+
),
150+
174151
do_statement: ($) => seq("do", optional(field("body", $.block)), "end"),
175152

153+
break_statement: () => "break",
154+
155+
goto_statement: ($) => seq("goto", field("name", $.identifier)),
156+
label_statement: ($) => seq("::", field("name", $.identifier), "::"),
157+
158+
scoped_variable_declaration: ($) =>
159+
seq(
160+
"local",
161+
alias($.scoped_variable_list, $.variable_list),
162+
optional(seq("=", alias($.value_list, $.expression_list))),
163+
),
164+
scoped_variable_list: ($) =>
165+
_list(alias($.scoped_variable, $.variable), ","),
166+
scoped_variable: ($) =>
167+
seq(field("name", $.identifier), optional($.attribute)),
168+
attribute: ($) => seq("<", field("name", $.identifier), ">"),
169+
170+
variable_assignment: ($) =>
171+
seq($.variable_list, "=", alias($.value_list, $.expression_list)),
172+
variable_list: ($) => _list($.variable, ","),
173+
174+
empty_statement: () => ";",
175+
176176
// expressions
177177
_expression: ($) =>
178178
choice(
@@ -181,80 +181,15 @@ module.exports = grammar({
181181
$.true,
182182
$.number,
183183
$.string,
184-
$.unary_expression,
185-
$.binary_expression,
186-
$.table,
187184
$.vararg_expression,
188185
$.function_definition,
189186
// conflict: $._expression and $.function_call
190187
prec(1, $._prefix_expression),
188+
$.table,
189+
$.unary_expression,
190+
$.binary_expression,
191191
),
192192

193-
_prefix_expression: ($) =>
194-
choice($.variable, $.function_call, $.parenthesized_expression),
195-
parenthesized_expression: ($) => seq("(", $._expression, ")"),
196-
variable: ($) =>
197-
choice(
198-
field("name", $.identifier),
199-
seq(
200-
field("table", $._prefix_expression),
201-
".",
202-
field("field", $.identifier),
203-
),
204-
seq(
205-
field("table", $._prefix_expression),
206-
"[",
207-
field("field", $._expression),
208-
"]",
209-
),
210-
),
211-
function_call: ($) =>
212-
seq(
213-
$._prefix_expression,
214-
optional(seq(":", field("method", $.identifier))),
215-
field("arguments", $.argument_list),
216-
),
217-
argument_list: ($) =>
218-
choice($.string, $.table, seq("(", optional($.expression_list), ")")),
219-
expression_list: ($) => _list($._expression, ","),
220-
221-
function_definition: ($) => seq("function", $._function_body),
222-
_function_body: ($) =>
223-
seq(
224-
"(",
225-
optional(field("parameters", $.parameter_list)),
226-
")",
227-
optional(field("body", $.block)),
228-
"end",
229-
),
230-
parameter_list: ($) =>
231-
choice(
232-
$.vararg_expression,
233-
seq(
234-
_list(field("name", $.identifier), ","),
235-
optional(seq(",", $.vararg_expression)),
236-
),
237-
),
238-
239-
vararg_expression: () => "...",
240-
241-
table: ($) => seq("{", optional($.field_list), "}"),
242-
field_list: ($) =>
243-
seq(_list($.field, $._field_separator), optional($._field_separator)),
244-
field: ($) =>
245-
choice(
246-
field("value", $._expression),
247-
seq(field("key", $.identifier), "=", field("value", $._expression)),
248-
seq(
249-
"[",
250-
field("key", $._expression),
251-
"]",
252-
"=",
253-
field("value", $._expression),
254-
),
255-
),
256-
_field_separator: () => choice(",", ";"),
257-
258193
binary_expression: ($) =>
259194
choice(
260195
...[
@@ -312,6 +247,71 @@ module.exports = grammar({
312247
),
313248
),
314249

250+
table: ($) => seq("{", optional($.field_list), "}"),
251+
field_list: ($) =>
252+
seq(_list($.field, $._field_separator), optional($._field_separator)),
253+
field: ($) =>
254+
choice(
255+
seq(
256+
"[",
257+
field("key", $._expression),
258+
"]",
259+
"=",
260+
field("value", $._expression),
261+
),
262+
seq(field("key", $.identifier), "=", field("value", $._expression)),
263+
field("value", $._expression),
264+
),
265+
_field_separator: () => choice(",", ";"),
266+
267+
_prefix_expression: ($) =>
268+
choice($.variable, $.function_call, $.parenthesized_expression),
269+
parenthesized_expression: ($) => seq("(", $._expression, ")"),
270+
function_call: ($) =>
271+
seq(
272+
$._prefix_expression,
273+
optional(seq(":", field("method", $.identifier))),
274+
field("arguments", $.argument_list),
275+
),
276+
argument_list: ($) =>
277+
choice(seq("(", optional($.expression_list), ")"), $.table, $.string),
278+
expression_list: ($) => _list($._expression, ","),
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),
292+
),
293+
),
294+
295+
function_definition: ($) => seq("function", $._function_body),
296+
_function_body: ($) =>
297+
seq(
298+
"(",
299+
optional(field("parameters", $.parameter_list)),
300+
")",
301+
optional(field("body", $.block)),
302+
"end",
303+
),
304+
parameter_list: ($) =>
305+
choice(
306+
seq(
307+
_list(field("name", $.identifier), ","),
308+
optional(seq(",", $.vararg_expression)),
309+
),
310+
$.vararg_expression,
311+
),
312+
313+
vararg_expression: () => "...",
314+
315315
string: ($) =>
316316
seq($._string_start, optional($._string_content), $._string_end),
317317

0 commit comments

Comments
 (0)