2525
2626start : nls ? package_clause eos (import_decl eos )* ((function_decl | method_decl | declaration ) eos )*
2727
28- package_clause : " package " nls ? NAME
28+ package_clause : package_token NAME
2929
30- import_decl : " import " nls ? (import_spec | " ( " nls ? ((import_spec eos )* import_spec eos ? )? " )" )
30+ import_decl : import_token (import_spec | lparen_token ((import_spec eos )* import_spec eos ? )? " )" )
3131
32- import_spec : (" . " nls ? | NAME )? import_path
32+ import_spec : (dot_token | NAME )? import_path
3333
3434import_path : string_
3535
3636declaration : const_decl | type_decl | var_decl
3737
38- const_decl : " const " nls ? (const_spec | " ( " nls ? ((const_spec eos )* const_spec eos ? )? " )" )
38+ const_decl : const_token (const_spec | lparen_token ((const_spec eos )* const_spec eos ? )? " )" )
3939
40- const_spec : (identifier_list | NAME ) (type_ ? " = " nls ? expression_list )?
40+ const_spec : (identifier_list | NAME ) (type_ ? equal_token expression_list )?
4141
42- identifier_list : NAME (" , " nls ? NAME )+
42+ identifier_list : NAME (comma_token NAME )+
4343
44- expression_list : expression (" , " nls ? expression )*
44+ expression_list : expression (comma_token expression )*
4545
46- type_decl : " type " nls ? (type_spec | " ( " nls ? ((type_spec eos )* type_spec eos ? )? " )" )
46+ type_decl : type_token (type_spec | lparen_token ((type_spec eos )* type_spec eos ? )? " )" )
4747
4848type_spec : alias_decl | type_def
4949
50- alias_decl : NAME " = " nls ? type_
50+ alias_decl : NAME equal_token type_
5151
5252type_def : NAME type_parameters ? type_
5353
54- type_parameters : " [ " nls ? type_parameter_decl (" , " nls ? type_parameter_decl )* " ]"
54+ type_parameters : lsqrb_token type_parameter_decl (comma_token type_parameter_decl )* " ]"
5555
5656type_parameter_decl : (identifier_list | NAME ) type_element
5757
58- type_element : type_term (" | " nls ? type_term )*
58+ type_element : type_term (or_token type_term )*
5959
60- type_term : ( " ~ " nls ? ) ? type_
60+ type_term : tilde_token ? type_
6161
6262// Function declarations
6363
64- function_decl : " func " nls ? NAME type_parameters ? signature block ?
64+ function_decl : func_token NAME type_parameters ? signature block ?
6565// eof: "}" // This indicates end of function body
6666
67- method_decl : " func " nls ? receiver NAME signature block ?
67+ method_decl : func_token receiver NAME signature block ?
6868
6969receiver : parameters
7070
71- var_decl : " var " nls ? (var_spec | " ( " nls ? ((var_spec eos )* var_spec eos ? )? " )" )
71+ var_decl : var_token (var_spec | lparen_token ((var_spec eos )* var_spec eos ? )? " )" )
7272
73- var_spec : (identifier_list | NAME ) (type_ (" = " nls ? expression_list )? | " = " nls ? expression_list )
73+ var_spec : (identifier_list | NAME ) (type_ (equal_token expression_list )? | equal_token expression_list )
7474
75- block : " { " nls ? ((statement ? eos )* statement ? eos ? )? " }"
75+ block : lbrace_token ((statement ? eos )* statement ? eos ? )? " }"
7676
7777// statement_list: (statement? eos)* statement
7878
7979statement : declaration | labeled_stmt | simple_stmt | go_stmt | return_stmt | break_stmt | continue_stmt | goto_stmt | fallthrough_stmt | block | if_stmt | switch_stmt | select_stmt | for_stmt | defer_stmt
8080
8181simple_stmt : send_stmt | inc_dec_stmt | assignment | expression | short_var_decl
8282
83- send_stmt : expression " <- " nls ? expression
83+ send_stmt : expression receive_token expression
8484
8585inc_dec_stmt : expression (" ++" | " --" )
8686
87- assignment : expression assign_op nls ? expression | expression_list " = " nls ? expression_list
87+ assignment : expression assign_op nls ? expression | expression_list equal_token expression_list
8888
8989assign_op : " +=" | " -=" | " |=" | " ^=" | " *=" | " /=" | " %=" | " <<=" | " >>=" | " &=" | " &^="
9090
91- short_var_decl : expression_list " := " nls ? expression_list
91+ short_var_decl : expression_list def_token expression_list
9292
93- labeled_stmt : NAME " : "
93+ labeled_stmt : NAME colon_token
9494
9595return_stmt : " return" expression_list ?
9696
9797break_stmt : " break" NAME ?
9898
9999continue_stmt : " continue" NAME ?
100100
101- goto_stmt : " goto " nls ? NAME
101+ goto_stmt : goto_token NAME
102102
103103fallthrough_stmt : " fallthrough"
104104
105- defer_stmt : " defer " nls ? expression
105+ defer_stmt : defer_token expression
106106
107- if_stmt : " if " nls ? (simple_stmt ? eos )? expression block (" else " nls ? (if_stmt | block ))?
107+ if_stmt : if_token (simple_stmt ? eos )? expression block (else_token (if_stmt | block ))?
108108
109109switch_stmt : expr_switch_stmt | type_switch_stmt
110110
111- expr_switch_stmt : " switch " nls ? (simple_stmt ? eos )? expression ? " { " nls ? ((expr_case_clause | statement ? eos )* (expr_case_clause | statement ? eos ? ))? " }"
111+ expr_switch_stmt : switch_token (simple_stmt ? eos )? expression ? lbrace_token ((expr_case_clause | statement ? eos )* (expr_case_clause | statement ? eos ? ))? " }"
112112
113- expr_case_clause : expr_switch_case " : " nls ?
113+ expr_case_clause : expr_switch_case colon_token
114114
115- expr_switch_case : " case " nls ? expression_list | " default " nls ?
115+ expr_switch_case : case_token expression_list | default_token
116116
117- type_switch_stmt : " switch " nls ? (simple_stmt ? eos )? type_switch_guard " { " nls ? ((type_case_clause | statement ? eos )* (type_case_clause | statement ? eos ? ))? " }"
117+ type_switch_stmt : switch_token (simple_stmt ? eos )? type_switch_guard lbrace_token ((type_case_clause | statement ? eos )* (type_case_clause | statement ? eos ? ))? " }"
118118
119119// type_switch_guard: (NAME ":=")? primary_expr "." "(" "type" ")"
120- type_switch_guard : (NAME " := " nls ? )? NAME " . " nls ? " ( " nls ? " type " nls ? " )"
120+ type_switch_guard : (NAME def_token )? NAME dot_token lparen_token type_token " )"
121121
122- type_case_clause : type_switch_case " : " nls ?
122+ type_case_clause : type_switch_case colon_token
123123
124- type_switch_case : " case " nls ? type_list | " default " nls ?
124+ type_switch_case : case_token type_list | default_token
125125
126- type_list : type_ (" , " nls ? type_ )*
126+ type_list : type_ (comma_token type_ )*
127127
128- select_stmt : " select " nls ? " { " nls ? ((comm_clause | statement ? eos )* (comm_clause | statement ? eos ? ))? " }"
128+ select_stmt : select_token lbrace_token ((comm_clause | statement ? eos )* (comm_clause | statement ? eos ? ))? " }"
129129
130- comm_clause : comm_case " : " nls ?
130+ comm_clause : comm_case colon_token
131131
132- comm_case : " case " nls ? (send_stmt | recv_stmt ) | " default " nls ?
132+ comm_case : case_token (send_stmt | recv_stmt ) | default_token
133133
134- recv_stmt : (expression_list " = " nls ? | (identifier_list | NAME ) " := " nls ? )? expression
134+ recv_stmt : (expression_list equal_token | (identifier_list | NAME ) def_token )? expression
135135
136- for_stmt : " for " nls ? [for_clause ] block
136+ for_stmt : for_token [for_clause ] block
137137
138138for_clause : simple_stmt (eos expression eos simple_stmt )? | range_clause
139139
140- range_clause : (expression_list " = " nls ? | expression_list " := " nls ? ) " range " nls ? expression
140+ range_clause : (expression_list equal_token | expression_list def_token ) range_token expression
141141
142- go_stmt : " go " nls ? expression
142+ go_stmt : go_token expression
143143
144- type_ : literal_type | (var_or_type_name | NAME ) type_args ? | " ( " nls ? type_ " )"
144+ type_ : pointer_type | function_type | interface_type | channel_type | literal_type | (var_or_type_name | NAME ) type_args ? | lparen_token type_ " )"
145145
146146// type_lit: array_type | struct_type | pointer_type | function_type | interface_type | slice_type | map_type | channel_type
147147
148148type_args : " --"
149149// type_args: "[" nls? type_list ("," nls?)? "]" // This is useful for Golng gen
150150
151- var_or_type_name : NAME " . " nls ? NAME | NAME " . " nls ? " ( " nls ? type_ " )"
151+ var_or_type_name : NAME dot_token NAME | NAME dot_token lparen_token type_ " )"
152152
153- array_type : " [ " nls ? array_length " ]" element_type
153+ array_type : lsqrb_token array_length " ]" element_type
154154
155155array_length : expression
156156
157157element_type : type_
158158
159- pointer_type : " * " nls ? type_
159+ pointer_type . 2 : star_token type_
160160
161- interface_type : " interface " nls ? " { " nls ? (((method_spec | type_element ) eos )* (method_spec | type_element ) eos ? )? " }"
161+ interface_type : interface_token lbrace_token (((method_spec | type_element ) eos )* (method_spec | type_element ) eos ? )? " }"
162162
163- slice_type : " [ " nls ? " ]" element_type
163+ slice_type : lsqrb_token " ]" element_type
164164
165165// It's possible to replace `type` with more restricted type_lit list and also pay attention to nil maps
166- map_type : " map " nls ? " [ " nls ? type_ " ]" element_type
166+ map_type : map_token lsqrb_token type_ " ]" element_type
167167
168- channel_type : (" chan" | " chan" nls ? " <-" | " <-" nls ? " chan" ) nls ? element_type
168+ channel_type : (channel_token | channel_prefix ) element_type
169+
170+ channel_prefix .2 : channel_token receive_token | receive_token channel_token
169171
170172method_spec : NAME signature
171173
172- function_type : " func " nls ? signature
174+ function_type : func_token signature
173175
174176signature : parameters result ?
175177
176178result : parameters | type_
177179
178- parameters : " ( " nls ? parameter_decl (" , " nls ? parameter_decl )* ( " , " nls ? ) ? " )" | " ( " nls ? " )"
180+ parameters : lparen_token parameter_decl (comma_token parameter_decl )* comma_token ? " )" | lparen_token " )"
179181
180182// a comma-separated list of either (a) name, (b) type, or (c) name and type
181183// https://groups.google.com/g/golang-nuts/c/jVjbH2-emMQ/m/UdZlSNhd3DwJ
182184// parameter_decl: identifier_list? "..."? type_
183185// parameter_decl: (NAME | "..."? type_ | NAME type_)
184186
185187// Although following is overapproximate it's an easy way to avoid reduce/reduce conflicts
186- parameter_decl : (type_ | ( " ... " nls ? ) ? type_ | NAME type_ )
188+ parameter_decl : (type_ | dots_token ? type_ | NAME type_ )
187189
188190
189191expression : primary_expr
190- | (" +" | " -" | " !" | " ^" | " *" | " &" | " <-" ) nls ? expression
191- | expression (" *" | " /" | " %" | " <<" | " >>" | " &" | " &^" ) nls ? expression
192- | expression (" +" | " -" | " |" | " ^" ) nls ? expression
193- | expression (" ==" | " !=" | " <" | " <=" | " >" | " >=" ) nls ? expression
194- | expression " &&" nls ? expression
195- | expression " ||" nls ? expression
192+ | (" !" nls ? | prefix_op nls ? | star_token | receive_token ) expression
193+ | expression (prefix_op nls ? | infix_op nls ? | star_token | or_token ) expression
194+
195+ prefix_op : " +" | " -" | " ^" | " &"
196+ infix_op : " /" | " %" | " <<" | " >>" | " &^" | " ==" | " !=" | " <" | " <=" | " >" | " >=" | " &&" | " ||"
196197
197- primary_expr : operand | primary_expr (" . " nls ? (NAME | " ( " nls ? type_ " )" ) | index | slice_ | arguments )
198+ primary_expr : operand | primary_expr (dot_token (NAME | lparen_token type_ " )" ) | index | slice_ | arguments )
198199
199200// conversion is not needed since a method call has includes this syntax
200201// conversion: type_ "(" expression ","? ")"
201202
202203// Giving operand higher precedence than type_ is a hack to avoid reduce/reduce conflicts
203- operand : literal | type_ | " ( " expression " )" // removed NAME type_args?
204+ operand : literal | type_ | lparen_token expression " )" // removed NAME type_args?
204205
205206literal : basic_lit | composite_lit | function_lit
206207
@@ -212,25 +213,25 @@ integer: DECIMAL_LIT | BINARY_LIT | OCTAL_LIT | HEX_LIT
212213DECIMAL_LIT : / 0| [1-9 ]\d * / i
213214HEX_LIT .2 : / 0x[\d a-f ]* / i
214215OCTAL_LIT .2 : / 0o[0-7 ]* / i
215- BINARY_LIT .2 : / 0b[0-1 ]* / i
216+ BINARY_LIT .2 : / 0b[0-1 ]* / i
216217FLOAT_LIT .2 : / (( \d + \. \d * | \. \d + ) ( e[-+ ]? \d + ) ? | \d + ( e[-+ ]? \d + )) / i
217218CHAR_LIT : / '/ (/ [^ ' \\ ]/ | ESCAPED_VALUE ) / '/
218219
219220composite_lit : literal_type literal_value
220221
221- literal_type : struct_type | array_type | " [ " nls ? " ... " nls ? " ]" element_type | slice_type | map_type | " interface " nls ? " { " nls ? " } "
222+ literal_type : struct_type | array_type | lsqrb_token dots_token " ]" element_type | slice_type | map_type
222223
223- literal_value : " { " nls ? (element_list ( " , " nls ? ) ? )? " }"
224+ literal_value : lbrace_token (element_list comma_token ? )? " }"
224225
225- element_list : keyed_element (" , " nls ? keyed_element )*
226+ element_list : keyed_element (comma_token keyed_element )*
226227
227- keyed_element : (key " : " nls ? )? element
228+ keyed_element : (key colon_token )? element
228229
229230key : expression | literal_value
230231
231232element : expression | literal_value
232233
233- struct_type : " struct " nls ? " { " nls ? ((field_decl eos )* field_decl eos ? )? " }"
234+ struct_type : struct_token lbrace_token ((field_decl eos )* field_decl eos ? )? " }"
234235
235236field_decl : ((identifier_list | NAME ) type_ | embedded_field ) string_ ?
236237
@@ -244,30 +245,65 @@ INTERPRETED_STRING_LIT: /"/ (/[^"\\]/ | ESCAPED_VALUE)* /"/
244245
245246ESCAPED_VALUE : / \\ ( u[0-9a-fA-F ]{4} | U[0-9a-fA-F ]{8} | [abfnrtv \\ '" ]| [0-7 ]{3} | x[0-9a-fA-F ]{2} ) /
246247
247- embedded_field : ( " * " nls ? ) ? (NAME " . " nls ? NAME | NAME ) type_args ?
248+ embedded_field : star_token ? (NAME dot_token NAME | NAME ) type_args ?
248249
249- function_lit : " func " nls ? signature block // function
250+ function_lit : func_token signature block // function
250251
251- index : " [ " nls ? expression ( " , " nls ? ) ? " ]"
252+ index : lsqrb_token expression comma_token ? " ]"
252253
253- slice_ : " [ " nls ? ( expression ? " : " nls ? expression ? | expression ? " : " nls ? expression " : " nls ? expression ) " ]"
254+ slice_ : lsqrb_token ( expression ? colon_token expression ? | expression ? colon_token expression colon_token expression ) " ]"
254255
255- type_assertion : " . " nls ? " ( " nls ? type_ " )"
256+ type_assertion : dot_token lparen_token type_ " )"
256257
257258// arguments: "(" ( (expression_list | type_ ("," expression_list)?) "..."? ","?)? ")"
258- arguments : " ( " nls ? ( expression_list ? ( " ... " nls ? ) ? ( " , " nls ? ) ? )? " )"
259+ arguments : lparen_token ( expression_list ? dots_token ? comma_token ? )? " )"
259260// method_expr: type_ "." NAME
260261
262+ lparen_token : " (" nls ?
263+ dot_token : " ." nls ?
264+ lsqrb_token : " [" nls ?
265+ comma_token : " ," nls ?
266+ dots_token : " ..." nls ?
267+ package_token : " package" nls ?
268+ import_token : " import" nls ?
269+ const_token : " const" nls ?
270+ equal_token : " =" nls ?
271+ type_token : " type" nls ?
272+ or_token : " |" nls ?
273+ tilde_token : " ~" nls ?
274+ func_token : " func" nls ?
275+ var_token : " var" nls ?
276+ lbrace_token : " {" nls ?
277+ receive_token : " <-" nls ?
278+ def_token : " :=" nls ?
279+ colon_token : " :" nls ?
280+ channel_token : " chan" nls ?
281+ goto_token : " goto" nls ?
282+ defer_token : " defer" nls ?
283+ if_token : " if" nls ?
284+ else_token : " else" nls ?
285+ switch_token : " switch" nls ?
286+ case_token : " case" nls ?
287+ default_token : " default" nls ?
288+ for_token : " for" nls ?
289+ select_token : " select" nls ?
290+ range_token : " range" nls ?
291+ go_token : " go" nls ?
292+ star_token : " *" nls ?
293+ interface_token : " interface" nls ?
294+ map_token : " map" nls ?
295+ struct_token : " struct" nls ?
296+
261297eos : semi | nls
262298semi : " ;" NL *
263299nls : NL +
264300
265301NAME : / [a-zA-Z_ ]\w * /
266302
267303COMMENT : / \/\/ [^ \n ]* \n /
268- NL : COMMENT | / ( \r ? \n [\t ]* ) + / | / \/\* [^ \n ]* \n . *? \* \// s
304+ NL : COMMENT | / ( \r ? \n [\t ]* ) + / | / \/\* [^ \n ]* \n ( \* + [ ^ * \/ ] | [ ^ * ] ) * \* + \/ / s
269305
270306// %import common.WS_INLINE
271307// %ignore WS_INLINE
272- IGNORED : / [\t ]/ | / \/\* [ ^ \n ] *? \* \//
308+ IGNORED : / [\t ]/ | / \/\* ( \* + [ ^ * \/\n ] | [ ^ * \n ] ) * \* + \/ /
273309%ignore IGNORED
0 commit comments