@@ -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