Skip to content

Commit 37a9f69

Browse files
authored
Merge pull request #232 from Gompyn/patch-5
Replace `"str" nls?` with separate tokens
2 parents ed4ceb6 + c8d1364 commit 37a9f69

File tree

1 file changed

+108
-72
lines changed

1 file changed

+108
-72
lines changed

syncode/parsers/grammars/go.lark

Lines changed: 108 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -25,182 +25,183 @@
2525

2626
start: 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

3434
import_path: string_
3535

3636
declaration: 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

4848
type_spec: alias_decl | type_def
4949

50-
alias_decl : NAME "=" nls? type_
50+
alias_decl : NAME equal_token type_
5151

5252
type_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

5656
type_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

6969
receiver: 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

7979
statement: 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

8181
simple_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

8585
inc_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

8989
assign_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

9595
return_stmt: "return" expression_list?
9696

9797
break_stmt: "break" NAME?
9898

9999
continue_stmt: "continue" NAME?
100100

101-
goto_stmt: "goto" nls? NAME
101+
goto_stmt: goto_token NAME
102102

103103
fallthrough_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

109109
switch_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

138138
for_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

148148
type_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

155155
array_length: expression
156156

157157
element_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

170172
method_spec: NAME signature
171173

172-
function_type: "func" nls? signature
174+
function_type: func_token signature
173175

174176
signature: parameters result?
175177

176178
result: 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

189191
expression: 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

205206
literal: basic_lit | composite_lit | function_lit
206207

@@ -212,25 +213,25 @@ integer: DECIMAL_LIT | BINARY_LIT | OCTAL_LIT | HEX_LIT
212213
DECIMAL_LIT: /0|[1-9]\d*/i
213214
HEX_LIT.2: /0x[\da-f]*/i
214215
OCTAL_LIT.2: /0o[0-7]*/i
215-
BINARY_LIT.2 : /0b[0-1]*/i
216+
BINARY_LIT.2: /0b[0-1]*/i
216217
FLOAT_LIT.2: /((\d+\.\d*|\.\d+)(e[-+]?\d+)?|\d+(e[-+]?\d+))/i
217218
CHAR_LIT: /'/ (/[^'\\]/ | ESCAPED_VALUE) /'/
218219

219220
composite_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

229230
key: expression | literal_value
230231

231232
element: 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

235236
field_decl: ((identifier_list | NAME) type_ | embedded_field) string_?
236237

@@ -244,30 +245,65 @@ INTERPRETED_STRING_LIT: /"/ (/[^"\\]/ | ESCAPED_VALUE)* /"/
244245

245246
ESCAPED_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+
261297
eos: semi | nls
262298
semi: ";" NL*
263299
nls: NL+
264300

265301
NAME : /[a-zA-Z_]\w*/
266302

267303
COMMENT : /\/\/[^\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

Comments
 (0)