@@ -53,7 +53,7 @@ module.exports = grammar({
5353
5454 // statements
5555 return_statement : ( $ ) =>
56- seq ( "return" , optional ( $ . expression_list ) , optional ( $ . empty_statement ) ) ,
56+ seq ( "return" , field ( "value" , optional ( $ . expression_list ) ) , optional ( $ . empty_statement ) ) ,
5757
5858 statement : ( $ ) =>
5959 choice (
@@ -82,35 +82,27 @@ module.exports = grammar({
8282 "function" ,
8383 field (
8484 "name" ,
85- choice ( $ . identifier , alias ( $ . _table_function_variable , $ . variable ) ) ,
85+ alias ( $ . _function_name , $ . function_name ) ,
8686 ) ,
8787 $ . _function_body ,
8888 ) ,
89- _table_function_variable : ( $ ) =>
89+ _function_name : ( $ ) =>
9090 seq (
91- $ . _table_identifier ,
92- choice ( $ . _named_field_identifier , $ . _method_identifier ) ,
91+ choice ( $ . identifier , $ . _dotted_name ) ,
92+ optional ( $ . _method_identifier ) ,
9393 ) ,
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 ) ,
94+ _dotted_name : $ => seq ( $ . identifier , repeat1 ( seq ( "." , $ . identifier ) ) ) ,
10195
10296 for_generic_statement : ( $ ) =>
10397 seq (
10498 "for" ,
105- field ( "left" , alias ( $ . _name_list , $ . variable_list ) ) ,
99+ field ( "left" , _list ( $ . identifier , "," ) ) ,
106100 "in" ,
107- field ( "right" , alias ( $ . _value_list , $ . expression_list ) ) ,
101+ field ( "right" , _list ( $ . expression , "," ) ) ,
108102 "do" ,
109103 optional ( field ( "body" , $ . block ) ) ,
110104 "end" ,
111105 ) ,
112- _name_list : ( $ ) => _list ( field ( "name" , $ . identifier ) , "," ) ,
113- _value_list : ( $ ) => _list ( field ( "value" , $ . expression ) , "," ) ,
114106
115107 for_numeric_statement : ( $ ) =>
116108 seq (
@@ -172,18 +164,21 @@ module.exports = grammar({
172164 local_variable_declaration : ( $ ) =>
173165 seq (
174166 "local" ,
175- alias ( $ . _local_variable_list , $ . variable_list ) ,
176- optional ( seq ( "=" , alias ( $ . _value_list , $ . expression_list ) ) ) ,
167+ field ( "variables" , _list ( $ . variable , "," ) ) ,
168+ optional ( seq ( "=" , field ( "values" , _list ( $ . expression , "," ) ) ) ) ,
169+ ) ,
170+ variable : ( $ ) =>
171+ seq (
172+ field ( "name" , $ . identifier ) ,
173+ optional ( seq ( "<" , field ( "attribute" , $ . identifier ) , ">" ) )
177174 ) ,
178- _local_variable_list : ( $ ) =>
179- _list ( alias ( $ . _local_variable , $ . variable ) , "," ) ,
180- _local_variable : ( $ ) =>
181- seq ( field ( "name" , $ . identifier ) , optional ( $ . attribute ) ) ,
182- attribute : ( $ ) => seq ( "<" , field ( "name" , $ . identifier ) , ">" ) ,
183175
184176 variable_assignment : ( $ ) =>
185- seq ( $ . variable_list , "=" , alias ( $ . _value_list , $ . expression_list ) ) ,
186- variable_list : ( $ ) => _list ( $ . variable , "," ) ,
177+ seq (
178+ field ( "assignee" , _list ( $ . _variable , "," ) ) ,
179+ "=" ,
180+ field ( "value" , _list ( $ . expression , "," ) )
181+ ) ,
187182
188183 empty_statement : ( ) => ";" ,
189184
@@ -278,47 +273,39 @@ module.exports = grammar({
278273 ) ,
279274 field_separator : ( ) => choice ( "," , ";" ) ,
280275
281- prefix : ( $ ) => choice ( $ . variable , $ . call , $ . parenthesized_expression ) ,
276+ prefix : ( $ ) => choice ( $ . identifier , $ . call , $ . parenthesized_expression , $ . subscript , $ . member_access ) ,
282277 prefix_expression : ( $ ) => $ . prefix ,
283278 _prefix_expression : ( $ ) => prec ( PREC . CALL , $ . prefix ) ,
284279
285280 parenthesized_expression : ( $ ) => seq ( "(" , $ . expression , ")" ) ,
286281
287282 call : ( $ ) =>
288283 seq (
289- field (
290- "function" ,
291- choice (
292- $ . _prefix_expression ,
293- alias ( $ . _table_method_variable , $ . variable ) ,
294- ) ,
295- ) ,
296- field ( "arguments" , $ . argument_list ) ,
284+ field ( "function" , choice ( $ . _prefix_expression , $ . method_reference ) ) ,
285+ field ( "arguments" , choice ( $ . argument_list , $ . table , $ . string ) ) ,
297286 ) ,
298- _table_method_variable : ( $ ) =>
299- seq ( field ( "table" , $ . prefix_expression ) , $ . _method_identifier ) ,
287+ method_reference : $ => seq (
288+ $ . _prefix_expression ,
289+ $ . _method_identifier ,
290+ ) ,
300291 _method_identifier : ( $ ) => seq ( ":" , field ( "method" , $ . identifier ) ) ,
301292 argument_list : ( $ ) =>
302- choice ( seq ( "(" , optional ( $ . expression_list ) , ")" ) , $ . table , $ . string ) ,
293+ seq ( "(" , optional ( $ . expression_list ) , ")" ) ,
303294 expression_list : ( $ ) => _list ( $ . expression , "," ) ,
304295
305- variable : ( $ ) => choice ( field ( "name" , $ . identifier ) , $ . _table_variable ) ,
306- _table_variable : ( $ ) =>
296+ _variable : ( $ ) => choice ( $ . identifier , $ . member_access , $ . subscript ) ,
297+ member_access : $ => seq (
298+ field ( "subject" , $ . prefix ) ,
299+ "." ,
300+ field ( "member" , $ . identifier )
301+ ) ,
302+ subscript : ( $ ) =>
307303 seq (
308- field (
309- "table" ,
310- choice (
311- $ . identifier ,
312- alias ( $ . _table_variable , $ . variable ) ,
313- $ . call ,
314- $ . parenthesized_expression ,
315- ) ,
316- ) ,
317- choice ( $ . _indexed_field_identifier , $ . _named_field_identifier ) ,
304+ field ( "subject" , $ . prefix ) ,
305+ "[" ,
306+ field ( "subscript" , $ . expression ) ,
307+ "]"
318308 ) ,
319- _named_field_identifier : ( $ ) => seq ( "." , field ( "field" , $ . identifier ) ) ,
320- _indexed_field_identifier : ( $ ) =>
321- seq ( "[" , field ( "field" , $ . expression ) , "]" ) ,
322309
323310 function_definition : ( $ ) => seq ( "function" , $ . _function_body ) ,
324311 _function_body : ( $ ) =>
@@ -332,7 +319,7 @@ module.exports = grammar({
332319 parameter_list : ( $ ) =>
333320 choice (
334321 seq (
335- _list ( field ( "name" , $ . identifier ) , "," ) ,
322+ _list ( $ . identifier , "," ) ,
336323 optional ( seq ( "," , $ . vararg_expression ) ) ,
337324 ) ,
338325 $ . vararg_expression ,
0 commit comments