@@ -73,78 +73,101 @@ module.exports = grammar({
7373 empty_statement : ( ) => ";" ,
7474
7575 scoped_function_definition_statement : ( $ ) =>
76- seq ( "local" , "function" , $ . identifier , $ . _function_body ) ,
76+ seq ( "local" , "function" , field ( "name" , $ . identifier ) , $ . _function_body ) ,
7777
7878 function_definition_statement : ( $ ) =>
79- seq ( "function" , $ . function_identifier , $ . _function_body ) ,
79+ seq ( "function" , field ( "name" , $ . function_identifier ) , $ . _function_body ) ,
8080 function_identifier : ( $ ) =>
81- seq ( _list ( $ . identifier , "." ) , optional ( seq ( ":" , $ . identifier ) ) ) ,
81+ seq (
82+ _list ( $ . identifier , "." ) ,
83+ optional ( seq ( ":" , field ( "method" , $ . identifier ) ) ) ,
84+ ) ,
8285
8386 scoped_variable_declaration : ( $ ) =>
8487 seq (
8588 "local" ,
8689 alias ( $ . scoped_variable_list , $ . variable_list ) ,
87- optional ( seq ( "=" , $ . expression_list ) ) ,
90+ optional ( seq ( "=" , alias ( $ . value_list , $ . expression_list ) ) ) ,
8891 ) ,
89- scoped_variable_list : ( $ ) => _list ( $ . scoped_variable , "," ) ,
90- scoped_variable : ( $ ) => seq ( $ . identifier , optional ( $ . attribute ) ) ,
91- attribute : ( $ ) => seq ( "<" , $ . identifier , ">" ) ,
92-
93- variable_assignment : ( $ ) => seq ( $ . variable_list , "=" , $ . expression_list ) ,
92+ scoped_variable_list : ( $ ) =>
93+ _list ( alias ( $ . scoped_variable , $ . variable ) , "," ) ,
94+ scoped_variable : ( $ ) =>
95+ seq ( field ( "name" , $ . identifier ) , optional ( $ . attribute ) ) ,
96+ attribute : ( $ ) => seq ( "<" , field ( "name" , $ . identifier ) , ">" ) ,
97+
98+ variable_assignment : ( $ ) =>
99+ seq ( $ . variable_list , "=" , alias ( $ . value_list , $ . expression_list ) ) ,
94100 variable_list : ( $ ) => _list ( $ . variable , "," ) ,
95101
96- goto_statement : ( $ ) => seq ( "goto" , $ . identifier ) ,
97- label_statement : ( $ ) => seq ( "::" , $ . identifier , "::" ) ,
102+ goto_statement : ( $ ) => seq ( "goto" , field ( "name" , $ . identifier ) ) ,
103+ label_statement : ( $ ) => seq ( "::" , field ( "name" , $ . identifier ) , "::" ) ,
98104
99105 break_statement : ( ) => "break" ,
100106
101107 repeat_statement : ( $ ) =>
102- seq ( "repeat" , optional ( $ . block ) , "until" , $ . _expression ) ,
108+ seq (
109+ "repeat" ,
110+ optional ( field ( "body" , $ . block ) ) ,
111+ "until" ,
112+ field ( "condition" , $ . _expression ) ,
113+ ) ,
103114
104115 while_statement : ( $ ) =>
105- seq ( "while" , $ . _expression , "do" , optional ( $ . block ) , "end" ) ,
116+ seq (
117+ "while" ,
118+ field ( "condition" , $ . _expression ) ,
119+ "do" ,
120+ optional ( field ( "body" , $ . block ) ) ,
121+ "end" ,
122+ ) ,
106123
107124 for_generic_statement : ( $ ) =>
108125 seq (
109126 "for" ,
110- alias ( $ . identifier_list , $ . variable_list ) ,
127+ field ( "left" , alias ( $ . name_list , $ . variable_list ) ) ,
111128 "in" ,
112- $ . expression_list ,
129+ field ( "right" , alias ( $ . value_list , $ . expression_list ) ) ,
113130 "do" ,
114- optional ( $ . block ) ,
131+ optional ( field ( "body" , $ . block ) ) ,
115132 "end" ,
116133 ) ,
117- identifier_list : ( $ ) => _list ( $ . identifier , "," ) ,
134+ name_list : ( $ ) => _list ( field ( "name" , $ . identifier ) , "," ) ,
135+ value_list : ( $ ) => _list ( field ( "value" , $ . _expression ) , "," ) ,
118136
119137 for_numeric_statement : ( $ ) =>
120138 seq (
121139 "for" ,
122- $ . identifier ,
140+ field ( "name" , $ . identifier ) ,
123141 "=" ,
124- $ . _expression ,
142+ field ( "start" , $ . _expression ) ,
125143 "," ,
126- $ . _expression ,
127- optional ( seq ( "," , $ . _expression ) ) ,
144+ field ( "end" , $ . _expression ) ,
145+ optional ( seq ( "," , field ( "step" , $ . _expression ) ) ) ,
128146 "do" ,
129- optional ( $ . block ) ,
147+ optional ( field ( "body" , $ . block ) ) ,
130148 "end" ,
131149 ) ,
132150
133151 if_statement : ( $ ) =>
134152 seq (
135153 "if" ,
136- $ . _expression ,
154+ field ( "condition" , $ . _expression ) ,
137155 "then" ,
138- optional ( $ . block ) ,
139- repeat ( $ . elseif_clause ) ,
140- optional ( $ . else_clause ) ,
156+ optional ( field ( "consequence" , $ . block ) ) ,
157+ repeat ( field ( "alternative" , $ . elseif_clause ) ) ,
158+ optional ( field ( "alternative" , $ . else_clause ) ) ,
141159 "end" ,
142160 ) ,
143161 elseif_clause : ( $ ) =>
144- seq ( "elseif" , $ . _expression , "then" , optional ( $ . block ) ) ,
145- else_clause : ( $ ) => seq ( "else" , optional ( $ . block ) ) ,
162+ seq (
163+ "elseif" ,
164+ field ( "condition" , $ . _expression ) ,
165+ "then" ,
166+ optional ( field ( "consequence" , $ . block ) ) ,
167+ ) ,
168+ else_clause : ( $ ) => seq ( "else" , optional ( field ( "body" , $ . block ) ) ) ,
146169
147- do_statement : ( $ ) => seq ( "do" , optional ( $ . block ) , "end" ) ,
170+ do_statement : ( $ ) => seq ( "do" , optional ( field ( "body" , $ . block ) ) , "end" ) ,
148171
149172 // expressions
150173 _expression : ( $ ) =>
@@ -167,27 +190,45 @@ module.exports = grammar({
167190 parenthesized_expression : ( $ ) => seq ( "(" , $ . _expression , ")" ) ,
168191 variable : ( $ ) =>
169192 choice (
170- $ . identifier ,
171- seq ( $ . _prefix_expression , "." , $ . identifier ) ,
172- seq ( $ . _prefix_expression , "[" , $ . _expression , "]" ) ,
193+ field ( "name" , $ . identifier ) ,
194+ seq (
195+ field ( "table" , $ . _prefix_expression ) ,
196+ "." ,
197+ field ( "field" , $ . identifier ) ,
198+ ) ,
199+ seq (
200+ field ( "table" , $ . _prefix_expression ) ,
201+ "[" ,
202+ field ( "field" , $ . _expression ) ,
203+ "]" ,
204+ ) ,
173205 ) ,
174206 function_call : ( $ ) =>
175207 seq (
176208 $ . _prefix_expression ,
177- optional ( seq ( ":" , $ . identifier ) ) ,
178- $ . argument_list ,
209+ optional ( seq ( ":" , field ( "method" , $ . identifier ) ) ) ,
210+ field ( "arguments" , $ . argument_list ) ,
179211 ) ,
180212 argument_list : ( $ ) =>
181213 choice ( $ . string , $ . table , seq ( "(" , optional ( $ . expression_list ) , ")" ) ) ,
182214 expression_list : ( $ ) => _list ( $ . _expression , "," ) ,
183215
184216 function_definition : ( $ ) => seq ( "function" , $ . _function_body ) ,
185217 _function_body : ( $ ) =>
186- seq ( "(" , optional ( $ . parameter_list ) , ")" , optional ( $ . block ) , "end" ) ,
218+ seq (
219+ "(" ,
220+ optional ( field ( "parameters" , $ . parameter_list ) ) ,
221+ ")" ,
222+ optional ( field ( "body" , $ . block ) ) ,
223+ "end" ,
224+ ) ,
187225 parameter_list : ( $ ) =>
188226 choice (
189227 $ . vararg_expression ,
190- seq ( _list ( $ . identifier , "," ) , optional ( seq ( "," , $ . vararg_expression ) ) ) ,
228+ seq (
229+ _list ( field ( "name" , $ . identifier ) , "," ) ,
230+ optional ( seq ( "," , $ . vararg_expression ) ) ,
231+ ) ,
191232 ) ,
192233
193234 vararg_expression : ( ) => "..." ,
@@ -197,9 +238,15 @@ module.exports = grammar({
197238 seq ( _list ( $ . field , $ . _field_separator ) , optional ( $ . _field_separator ) ) ,
198239 field : ( $ ) =>
199240 choice (
200- $ . _expression ,
201- seq ( $ . identifier , "=" , $ . _expression ) ,
202- seq ( "[" , $ . _expression , "]" , "=" , $ . _expression ) ,
241+ field ( "value" , $ . _expression ) ,
242+ seq ( field ( "key" , $ . identifier ) , "=" , field ( "value" , $ . _expression ) ) ,
243+ seq (
244+ "[" ,
245+ field ( "key" , $ . _expression ) ,
246+ "]" ,
247+ "=" ,
248+ field ( "value" , $ . _expression ) ,
249+ ) ,
203250 ) ,
204251 _field_separator : ( ) => choice ( "," , ";" ) ,
205252
@@ -226,20 +273,37 @@ module.exports = grammar({
226273 [ "//" , PREC . MULTIPLICATIVE ] ,
227274 [ "%" , PREC . MULTIPLICATIVE ] ,
228275 ] . map ( ( [ operator , priority ] ) =>
229- prec . left ( priority , seq ( $ . _expression , operator , $ . _expression ) ) ,
276+ prec . left (
277+ priority ,
278+ seq (
279+ field ( "left" , $ . _expression ) ,
280+ field ( "operator" , operator ) ,
281+ field ( "right" , $ . _expression ) ,
282+ ) ,
283+ ) ,
230284 ) ,
231285 ...[
232286 [ ".." , PREC . CONCATENATION ] ,
233287 [ "^" , PREC . POWER ] ,
234288 ] . map ( ( [ operator , priority ] ) =>
235- prec . right ( priority , seq ( $ . _expression , operator , $ . _expression ) ) ,
289+ prec . right (
290+ priority ,
291+ seq (
292+ field ( "left" , $ . _expression ) ,
293+ field ( "operator" , operator ) ,
294+ field ( "right" , $ . _expression ) ,
295+ ) ,
296+ ) ,
236297 ) ,
237298 ) ,
238299
239300 unary_expression : ( $ ) =>
240301 choice (
241302 ...[ "not" , "#" , "-" , "~" ] . map ( ( operator ) =>
242- prec . left ( PREC . UNARY , seq ( operator , $ . _expression ) ) ,
303+ prec . left (
304+ PREC . UNARY ,
305+ seq ( field ( "operator" , operator ) , field ( "argument" , $ . _expression ) ) ,
306+ ) ,
243307 ) ,
244308 ) ,
245309
0 commit comments