@@ -11,6 +11,7 @@ const PREC = {
1111 MULTIPLICATIVE : 10 , // "*" "/" "//" "%"
1212 UNARY : 11 , // "not" "#" "-" "~"
1313 POWER : 12 , // "^"
14+ CALL : 13 ,
1415} ;
1516
1617const 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