]>
Commit | Line | Data |
---|---|---|
476ff2be SL |
1 | // Copyright 2015 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
11 | %{ | |
12 | #define YYERROR_VERBOSE | |
13 | #define YYSTYPE struct node * | |
14 | struct node; | |
15 | extern int yylex(); | |
16 | extern void yyerror(char const *s); | |
17 | extern struct node *mk_node(char const *name, int n, ...); | |
18 | extern struct node *mk_atom(char *text); | |
19 | extern struct node *mk_none(); | |
20 | extern struct node *ext_node(struct node *nd, int n, ...); | |
21 | extern void push_back(char c); | |
22 | extern char *yytext; | |
23 | %} | |
24 | %debug | |
25 | ||
26 | %token SHL | |
27 | %token SHR | |
28 | %token LE | |
29 | %token EQEQ | |
30 | %token NE | |
31 | %token GE | |
32 | %token ANDAND | |
33 | %token OROR | |
34 | %token SHLEQ | |
35 | %token SHREQ | |
36 | %token MINUSEQ | |
37 | %token ANDEQ | |
38 | %token OREQ | |
39 | %token PLUSEQ | |
40 | %token STAREQ | |
41 | %token SLASHEQ | |
42 | %token CARETEQ | |
43 | %token PERCENTEQ | |
44 | %token DOTDOT | |
45 | %token DOTDOTDOT | |
46 | %token MOD_SEP | |
47 | %token RARROW | |
48 | %token LARROW | |
49 | %token FAT_ARROW | |
50 | %token LIT_BYTE | |
51 | %token LIT_CHAR | |
52 | %token LIT_INTEGER | |
53 | %token LIT_FLOAT | |
54 | %token LIT_STR | |
55 | %token LIT_STR_RAW | |
56 | %token LIT_BYTE_STR | |
57 | %token LIT_BYTE_STR_RAW | |
58 | %token IDENT | |
59 | %token UNDERSCORE | |
60 | %token LIFETIME | |
61 | ||
62 | // keywords | |
63 | %token SELF | |
64 | %token STATIC | |
abe05a73 XL |
65 | %token ABSTRACT |
66 | %token ALIGNOF | |
476ff2be | 67 | %token AS |
abe05a73 | 68 | %token BECOME |
476ff2be | 69 | %token BREAK |
abe05a73 | 70 | %token CATCH |
476ff2be | 71 | %token CRATE |
abe05a73 | 72 | %token DO |
476ff2be SL |
73 | %token ELSE |
74 | %token ENUM | |
75 | %token EXTERN | |
76 | %token FALSE | |
abe05a73 | 77 | %token FINAL |
476ff2be SL |
78 | %token FN |
79 | %token FOR | |
80 | %token IF | |
81 | %token IMPL | |
82 | %token IN | |
83 | %token LET | |
84 | %token LOOP | |
abe05a73 | 85 | %token MACRO |
476ff2be SL |
86 | %token MATCH |
87 | %token MOD | |
88 | %token MOVE | |
89 | %token MUT | |
abe05a73 XL |
90 | %token OFFSETOF |
91 | %token OVERRIDE | |
476ff2be SL |
92 | %token PRIV |
93 | %token PUB | |
abe05a73 | 94 | %token PURE |
476ff2be SL |
95 | %token REF |
96 | %token RETURN | |
abe05a73 | 97 | %token SIZEOF |
476ff2be | 98 | %token STRUCT |
abe05a73 XL |
99 | %token SUPER |
100 | %token UNION | |
101 | %token UNSIZED | |
476ff2be SL |
102 | %token TRUE |
103 | %token TRAIT | |
104 | %token TYPE | |
105 | %token UNSAFE | |
abe05a73 XL |
106 | %token VIRTUAL |
107 | %token YIELD | |
7cac9316 | 108 | %token DEFAULT |
476ff2be SL |
109 | %token USE |
110 | %token WHILE | |
111 | %token CONTINUE | |
112 | %token PROC | |
113 | %token BOX | |
114 | %token CONST | |
115 | %token WHERE | |
116 | %token TYPEOF | |
117 | %token INNER_DOC_COMMENT | |
118 | %token OUTER_DOC_COMMENT | |
119 | ||
120 | %token SHEBANG | |
121 | %token SHEBANG_LINE | |
122 | %token STATIC_LIFETIME | |
123 | ||
124 | /* | |
125 | Quoting from the Bison manual: | |
126 | ||
127 | "Finally, the resolution of conflicts works by comparing the precedence | |
128 | of the rule being considered with that of the lookahead token. If the | |
129 | token's precedence is higher, the choice is to shift. If the rule's | |
130 | precedence is higher, the choice is to reduce. If they have equal | |
131 | precedence, the choice is made based on the associativity of that | |
132 | precedence level. The verbose output file made by ā-vā (see Invoking | |
133 | Bison) says how each conflict was resolved" | |
134 | */ | |
135 | ||
136 | // We expect no shift/reduce or reduce/reduce conflicts in this grammar; | |
137 | // all potential ambiguities are scrutinized and eliminated manually. | |
138 | %expect 0 | |
139 | ||
140 | // fake-precedence symbol to cause '|' bars in lambda context to parse | |
141 | // at low precedence, permit things like |x| foo = bar, where '=' is | |
142 | // otherwise lower-precedence than '|'. Also used for proc() to cause | |
143 | // things like proc() a + b to parse as proc() { a + b }. | |
144 | %precedence LAMBDA | |
145 | ||
146 | %precedence SELF | |
147 | ||
148 | // MUT should be lower precedence than IDENT so that in the pat rule, | |
149 | // "& MUT pat" has higher precedence than "binding_mode ident [@ pat]" | |
150 | %precedence MUT | |
151 | ||
152 | // IDENT needs to be lower than '{' so that 'foo {' is shifted when | |
153 | // trying to decide if we've got a struct-construction expr (esp. in | |
154 | // contexts like 'if foo { .') | |
155 | // | |
156 | // IDENT also needs to be lower precedence than '<' so that '<' in | |
157 | // 'foo:bar . <' is shifted (in a trait reference occurring in a | |
158 | // bounds list), parsing as foo:(bar<baz>) rather than (foo:bar)<baz>. | |
159 | %precedence IDENT | |
abe05a73 XL |
160 | // Put the weak keywords that can be used as idents here as well |
161 | %precedence CATCH | |
162 | %precedence DEFAULT | |
163 | %precedence UNION | |
476ff2be SL |
164 | |
165 | // A couple fake-precedence symbols to use in rules associated with + | |
166 | // and < in trailing type contexts. These come up when you have a type | |
167 | // in the RHS of operator-AS, such as "foo as bar<baz>". The "<" there | |
168 | // has to be shifted so the parser keeps trying to parse a type, even | |
169 | // though it might well consider reducing the type "bar" and then | |
170 | // going on to "<" as a subsequent binop. The "+" case is with | |
171 | // trailing type-bounds ("foo as bar:A+B"), for the same reason. | |
172 | %precedence SHIFTPLUS | |
173 | ||
174 | %precedence MOD_SEP | |
175 | %precedence RARROW ':' | |
176 | ||
177 | // In where clauses, "for" should have greater precedence when used as | |
178 | // a higher ranked constraint than when used as the beginning of a | |
179 | // for_in_type (which is a ty) | |
180 | %precedence FORTYPE | |
181 | %precedence FOR | |
182 | ||
183 | // Binops & unops, and their precedences | |
abe05a73 | 184 | %precedence '?' |
476ff2be | 185 | %precedence BOX |
476ff2be SL |
186 | %nonassoc DOTDOT |
187 | ||
188 | // RETURN needs to be lower-precedence than tokens that start | |
189 | // prefix_exprs | |
abe05a73 | 190 | %precedence RETURN YIELD |
476ff2be SL |
191 | |
192 | %right '=' SHLEQ SHREQ MINUSEQ ANDEQ OREQ PLUSEQ STAREQ SLASHEQ CARETEQ PERCENTEQ | |
193 | %right LARROW | |
194 | %left OROR | |
195 | %left ANDAND | |
196 | %left EQEQ NE | |
197 | %left '<' '>' LE GE | |
198 | %left '|' | |
199 | %left '^' | |
200 | %left '&' | |
201 | %left SHL SHR | |
202 | %left '+' '-' | |
203 | %precedence AS | |
204 | %left '*' '/' '%' | |
205 | %precedence '!' | |
206 | ||
207 | %precedence '{' '[' '(' '.' | |
208 | ||
209 | %precedence RANGE | |
210 | ||
211 | %start crate | |
212 | ||
213 | %% | |
214 | ||
215 | //////////////////////////////////////////////////////////////////////// | |
216 | // Part 1: Items and attributes | |
217 | //////////////////////////////////////////////////////////////////////// | |
218 | ||
219 | crate | |
220 | : maybe_shebang inner_attrs maybe_mod_items { mk_node("crate", 2, $2, $3); } | |
221 | | maybe_shebang maybe_mod_items { mk_node("crate", 1, $2); } | |
222 | ; | |
223 | ||
224 | maybe_shebang | |
225 | : SHEBANG_LINE | |
226 | | %empty | |
227 | ; | |
228 | ||
229 | maybe_inner_attrs | |
230 | : inner_attrs | |
231 | | %empty { $$ = mk_none(); } | |
232 | ; | |
233 | ||
234 | inner_attrs | |
235 | : inner_attr { $$ = mk_node("InnerAttrs", 1, $1); } | |
236 | | inner_attrs inner_attr { $$ = ext_node($1, 1, $2); } | |
237 | ; | |
238 | ||
239 | inner_attr | |
240 | : SHEBANG '[' meta_item ']' { $$ = mk_node("InnerAttr", 1, $3); } | |
241 | | INNER_DOC_COMMENT { $$ = mk_node("InnerAttr", 1, mk_node("doc-comment", 1, mk_atom(yytext))); } | |
242 | ; | |
243 | ||
244 | maybe_outer_attrs | |
245 | : outer_attrs | |
246 | | %empty { $$ = mk_none(); } | |
247 | ; | |
248 | ||
249 | outer_attrs | |
250 | : outer_attr { $$ = mk_node("OuterAttrs", 1, $1); } | |
251 | | outer_attrs outer_attr { $$ = ext_node($1, 1, $2); } | |
252 | ; | |
253 | ||
254 | outer_attr | |
255 | : '#' '[' meta_item ']' { $$ = $3; } | |
256 | | OUTER_DOC_COMMENT { $$ = mk_node("doc-comment", 1, mk_atom(yytext)); } | |
257 | ; | |
258 | ||
259 | meta_item | |
260 | : ident { $$ = mk_node("MetaWord", 1, $1); } | |
261 | | ident '=' lit { $$ = mk_node("MetaNameValue", 2, $1, $3); } | |
262 | | ident '(' meta_seq ')' { $$ = mk_node("MetaList", 2, $1, $3); } | |
263 | | ident '(' meta_seq ',' ')' { $$ = mk_node("MetaList", 2, $1, $3); } | |
264 | ; | |
265 | ||
266 | meta_seq | |
267 | : %empty { $$ = mk_none(); } | |
268 | | meta_item { $$ = mk_node("MetaItems", 1, $1); } | |
269 | | meta_seq ',' meta_item { $$ = ext_node($1, 1, $3); } | |
270 | ; | |
271 | ||
272 | maybe_mod_items | |
273 | : mod_items | |
274 | | %empty { $$ = mk_none(); } | |
275 | ; | |
276 | ||
277 | mod_items | |
278 | : mod_item { $$ = mk_node("Items", 1, $1); } | |
279 | | mod_items mod_item { $$ = ext_node($1, 1, $2); } | |
280 | ; | |
281 | ||
282 | attrs_and_vis | |
283 | : maybe_outer_attrs visibility { $$ = mk_node("AttrsAndVis", 2, $1, $2); } | |
284 | ; | |
285 | ||
286 | mod_item | |
287 | : attrs_and_vis item { $$ = mk_node("Item", 2, $1, $2); } | |
288 | ; | |
289 | ||
290 | // items that can appear outside of a fn block | |
291 | item | |
292 | : stmt_item | |
293 | | item_macro | |
294 | ; | |
295 | ||
296 | // items that can appear in "stmts" | |
297 | stmt_item | |
298 | : item_static | |
299 | | item_const | |
300 | | item_type | |
301 | | block_item | |
302 | | view_item | |
303 | ; | |
304 | ||
305 | item_static | |
306 | : STATIC ident ':' ty '=' expr ';' { $$ = mk_node("ItemStatic", 3, $2, $4, $6); } | |
307 | | STATIC MUT ident ':' ty '=' expr ';' { $$ = mk_node("ItemStatic", 3, $3, $5, $7); } | |
308 | ; | |
309 | ||
310 | item_const | |
311 | : CONST ident ':' ty '=' expr ';' { $$ = mk_node("ItemConst", 3, $2, $4, $6); } | |
312 | ; | |
313 | ||
314 | item_macro | |
315 | : path_expr '!' maybe_ident parens_delimited_token_trees ';' { $$ = mk_node("ItemMacro", 3, $1, $3, $4); } | |
316 | | path_expr '!' maybe_ident braces_delimited_token_trees { $$ = mk_node("ItemMacro", 3, $1, $3, $4); } | |
317 | | path_expr '!' maybe_ident brackets_delimited_token_trees ';'{ $$ = mk_node("ItemMacro", 3, $1, $3, $4); } | |
318 | ; | |
319 | ||
320 | view_item | |
321 | : use_item | |
322 | | extern_fn_item | |
323 | | EXTERN CRATE ident ';' { $$ = mk_node("ViewItemExternCrate", 1, $3); } | |
324 | | EXTERN CRATE ident AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); } | |
325 | ; | |
326 | ||
327 | extern_fn_item | |
328 | : EXTERN maybe_abi item_fn { $$ = mk_node("ViewItemExternFn", 2, $2, $3); } | |
329 | ; | |
330 | ||
331 | use_item | |
332 | : USE view_path ';' { $$ = mk_node("ViewItemUse", 1, $2); } | |
333 | ; | |
334 | ||
335 | view_path | |
336 | : path_no_types_allowed { $$ = mk_node("ViewPathSimple", 1, $1); } | |
337 | | path_no_types_allowed MOD_SEP '{' '}' { $$ = mk_node("ViewPathList", 2, $1, mk_atom("ViewPathListEmpty")); } | |
338 | | MOD_SEP '{' '}' { $$ = mk_node("ViewPathList", 1, mk_atom("ViewPathListEmpty")); } | |
339 | | path_no_types_allowed MOD_SEP '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 2, $1, $4); } | |
340 | | MOD_SEP '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 1, $3); } | |
341 | | path_no_types_allowed MOD_SEP '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 2, $1, $4); } | |
342 | | MOD_SEP '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 1, $3); } | |
343 | | path_no_types_allowed MOD_SEP '*' { $$ = mk_node("ViewPathGlob", 1, $1); } | |
abe05a73 XL |
344 | | MOD_SEP '*' { $$ = mk_atom("ViewPathGlob"); } |
345 | | '*' { $$ = mk_atom("ViewPathGlob"); } | |
476ff2be SL |
346 | | '{' '}' { $$ = mk_atom("ViewPathListEmpty"); } |
347 | | '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 1, $2); } | |
348 | | '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 1, $2); } | |
349 | | path_no_types_allowed AS ident { $$ = mk_node("ViewPathSimple", 2, $1, $3); } | |
350 | ; | |
351 | ||
352 | block_item | |
353 | : item_fn | |
354 | | item_unsafe_fn | |
355 | | item_mod | |
356 | | item_foreign_mod { $$ = mk_node("ItemForeignMod", 1, $1); } | |
357 | | item_struct | |
358 | | item_enum | |
abe05a73 | 359 | | item_union |
476ff2be SL |
360 | | item_trait |
361 | | item_impl | |
362 | ; | |
363 | ||
364 | maybe_ty_ascription | |
365 | : ':' ty_sum { $$ = $2; } | |
366 | | %empty { $$ = mk_none(); } | |
367 | ; | |
368 | ||
369 | maybe_init_expr | |
370 | : '=' expr { $$ = $2; } | |
371 | | %empty { $$ = mk_none(); } | |
372 | ; | |
373 | ||
374 | // structs | |
375 | item_struct | |
376 | : STRUCT ident generic_params maybe_where_clause struct_decl_args | |
377 | { | |
378 | $$ = mk_node("ItemStruct", 4, $2, $3, $4, $5); | |
379 | } | |
380 | | STRUCT ident generic_params struct_tuple_args maybe_where_clause ';' | |
381 | { | |
382 | $$ = mk_node("ItemStruct", 4, $2, $3, $4, $5); | |
383 | } | |
384 | | STRUCT ident generic_params maybe_where_clause ';' | |
385 | { | |
386 | $$ = mk_node("ItemStruct", 3, $2, $3, $4); | |
387 | } | |
388 | ; | |
389 | ||
390 | struct_decl_args | |
391 | : '{' struct_decl_fields '}' { $$ = $2; } | |
392 | | '{' struct_decl_fields ',' '}' { $$ = $2; } | |
393 | ; | |
394 | ||
395 | struct_tuple_args | |
396 | : '(' struct_tuple_fields ')' { $$ = $2; } | |
397 | | '(' struct_tuple_fields ',' ')' { $$ = $2; } | |
398 | ; | |
399 | ||
400 | struct_decl_fields | |
401 | : struct_decl_field { $$ = mk_node("StructFields", 1, $1); } | |
402 | | struct_decl_fields ',' struct_decl_field { $$ = ext_node($1, 1, $3); } | |
403 | | %empty { $$ = mk_none(); } | |
404 | ; | |
405 | ||
406 | struct_decl_field | |
407 | : attrs_and_vis ident ':' ty_sum { $$ = mk_node("StructField", 3, $1, $2, $4); } | |
408 | ; | |
409 | ||
410 | struct_tuple_fields | |
411 | : struct_tuple_field { $$ = mk_node("StructFields", 1, $1); } | |
412 | | struct_tuple_fields ',' struct_tuple_field { $$ = ext_node($1, 1, $3); } | |
abe05a73 | 413 | | %empty { $$ = mk_none(); } |
476ff2be SL |
414 | ; |
415 | ||
416 | struct_tuple_field | |
417 | : attrs_and_vis ty_sum { $$ = mk_node("StructField", 2, $1, $2); } | |
418 | ; | |
419 | ||
420 | // enums | |
421 | item_enum | |
422 | : ENUM ident generic_params maybe_where_clause '{' enum_defs '}' { $$ = mk_node("ItemEnum", 0); } | |
423 | | ENUM ident generic_params maybe_where_clause '{' enum_defs ',' '}' { $$ = mk_node("ItemEnum", 0); } | |
424 | ; | |
425 | ||
426 | enum_defs | |
427 | : enum_def { $$ = mk_node("EnumDefs", 1, $1); } | |
428 | | enum_defs ',' enum_def { $$ = ext_node($1, 1, $3); } | |
429 | | %empty { $$ = mk_none(); } | |
430 | ; | |
431 | ||
432 | enum_def | |
433 | : attrs_and_vis ident enum_args { $$ = mk_node("EnumDef", 3, $1, $2, $3); } | |
434 | ; | |
435 | ||
436 | enum_args | |
437 | : '{' struct_decl_fields '}' { $$ = mk_node("EnumArgs", 1, $2); } | |
438 | | '{' struct_decl_fields ',' '}' { $$ = mk_node("EnumArgs", 1, $2); } | |
439 | | '(' maybe_ty_sums ')' { $$ = mk_node("EnumArgs", 1, $2); } | |
440 | | '=' expr { $$ = mk_node("EnumArgs", 1, $2); } | |
441 | | %empty { $$ = mk_none(); } | |
442 | ; | |
443 | ||
abe05a73 XL |
444 | // unions |
445 | item_union | |
446 | : UNION ident generic_params maybe_where_clause '{' struct_decl_fields '}' { $$ = mk_node("ItemUnion", 0); } | |
447 | | UNION ident generic_params maybe_where_clause '{' struct_decl_fields ',' '}' { $$ = mk_node("ItemUnion", 0); } | |
448 | ||
476ff2be SL |
449 | item_mod |
450 | : MOD ident ';' { $$ = mk_node("ItemMod", 1, $2); } | |
451 | | MOD ident '{' maybe_mod_items '}' { $$ = mk_node("ItemMod", 2, $2, $4); } | |
452 | | MOD ident '{' inner_attrs maybe_mod_items '}' { $$ = mk_node("ItemMod", 3, $2, $4, $5); } | |
453 | ; | |
454 | ||
455 | item_foreign_mod | |
456 | : EXTERN maybe_abi '{' maybe_foreign_items '}' { $$ = mk_node("ItemForeignMod", 1, $4); } | |
457 | | EXTERN maybe_abi '{' inner_attrs maybe_foreign_items '}' { $$ = mk_node("ItemForeignMod", 2, $4, $5); } | |
458 | ; | |
459 | ||
460 | maybe_abi | |
461 | : str | |
462 | | %empty { $$ = mk_none(); } | |
463 | ; | |
464 | ||
465 | maybe_foreign_items | |
466 | : foreign_items | |
467 | | %empty { $$ = mk_none(); } | |
468 | ; | |
469 | ||
470 | foreign_items | |
471 | : foreign_item { $$ = mk_node("ForeignItems", 1, $1); } | |
472 | | foreign_items foreign_item { $$ = ext_node($1, 1, $2); } | |
473 | ; | |
474 | ||
475 | foreign_item | |
476 | : attrs_and_vis STATIC item_foreign_static { $$ = mk_node("ForeignItem", 2, $1, $3); } | |
477 | | attrs_and_vis item_foreign_fn { $$ = mk_node("ForeignItem", 2, $1, $2); } | |
478 | | attrs_and_vis UNSAFE item_foreign_fn { $$ = mk_node("ForeignItem", 2, $1, $3); } | |
479 | ; | |
480 | ||
481 | item_foreign_static | |
482 | : maybe_mut ident ':' ty ';' { $$ = mk_node("StaticItem", 3, $1, $2, $4); } | |
483 | ; | |
484 | ||
485 | item_foreign_fn | |
486 | : FN ident generic_params fn_decl_allow_variadic maybe_where_clause ';' { $$ = mk_node("ForeignFn", 4, $2, $3, $4, $5); } | |
487 | ; | |
488 | ||
489 | fn_decl_allow_variadic | |
490 | : fn_params_allow_variadic ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); } | |
491 | ; | |
492 | ||
493 | fn_params_allow_variadic | |
494 | : '(' ')' { $$ = mk_none(); } | |
495 | | '(' params ')' { $$ = $2; } | |
496 | | '(' params ',' ')' { $$ = $2; } | |
497 | | '(' params ',' DOTDOTDOT ')' { $$ = $2; } | |
498 | ; | |
499 | ||
500 | visibility | |
501 | : PUB { $$ = mk_atom("Public"); } | |
502 | | %empty { $$ = mk_atom("Inherited"); } | |
503 | ; | |
504 | ||
505 | idents_or_self | |
506 | : ident_or_self { $$ = mk_node("IdentsOrSelf", 1, $1); } | |
abe05a73 | 507 | | idents_or_self AS ident { $$ = mk_node("IdentsOrSelf", 2, $1, $3); } |
476ff2be SL |
508 | | idents_or_self ',' ident_or_self { $$ = ext_node($1, 1, $3); } |
509 | ; | |
510 | ||
511 | ident_or_self | |
512 | : ident | |
513 | | SELF { $$ = mk_atom(yytext); } | |
514 | ; | |
515 | ||
516 | item_type | |
517 | : TYPE ident generic_params maybe_where_clause '=' ty_sum ';' { $$ = mk_node("ItemTy", 4, $2, $3, $4, $6); } | |
518 | ; | |
519 | ||
520 | for_sized | |
521 | : FOR '?' ident { $$ = mk_node("ForSized", 1, $3); } | |
522 | | FOR ident '?' { $$ = mk_node("ForSized", 1, $2); } | |
523 | | %empty { $$ = mk_none(); } | |
524 | ; | |
525 | ||
526 | item_trait | |
527 | : maybe_unsafe TRAIT ident generic_params for_sized maybe_ty_param_bounds maybe_where_clause '{' maybe_trait_items '}' | |
528 | { | |
529 | $$ = mk_node("ItemTrait", 7, $1, $3, $4, $5, $6, $7, $9); | |
530 | } | |
531 | ; | |
532 | ||
533 | maybe_trait_items | |
534 | : trait_items | |
535 | | %empty { $$ = mk_none(); } | |
536 | ; | |
537 | ||
538 | trait_items | |
539 | : trait_item { $$ = mk_node("TraitItems", 1, $1); } | |
540 | | trait_items trait_item { $$ = ext_node($1, 1, $2); } | |
541 | ; | |
542 | ||
543 | trait_item | |
544 | : trait_const | |
545 | | trait_type | |
546 | | trait_method | |
abe05a73 | 547 | | maybe_outer_attrs item_macro { $$ = mk_node("TraitMacroItem", 2, $1, $2); } |
476ff2be SL |
548 | ; |
549 | ||
550 | trait_const | |
551 | : maybe_outer_attrs CONST ident maybe_ty_ascription maybe_const_default ';' { $$ = mk_node("ConstTraitItem", 4, $1, $3, $4, $5); } | |
552 | ; | |
553 | ||
554 | maybe_const_default | |
555 | : '=' expr { $$ = mk_node("ConstDefault", 1, $2); } | |
556 | | %empty { $$ = mk_none(); } | |
557 | ; | |
558 | ||
559 | trait_type | |
560 | : maybe_outer_attrs TYPE ty_param ';' { $$ = mk_node("TypeTraitItem", 2, $1, $3); } | |
561 | ; | |
562 | ||
563 | maybe_unsafe | |
564 | : UNSAFE { $$ = mk_atom("Unsafe"); } | |
565 | | %empty { $$ = mk_none(); } | |
566 | ; | |
567 | ||
7cac9316 XL |
568 | maybe_default_maybe_unsafe |
569 | : DEFAULT UNSAFE { $$ = mk_atom("DefaultUnsafe"); } | |
570 | | DEFAULT { $$ = mk_atom("Default"); } | |
571 | | UNSAFE { $$ = mk_atom("Unsafe"); } | |
572 | | %empty { $$ = mk_none(); } | |
573 | ||
476ff2be SL |
574 | trait_method |
575 | : type_method { $$ = mk_node("Required", 1, $1); } | |
576 | | method { $$ = mk_node("Provided", 1, $1); } | |
577 | ; | |
578 | ||
579 | type_method | |
abe05a73 | 580 | : maybe_outer_attrs maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause ';' |
476ff2be SL |
581 | { |
582 | $$ = mk_node("TypeMethod", 6, $1, $2, $4, $5, $6, $7); | |
583 | } | |
abe05a73 XL |
584 | | maybe_outer_attrs CONST maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause ';' |
585 | { | |
586 | $$ = mk_node("TypeMethod", 6, $1, $3, $5, $6, $7, $8); | |
587 | } | |
588 | | maybe_outer_attrs maybe_unsafe EXTERN maybe_abi FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause ';' | |
476ff2be SL |
589 | { |
590 | $$ = mk_node("TypeMethod", 7, $1, $2, $4, $6, $7, $8, $9); | |
591 | } | |
592 | ; | |
593 | ||
594 | method | |
abe05a73 | 595 | : maybe_outer_attrs maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block |
476ff2be SL |
596 | { |
597 | $$ = mk_node("Method", 7, $1, $2, $4, $5, $6, $7, $8); | |
598 | } | |
abe05a73 XL |
599 | | maybe_outer_attrs CONST maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block |
600 | { | |
601 | $$ = mk_node("Method", 7, $1, $3, $5, $6, $7, $8, $9); | |
602 | } | |
603 | | maybe_outer_attrs maybe_unsafe EXTERN maybe_abi FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block | |
476ff2be SL |
604 | { |
605 | $$ = mk_node("Method", 8, $1, $2, $4, $6, $7, $8, $9, $10); | |
606 | } | |
607 | ; | |
608 | ||
609 | impl_method | |
abe05a73 | 610 | : attrs_and_vis maybe_default maybe_unsafe FN ident generic_params fn_decl_with_self maybe_where_clause inner_attrs_and_block |
476ff2be | 611 | { |
abe05a73 | 612 | $$ = mk_node("Method", 8, $1, $2, $3, $5, $6, $7, $8, $9); |
476ff2be | 613 | } |
abe05a73 | 614 | | attrs_and_vis maybe_default CONST maybe_unsafe FN ident generic_params fn_decl_with_self maybe_where_clause inner_attrs_and_block |
476ff2be SL |
615 | { |
616 | $$ = mk_node("Method", 8, $1, $2, $4, $6, $7, $8, $9, $10); | |
617 | } | |
abe05a73 XL |
618 | | attrs_and_vis maybe_default maybe_unsafe EXTERN maybe_abi FN ident generic_params fn_decl_with_self maybe_where_clause inner_attrs_and_block |
619 | { | |
620 | $$ = mk_node("Method", 9, $1, $2, $3, $5, $7, $8, $9, $10, $11); | |
621 | } | |
476ff2be SL |
622 | ; |
623 | ||
624 | // There are two forms of impl: | |
625 | // | |
626 | // impl (<...>)? TY { ... } | |
627 | // impl (<...>)? TRAIT for TY { ... } | |
628 | // | |
629 | // Unfortunately since TY can begin with '<' itself -- as part of a | |
630 | // TyQualifiedPath type -- there's an s/r conflict when we see '<' after IMPL: | |
631 | // should we reduce one of the early rules of TY (such as maybe_once) | |
632 | // or shall we continue shifting into the generic_params list for the | |
633 | // impl? | |
634 | // | |
635 | // The production parser disambiguates a different case here by | |
636 | // permitting / requiring the user to provide parens around types when | |
637 | // they are ambiguous with traits. We do the same here, regrettably, | |
638 | // by splitting ty into ty and ty_prim. | |
639 | item_impl | |
7cac9316 | 640 | : maybe_default_maybe_unsafe IMPL generic_params ty_prim_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}' |
476ff2be SL |
641 | { |
642 | $$ = mk_node("ItemImpl", 6, $1, $3, $4, $5, $7, $8); | |
643 | } | |
7cac9316 | 644 | | maybe_default_maybe_unsafe IMPL generic_params '(' ty ')' maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}' |
476ff2be SL |
645 | { |
646 | $$ = mk_node("ItemImpl", 6, $1, $3, 5, $6, $9, $10); | |
647 | } | |
7cac9316 | 648 | | maybe_default_maybe_unsafe IMPL generic_params trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}' |
476ff2be SL |
649 | { |
650 | $$ = mk_node("ItemImpl", 6, $3, $4, $6, $7, $9, $10); | |
651 | } | |
7cac9316 | 652 | | maybe_default_maybe_unsafe IMPL generic_params '!' trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}' |
476ff2be SL |
653 | { |
654 | $$ = mk_node("ItemImplNeg", 7, $1, $3, $5, $7, $8, $10, $11); | |
655 | } | |
7cac9316 | 656 | | maybe_default_maybe_unsafe IMPL generic_params trait_ref FOR DOTDOT '{' '}' |
476ff2be SL |
657 | { |
658 | $$ = mk_node("ItemImplDefault", 3, $1, $3, $4); | |
659 | } | |
7cac9316 | 660 | | maybe_default_maybe_unsafe IMPL generic_params '!' trait_ref FOR DOTDOT '{' '}' |
476ff2be SL |
661 | { |
662 | $$ = mk_node("ItemImplDefaultNeg", 3, $1, $3, $4); | |
663 | } | |
664 | ; | |
665 | ||
666 | maybe_impl_items | |
667 | : impl_items | |
668 | | %empty { $$ = mk_none(); } | |
669 | ; | |
670 | ||
671 | impl_items | |
672 | : impl_item { $$ = mk_node("ImplItems", 1, $1); } | |
673 | | impl_item impl_items { $$ = ext_node($1, 1, $2); } | |
674 | ; | |
675 | ||
676 | impl_item | |
677 | : impl_method | |
678 | | attrs_and_vis item_macro { $$ = mk_node("ImplMacroItem", 2, $1, $2); } | |
679 | | impl_const | |
680 | | impl_type | |
681 | ; | |
682 | ||
abe05a73 XL |
683 | maybe_default |
684 | : DEFAULT { $$ = mk_atom("Default"); } | |
685 | | %empty { $$ = mk_none(); } | |
686 | ; | |
687 | ||
476ff2be | 688 | impl_const |
abe05a73 | 689 | : attrs_and_vis maybe_default item_const { $$ = mk_node("ImplConst", 3, $1, $2, $3); } |
476ff2be SL |
690 | ; |
691 | ||
692 | impl_type | |
abe05a73 | 693 | : attrs_and_vis maybe_default TYPE ident generic_params '=' ty_sum ';' { $$ = mk_node("ImplType", 5, $1, $2, $4, $5, $7); } |
476ff2be SL |
694 | ; |
695 | ||
696 | item_fn | |
697 | : FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block | |
698 | { | |
699 | $$ = mk_node("ItemFn", 5, $2, $3, $4, $5, $6); | |
700 | } | |
abe05a73 XL |
701 | | CONST FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block |
702 | { | |
703 | $$ = mk_node("ItemFn", 5, $3, $4, $5, $6, $7); | |
704 | } | |
476ff2be SL |
705 | ; |
706 | ||
707 | item_unsafe_fn | |
708 | : UNSAFE FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block | |
709 | { | |
710 | $$ = mk_node("ItemUnsafeFn", 5, $3, $4, $5, $6, $7); | |
711 | } | |
abe05a73 XL |
712 | | CONST UNSAFE FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block |
713 | { | |
714 | $$ = mk_node("ItemUnsafeFn", 5, $4, $5, $6, $7, $8); | |
715 | } | |
476ff2be SL |
716 | | UNSAFE EXTERN maybe_abi FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block |
717 | { | |
718 | $$ = mk_node("ItemUnsafeFn", 6, $3, $5, $6, $7, $8, $9); | |
719 | } | |
720 | ; | |
721 | ||
722 | fn_decl | |
723 | : fn_params ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); } | |
724 | ; | |
725 | ||
726 | fn_decl_with_self | |
727 | : fn_params_with_self ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); } | |
728 | ; | |
729 | ||
730 | fn_decl_with_self_allow_anon_params | |
731 | : fn_anon_params_with_self ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); } | |
732 | ; | |
733 | ||
734 | fn_params | |
735 | : '(' maybe_params ')' { $$ = $2; } | |
736 | ; | |
737 | ||
738 | fn_anon_params | |
739 | : '(' anon_param anon_params_allow_variadic_tail ')' { $$ = ext_node($2, 1, $3); } | |
740 | | '(' ')' { $$ = mk_none(); } | |
741 | ; | |
742 | ||
743 | fn_params_with_self | |
744 | : '(' maybe_mut SELF maybe_ty_ascription maybe_comma_params ')' { $$ = mk_node("SelfValue", 3, $2, $4, $5); } | |
745 | | '(' '&' maybe_mut SELF maybe_ty_ascription maybe_comma_params ')' { $$ = mk_node("SelfRegion", 3, $3, $5, $6); } | |
746 | | '(' '&' lifetime maybe_mut SELF maybe_ty_ascription maybe_comma_params ')' { $$ = mk_node("SelfRegion", 4, $3, $4, $6, $7); } | |
747 | | '(' maybe_params ')' { $$ = mk_node("SelfStatic", 1, $2); } | |
748 | ; | |
749 | ||
750 | fn_anon_params_with_self | |
751 | : '(' maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')' { $$ = mk_node("SelfValue", 3, $2, $4, $5); } | |
752 | | '(' '&' maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')' { $$ = mk_node("SelfRegion", 3, $3, $5, $6); } | |
753 | | '(' '&' lifetime maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')' { $$ = mk_node("SelfRegion", 4, $3, $4, $6, $7); } | |
754 | | '(' maybe_anon_params ')' { $$ = mk_node("SelfStatic", 1, $2); } | |
755 | ; | |
756 | ||
757 | maybe_params | |
758 | : params | |
759 | | params ',' | |
760 | | %empty { $$ = mk_none(); } | |
761 | ; | |
762 | ||
763 | params | |
764 | : param { $$ = mk_node("Args", 1, $1); } | |
765 | | params ',' param { $$ = ext_node($1, 1, $3); } | |
766 | ; | |
767 | ||
768 | param | |
769 | : pat ':' ty_sum { $$ = mk_node("Arg", 2, $1, $3); } | |
770 | ; | |
771 | ||
772 | inferrable_params | |
773 | : inferrable_param { $$ = mk_node("InferrableParams", 1, $1); } | |
774 | | inferrable_params ',' inferrable_param { $$ = ext_node($1, 1, $3); } | |
775 | ; | |
776 | ||
777 | inferrable_param | |
778 | : pat maybe_ty_ascription { $$ = mk_node("InferrableParam", 2, $1, $2); } | |
779 | ; | |
780 | ||
476ff2be SL |
781 | maybe_comma_params |
782 | : ',' { $$ = mk_none(); } | |
783 | | ',' params { $$ = $2; } | |
784 | | ',' params ',' { $$ = $2; } | |
785 | | %empty { $$ = mk_none(); } | |
786 | ; | |
787 | ||
788 | maybe_comma_anon_params | |
789 | : ',' { $$ = mk_none(); } | |
790 | | ',' anon_params { $$ = $2; } | |
791 | | ',' anon_params ',' { $$ = $2; } | |
792 | | %empty { $$ = mk_none(); } | |
793 | ; | |
794 | ||
795 | maybe_anon_params | |
796 | : anon_params | |
797 | | anon_params ',' | |
798 | | %empty { $$ = mk_none(); } | |
799 | ; | |
800 | ||
801 | anon_params | |
802 | : anon_param { $$ = mk_node("Args", 1, $1); } | |
803 | | anon_params ',' anon_param { $$ = ext_node($1, 1, $3); } | |
804 | ; | |
805 | ||
806 | // anon means it's allowed to be anonymous (type-only), but it can | |
807 | // still have a name | |
808 | anon_param | |
809 | : named_arg ':' ty { $$ = mk_node("Arg", 2, $1, $3); } | |
810 | | ty | |
811 | ; | |
812 | ||
813 | anon_params_allow_variadic_tail | |
814 | : ',' DOTDOTDOT { $$ = mk_none(); } | |
815 | | ',' anon_param anon_params_allow_variadic_tail { $$ = mk_node("Args", 2, $2, $3); } | |
816 | | %empty { $$ = mk_none(); } | |
817 | ; | |
818 | ||
819 | named_arg | |
820 | : ident | |
821 | | UNDERSCORE { $$ = mk_atom("PatWild"); } | |
822 | | '&' ident { $$ = $2; } | |
823 | | '&' UNDERSCORE { $$ = mk_atom("PatWild"); } | |
824 | | ANDAND ident { $$ = $2; } | |
825 | | ANDAND UNDERSCORE { $$ = mk_atom("PatWild"); } | |
826 | | MUT ident { $$ = $2; } | |
827 | ; | |
828 | ||
829 | ret_ty | |
830 | : RARROW '!' { $$ = mk_none(); } | |
831 | | RARROW ty { $$ = mk_node("ret-ty", 1, $2); } | |
832 | | %prec IDENT %empty { $$ = mk_none(); } | |
833 | ; | |
834 | ||
835 | generic_params | |
abe05a73 XL |
836 | : '<' '>' { $$ = mk_node("Generics", 2, mk_none(), mk_none()); } |
837 | | '<' lifetimes '>' { $$ = mk_node("Generics", 2, $2, mk_none()); } | |
476ff2be SL |
838 | | '<' lifetimes ',' '>' { $$ = mk_node("Generics", 2, $2, mk_none()); } |
839 | | '<' lifetimes SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, mk_none()); } | |
840 | | '<' lifetimes ',' SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, mk_none()); } | |
841 | | '<' lifetimes ',' ty_params '>' { $$ = mk_node("Generics", 2, $2, $4); } | |
842 | | '<' lifetimes ',' ty_params ',' '>' { $$ = mk_node("Generics", 2, $2, $4); } | |
843 | | '<' lifetimes ',' ty_params SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, $4); } | |
844 | | '<' lifetimes ',' ty_params ',' SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, $4); } | |
845 | | '<' ty_params '>' { $$ = mk_node("Generics", 2, mk_none(), $2); } | |
846 | | '<' ty_params ',' '>' { $$ = mk_node("Generics", 2, mk_none(), $2); } | |
847 | | '<' ty_params SHR { push_back('>'); $$ = mk_node("Generics", 2, mk_none(), $2); } | |
848 | | '<' ty_params ',' SHR { push_back('>'); $$ = mk_node("Generics", 2, mk_none(), $2); } | |
849 | | %empty { $$ = mk_none(); } | |
850 | ; | |
851 | ||
852 | maybe_where_clause | |
853 | : %empty { $$ = mk_none(); } | |
854 | | where_clause | |
855 | ; | |
856 | ||
857 | where_clause | |
858 | : WHERE where_predicates { $$ = mk_node("WhereClause", 1, $2); } | |
859 | | WHERE where_predicates ',' { $$ = mk_node("WhereClause", 1, $2); } | |
860 | ; | |
861 | ||
862 | where_predicates | |
863 | : where_predicate { $$ = mk_node("WherePredicates", 1, $1); } | |
864 | | where_predicates ',' where_predicate { $$ = ext_node($1, 1, $3); } | |
865 | ; | |
866 | ||
867 | where_predicate | |
868 | : maybe_for_lifetimes lifetime ':' bounds { $$ = mk_node("WherePredicate", 3, $1, $2, $4); } | |
869 | | maybe_for_lifetimes ty ':' ty_param_bounds { $$ = mk_node("WherePredicate", 3, $1, $2, $4); } | |
870 | ; | |
871 | ||
872 | maybe_for_lifetimes | |
873 | : FOR '<' lifetimes '>' { $$ = mk_none(); } | |
874 | | %prec FORTYPE %empty { $$ = mk_none(); } | |
875 | ||
876 | ty_params | |
877 | : ty_param { $$ = mk_node("TyParams", 1, $1); } | |
878 | | ty_params ',' ty_param { $$ = ext_node($1, 1, $3); } | |
879 | ; | |
880 | ||
881 | // A path with no type parameters; e.g. `foo::bar::Baz` | |
882 | // | |
883 | // These show up in 'use' view-items, because these are processed | |
884 | // without respect to types. | |
885 | path_no_types_allowed | |
886 | : ident { $$ = mk_node("ViewPath", 1, $1); } | |
887 | | MOD_SEP ident { $$ = mk_node("ViewPath", 1, $2); } | |
888 | | SELF { $$ = mk_node("ViewPath", 1, mk_atom("Self")); } | |
889 | | MOD_SEP SELF { $$ = mk_node("ViewPath", 1, mk_atom("Self")); } | |
abe05a73 XL |
890 | | SUPER { $$ = mk_node("ViewPath", 1, mk_atom("Super")); } |
891 | | MOD_SEP SUPER { $$ = mk_node("ViewPath", 1, mk_atom("Super")); } | |
476ff2be SL |
892 | | path_no_types_allowed MOD_SEP ident { $$ = ext_node($1, 1, $3); } |
893 | ; | |
894 | ||
895 | // A path with a lifetime and type parameters, with no double colons | |
896 | // before the type parameters; e.g. `foo::bar<'a>::Baz<T>` | |
897 | // | |
898 | // These show up in "trait references", the components of | |
899 | // type-parameter bounds lists, as well as in the prefix of the | |
900 | // path_generic_args_and_bounds rule, which is the full form of a | |
901 | // named typed expression. | |
902 | // | |
903 | // They do not have (nor need) an extra '::' before '<' because | |
904 | // unlike in expr context, there are no "less-than" type exprs to | |
905 | // be ambiguous with. | |
906 | path_generic_args_without_colons | |
907 | : %prec IDENT | |
908 | ident { $$ = mk_node("components", 1, $1); } | |
909 | | %prec IDENT | |
910 | ident generic_args { $$ = mk_node("components", 2, $1, $2); } | |
911 | | %prec IDENT | |
912 | ident '(' maybe_ty_sums ')' ret_ty { $$ = mk_node("components", 2, $1, $3); } | |
913 | | %prec IDENT | |
914 | path_generic_args_without_colons MOD_SEP ident { $$ = ext_node($1, 1, $3); } | |
915 | | %prec IDENT | |
916 | path_generic_args_without_colons MOD_SEP ident generic_args { $$ = ext_node($1, 2, $3, $4); } | |
917 | | %prec IDENT | |
918 | path_generic_args_without_colons MOD_SEP ident '(' maybe_ty_sums ')' ret_ty { $$ = ext_node($1, 2, $3, $5); } | |
919 | ; | |
920 | ||
921 | generic_args | |
922 | : '<' generic_values '>' { $$ = $2; } | |
923 | | '<' generic_values SHR { push_back('>'); $$ = $2; } | |
924 | | '<' generic_values GE { push_back('='); $$ = $2; } | |
925 | | '<' generic_values SHREQ { push_back('>'); push_back('='); $$ = $2; } | |
926 | // If generic_args starts with "<<", the first arg must be a | |
927 | // TyQualifiedPath because that's the only type that can start with a | |
928 | // '<'. This rule parses that as the first ty_sum and then continues | |
929 | // with the rest of generic_values. | |
930 | | SHL ty_qualified_path_and_generic_values '>' { $$ = $2; } | |
931 | | SHL ty_qualified_path_and_generic_values SHR { push_back('>'); $$ = $2; } | |
932 | | SHL ty_qualified_path_and_generic_values GE { push_back('='); $$ = $2; } | |
933 | | SHL ty_qualified_path_and_generic_values SHREQ { push_back('>'); push_back('='); $$ = $2; } | |
934 | ; | |
935 | ||
936 | generic_values | |
abe05a73 | 937 | : maybe_ty_sums_and_or_bindings { $$ = mk_node("GenericValues", 1, $1); } |
476ff2be SL |
938 | ; |
939 | ||
940 | maybe_ty_sums_and_or_bindings | |
941 | : ty_sums | |
942 | | ty_sums ',' | |
943 | | ty_sums ',' bindings { $$ = mk_node("TySumsAndBindings", 2, $1, $3); } | |
944 | | bindings | |
945 | | bindings ',' | |
946 | | %empty { $$ = mk_none(); } | |
947 | ; | |
948 | ||
949 | maybe_bindings | |
950 | : ',' bindings { $$ = $2; } | |
951 | | %empty { $$ = mk_none(); } | |
952 | ; | |
953 | ||
954 | //////////////////////////////////////////////////////////////////////// | |
955 | // Part 2: Patterns | |
956 | //////////////////////////////////////////////////////////////////////// | |
957 | ||
958 | pat | |
959 | : UNDERSCORE { $$ = mk_atom("PatWild"); } | |
960 | | '&' pat { $$ = mk_node("PatRegion", 1, $2); } | |
961 | | '&' MUT pat { $$ = mk_node("PatRegion", 1, $3); } | |
962 | | ANDAND pat { $$ = mk_node("PatRegion", 1, mk_node("PatRegion", 1, $2)); } | |
963 | | '(' ')' { $$ = mk_atom("PatUnit"); } | |
964 | | '(' pat_tup ')' { $$ = mk_node("PatTup", 1, $2); } | |
476ff2be SL |
965 | | '[' pat_vec ']' { $$ = mk_node("PatVec", 1, $2); } |
966 | | lit_or_path | |
967 | | lit_or_path DOTDOTDOT lit_or_path { $$ = mk_node("PatRange", 2, $1, $3); } | |
968 | | path_expr '{' pat_struct '}' { $$ = mk_node("PatStruct", 2, $1, $3); } | |
abe05a73 | 969 | | path_expr '(' ')' { $$ = mk_node("PatEnum", 2, $1, mk_none()); } |
476ff2be SL |
970 | | path_expr '(' pat_tup ')' { $$ = mk_node("PatEnum", 2, $1, $3); } |
971 | | path_expr '!' maybe_ident delimited_token_trees { $$ = mk_node("PatMac", 3, $1, $3, $4); } | |
972 | | binding_mode ident { $$ = mk_node("PatIdent", 2, $1, $2); } | |
973 | | ident '@' pat { $$ = mk_node("PatIdent", 3, mk_node("BindByValue", 1, mk_atom("MutImmutable")), $1, $3); } | |
974 | | binding_mode ident '@' pat { $$ = mk_node("PatIdent", 3, $1, $2, $4); } | |
975 | | BOX pat { $$ = mk_node("PatUniq", 1, $2); } | |
976 | | '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("PatQualifiedPath", 3, $2, $3, $6); } | |
977 | | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident | |
978 | { | |
979 | $$ = mk_node("PatQualifiedPath", 3, mk_node("PatQualifiedPath", 3, $2, $3, $6), $7, $10); | |
980 | } | |
981 | ; | |
982 | ||
983 | pats_or | |
984 | : pat { $$ = mk_node("Pats", 1, $1); } | |
985 | | pats_or '|' pat { $$ = ext_node($1, 1, $3); } | |
986 | ; | |
987 | ||
988 | binding_mode | |
989 | : REF { $$ = mk_node("BindByRef", 1, mk_atom("MutImmutable")); } | |
990 | | REF MUT { $$ = mk_node("BindByRef", 1, mk_atom("MutMutable")); } | |
991 | | MUT { $$ = mk_node("BindByValue", 1, mk_atom("MutMutable")); } | |
992 | ; | |
993 | ||
994 | lit_or_path | |
995 | : path_expr { $$ = mk_node("PatLit", 1, $1); } | |
996 | | lit { $$ = mk_node("PatLit", 1, $1); } | |
997 | | '-' lit { $$ = mk_node("PatLit", 1, $2); } | |
998 | ; | |
999 | ||
1000 | pat_field | |
1001 | : ident { $$ = mk_node("PatField", 1, $1); } | |
1002 | | binding_mode ident { $$ = mk_node("PatField", 2, $1, $2); } | |
1003 | | BOX ident { $$ = mk_node("PatField", 2, mk_atom("box"), $2); } | |
1004 | | BOX binding_mode ident { $$ = mk_node("PatField", 3, mk_atom("box"), $2, $3); } | |
1005 | | ident ':' pat { $$ = mk_node("PatField", 2, $1, $3); } | |
1006 | | binding_mode ident ':' pat { $$ = mk_node("PatField", 3, $1, $2, $4); } | |
abe05a73 | 1007 | | LIT_INTEGER ':' pat { $$ = mk_node("PatField", 2, mk_atom(yytext), $3); } |
476ff2be SL |
1008 | ; |
1009 | ||
1010 | pat_fields | |
1011 | : pat_field { $$ = mk_node("PatFields", 1, $1); } | |
1012 | | pat_fields ',' pat_field { $$ = ext_node($1, 1, $3); } | |
1013 | ; | |
1014 | ||
1015 | pat_struct | |
1016 | : pat_fields { $$ = mk_node("PatStruct", 2, $1, mk_atom("false")); } | |
1017 | | pat_fields ',' { $$ = mk_node("PatStruct", 2, $1, mk_atom("false")); } | |
1018 | | pat_fields ',' DOTDOT { $$ = mk_node("PatStruct", 2, $1, mk_atom("true")); } | |
1019 | | DOTDOT { $$ = mk_node("PatStruct", 1, mk_atom("true")); } | |
abe05a73 | 1020 | | %empty { $$ = mk_node("PatStruct", 1, mk_none()); } |
476ff2be SL |
1021 | ; |
1022 | ||
1023 | pat_tup | |
abe05a73 XL |
1024 | : pat_tup_elts { $$ = mk_node("PatTup", 2, $1, mk_none()); } |
1025 | | pat_tup_elts ',' { $$ = mk_node("PatTup", 2, $1, mk_none()); } | |
1026 | | pat_tup_elts DOTDOT { $$ = mk_node("PatTup", 2, $1, mk_none()); } | |
1027 | | pat_tup_elts ',' DOTDOT { $$ = mk_node("PatTup", 2, $1, mk_none()); } | |
1028 | | pat_tup_elts DOTDOT ',' pat_tup_elts { $$ = mk_node("PatTup", 2, $1, $4); } | |
1029 | | pat_tup_elts DOTDOT ',' pat_tup_elts ',' { $$ = mk_node("PatTup", 2, $1, $4); } | |
1030 | | pat_tup_elts ',' DOTDOT ',' pat_tup_elts { $$ = mk_node("PatTup", 2, $1, $5); } | |
1031 | | pat_tup_elts ',' DOTDOT ',' pat_tup_elts ',' { $$ = mk_node("PatTup", 2, $1, $5); } | |
1032 | | DOTDOT ',' pat_tup_elts { $$ = mk_node("PatTup", 2, mk_none(), $3); } | |
1033 | | DOTDOT ',' pat_tup_elts ',' { $$ = mk_node("PatTup", 2, mk_none(), $3); } | |
1034 | | DOTDOT { $$ = mk_node("PatTup", 2, mk_none(), mk_none()); } | |
1035 | ; | |
1036 | ||
1037 | pat_tup_elts | |
1038 | : pat { $$ = mk_node("PatTupElts", 1, $1); } | |
1039 | | pat_tup_elts ',' pat { $$ = ext_node($1, 1, $3); } | |
476ff2be SL |
1040 | ; |
1041 | ||
1042 | pat_vec | |
1043 | : pat_vec_elts { $$ = mk_node("PatVec", 2, $1, mk_none()); } | |
1044 | | pat_vec_elts ',' { $$ = mk_node("PatVec", 2, $1, mk_none()); } | |
1045 | | pat_vec_elts DOTDOT { $$ = mk_node("PatVec", 2, $1, mk_none()); } | |
1046 | | pat_vec_elts ',' DOTDOT { $$ = mk_node("PatVec", 2, $1, mk_none()); } | |
1047 | | pat_vec_elts DOTDOT ',' pat_vec_elts { $$ = mk_node("PatVec", 2, $1, $4); } | |
1048 | | pat_vec_elts DOTDOT ',' pat_vec_elts ',' { $$ = mk_node("PatVec", 2, $1, $4); } | |
1049 | | pat_vec_elts ',' DOTDOT ',' pat_vec_elts { $$ = mk_node("PatVec", 2, $1, $5); } | |
1050 | | pat_vec_elts ',' DOTDOT ',' pat_vec_elts ',' { $$ = mk_node("PatVec", 2, $1, $5); } | |
1051 | | DOTDOT ',' pat_vec_elts { $$ = mk_node("PatVec", 2, mk_none(), $3); } | |
1052 | | DOTDOT ',' pat_vec_elts ',' { $$ = mk_node("PatVec", 2, mk_none(), $3); } | |
1053 | | DOTDOT { $$ = mk_node("PatVec", 2, mk_none(), mk_none()); } | |
1054 | | %empty { $$ = mk_node("PatVec", 2, mk_none(), mk_none()); } | |
1055 | ; | |
1056 | ||
1057 | pat_vec_elts | |
1058 | : pat { $$ = mk_node("PatVecElts", 1, $1); } | |
1059 | | pat_vec_elts ',' pat { $$ = ext_node($1, 1, $3); } | |
1060 | ; | |
1061 | ||
1062 | //////////////////////////////////////////////////////////////////////// | |
1063 | // Part 3: Types | |
1064 | //////////////////////////////////////////////////////////////////////// | |
1065 | ||
1066 | ty | |
1067 | : ty_prim | |
1068 | | ty_closure | |
1069 | | '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, $2, $3, $6); } | |
1070 | | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, mk_node("TyQualifiedPath", 3, $2, $3, $6), $7, $10); } | |
1071 | | '(' ty_sums ')' { $$ = mk_node("TyTup", 1, $2); } | |
1072 | | '(' ty_sums ',' ')' { $$ = mk_node("TyTup", 1, $2); } | |
1073 | | '(' ')' { $$ = mk_atom("TyNil"); } | |
1074 | ; | |
1075 | ||
1076 | ty_prim | |
abe05a73 XL |
1077 | : %prec IDENT path_generic_args_without_colons { $$ = mk_node("TyPath", 2, mk_node("global", 1, mk_atom("false")), $1); } |
1078 | | %prec IDENT MOD_SEP path_generic_args_without_colons { $$ = mk_node("TyPath", 2, mk_node("global", 1, mk_atom("true")), $2); } | |
1079 | | %prec IDENT SELF MOD_SEP path_generic_args_without_colons { $$ = mk_node("TyPath", 2, mk_node("self", 1, mk_atom("true")), $3); } | |
1080 | | %prec IDENT path_generic_args_without_colons '!' maybe_ident delimited_token_trees { $$ = mk_node("TyMacro", 3, $1, $3, $4); } | |
1081 | | %prec IDENT MOD_SEP path_generic_args_without_colons '!' maybe_ident delimited_token_trees { $$ = mk_node("TyMacro", 3, $2, $4, $5); } | |
1082 | | BOX ty { $$ = mk_node("TyBox", 1, $2); } | |
1083 | | '*' maybe_mut_or_const ty { $$ = mk_node("TyPtr", 2, $2, $3); } | |
1084 | | '&' ty { $$ = mk_node("TyRptr", 2, mk_atom("MutImmutable"), $2); } | |
1085 | | '&' MUT ty { $$ = mk_node("TyRptr", 2, mk_atom("MutMutable"), $3); } | |
1086 | | ANDAND ty { $$ = mk_node("TyRptr", 1, mk_node("TyRptr", 2, mk_atom("MutImmutable"), $2)); } | |
1087 | | ANDAND MUT ty { $$ = mk_node("TyRptr", 1, mk_node("TyRptr", 2, mk_atom("MutMutable"), $3)); } | |
1088 | | '&' lifetime maybe_mut ty { $$ = mk_node("TyRptr", 3, $2, $3, $4); } | |
1089 | | ANDAND lifetime maybe_mut ty { $$ = mk_node("TyRptr", 1, mk_node("TyRptr", 3, $2, $3, $4)); } | |
1090 | | '[' ty ']' { $$ = mk_node("TyVec", 1, $2); } | |
1091 | | '[' ty ',' DOTDOT expr ']' { $$ = mk_node("TyFixedLengthVec", 2, $2, $5); } | |
1092 | | '[' ty ';' expr ']' { $$ = mk_node("TyFixedLengthVec", 2, $2, $4); } | |
1093 | | TYPEOF '(' expr ')' { $$ = mk_node("TyTypeof", 1, $3); } | |
1094 | | UNDERSCORE { $$ = mk_atom("TyInfer"); } | |
476ff2be | 1095 | | ty_bare_fn |
476ff2be SL |
1096 | | for_in_type |
1097 | ; | |
1098 | ||
1099 | ty_bare_fn | |
1100 | : FN ty_fn_decl { $$ = $2; } | |
1101 | | UNSAFE FN ty_fn_decl { $$ = $3; } | |
1102 | | EXTERN maybe_abi FN ty_fn_decl { $$ = $4; } | |
1103 | | UNSAFE EXTERN maybe_abi FN ty_fn_decl { $$ = $5; } | |
1104 | ; | |
1105 | ||
1106 | ty_fn_decl | |
1107 | : generic_params fn_anon_params ret_ty { $$ = mk_node("TyFnDecl", 3, $1, $2, $3); } | |
1108 | ; | |
1109 | ||
1110 | ty_closure | |
1111 | : UNSAFE '|' anon_params '|' maybe_bounds ret_ty { $$ = mk_node("TyClosure", 3, $3, $5, $6); } | |
1112 | | '|' anon_params '|' maybe_bounds ret_ty { $$ = mk_node("TyClosure", 3, $2, $4, $5); } | |
1113 | | UNSAFE OROR maybe_bounds ret_ty { $$ = mk_node("TyClosure", 2, $3, $4); } | |
1114 | | OROR maybe_bounds ret_ty { $$ = mk_node("TyClosure", 2, $2, $3); } | |
1115 | ; | |
1116 | ||
476ff2be SL |
1117 | for_in_type |
1118 | : FOR '<' maybe_lifetimes '>' for_in_type_suffix { $$ = mk_node("ForInType", 2, $3, $5); } | |
1119 | ; | |
1120 | ||
1121 | for_in_type_suffix | |
abe05a73 | 1122 | : ty_bare_fn |
476ff2be SL |
1123 | | trait_ref |
1124 | | ty_closure | |
1125 | ; | |
1126 | ||
1127 | maybe_mut | |
1128 | : MUT { $$ = mk_atom("MutMutable"); } | |
1129 | | %prec MUT %empty { $$ = mk_atom("MutImmutable"); } | |
1130 | ; | |
1131 | ||
1132 | maybe_mut_or_const | |
1133 | : MUT { $$ = mk_atom("MutMutable"); } | |
1134 | | CONST { $$ = mk_atom("MutImmutable"); } | |
1135 | | %empty { $$ = mk_atom("MutImmutable"); } | |
1136 | ; | |
1137 | ||
1138 | ty_qualified_path_and_generic_values | |
1139 | : ty_qualified_path maybe_bindings | |
1140 | { | |
1141 | $$ = mk_node("GenericValues", 3, mk_none(), mk_node("TySums", 1, mk_node("TySum", 1, $1)), $2); | |
1142 | } | |
1143 | | ty_qualified_path ',' ty_sums maybe_bindings | |
1144 | { | |
1145 | $$ = mk_node("GenericValues", 3, mk_none(), mk_node("TySums", 2, $1, $3), $4); | |
1146 | } | |
1147 | ; | |
1148 | ||
1149 | ty_qualified_path | |
1150 | : ty_sum AS trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, $1, $3, $6); } | |
1151 | | ty_sum AS trait_ref '>' MOD_SEP ident '+' ty_param_bounds { $$ = mk_node("TyQualifiedPath", 3, $1, $3, $6); } | |
1152 | ; | |
1153 | ||
1154 | maybe_ty_sums | |
1155 | : ty_sums | |
1156 | | ty_sums ',' | |
1157 | | %empty { $$ = mk_none(); } | |
1158 | ; | |
1159 | ||
1160 | ty_sums | |
1161 | : ty_sum { $$ = mk_node("TySums", 1, $1); } | |
1162 | | ty_sums ',' ty_sum { $$ = ext_node($1, 1, $3); } | |
1163 | ; | |
1164 | ||
1165 | ty_sum | |
abe05a73 XL |
1166 | : ty_sum_elt { $$ = mk_node("TySum", 1, $1); } |
1167 | | ty_sum '+' ty_sum_elt { $$ = ext_node($1, 1, $3); } | |
1168 | ; | |
1169 | ||
1170 | ty_sum_elt | |
1171 | : ty | |
1172 | | lifetime | |
476ff2be SL |
1173 | ; |
1174 | ||
1175 | ty_prim_sum | |
abe05a73 XL |
1176 | : ty_prim_sum_elt { $$ = mk_node("TySum", 1, $1); } |
1177 | | ty_prim_sum '+' ty_prim_sum_elt { $$ = ext_node($1, 1, $3); } | |
1178 | ; | |
1179 | ||
1180 | ty_prim_sum_elt | |
1181 | : ty_prim | |
1182 | | lifetime | |
476ff2be SL |
1183 | ; |
1184 | ||
1185 | maybe_ty_param_bounds | |
1186 | : ':' ty_param_bounds { $$ = $2; } | |
1187 | | %empty { $$ = mk_none(); } | |
1188 | ; | |
1189 | ||
1190 | ty_param_bounds | |
1191 | : boundseq | |
1192 | | %empty { $$ = mk_none(); } | |
1193 | ; | |
1194 | ||
1195 | boundseq | |
1196 | : polybound | |
1197 | | boundseq '+' polybound { $$ = ext_node($1, 1, $3); } | |
1198 | ; | |
1199 | ||
1200 | polybound | |
1201 | : FOR '<' maybe_lifetimes '>' bound { $$ = mk_node("PolyBound", 2, $3, $5); } | |
1202 | | bound | |
abe05a73 | 1203 | | '?' FOR '<' maybe_lifetimes '>' bound { $$ = mk_node("PolyBound", 2, $4, $6); } |
476ff2be SL |
1204 | | '?' bound { $$ = $2; } |
1205 | ; | |
1206 | ||
1207 | bindings | |
1208 | : binding { $$ = mk_node("Bindings", 1, $1); } | |
1209 | | bindings ',' binding { $$ = ext_node($1, 1, $3); } | |
1210 | ; | |
1211 | ||
1212 | binding | |
1213 | : ident '=' ty { mk_node("Binding", 2, $1, $3); } | |
1214 | ; | |
1215 | ||
1216 | ty_param | |
1217 | : ident maybe_ty_param_bounds maybe_ty_default { $$ = mk_node("TyParam", 3, $1, $2, $3); } | |
1218 | | ident '?' ident maybe_ty_param_bounds maybe_ty_default { $$ = mk_node("TyParam", 4, $1, $3, $4, $5); } | |
1219 | ; | |
1220 | ||
1221 | maybe_bounds | |
1222 | : %prec SHIFTPLUS | |
1223 | ':' bounds { $$ = $2; } | |
1224 | | %prec SHIFTPLUS %empty { $$ = mk_none(); } | |
1225 | ; | |
1226 | ||
1227 | bounds | |
1228 | : bound { $$ = mk_node("bounds", 1, $1); } | |
1229 | | bounds '+' bound { $$ = ext_node($1, 1, $3); } | |
1230 | ; | |
1231 | ||
1232 | bound | |
1233 | : lifetime | |
1234 | | trait_ref | |
1235 | ; | |
1236 | ||
1237 | maybe_ltbounds | |
1238 | : %prec SHIFTPLUS | |
1239 | ':' ltbounds { $$ = $2; } | |
1240 | | %empty { $$ = mk_none(); } | |
1241 | ; | |
1242 | ||
1243 | ltbounds | |
1244 | : lifetime { $$ = mk_node("ltbounds", 1, $1); } | |
1245 | | ltbounds '+' lifetime { $$ = ext_node($1, 1, $3); } | |
1246 | ; | |
1247 | ||
1248 | maybe_ty_default | |
1249 | : '=' ty_sum { $$ = mk_node("TyDefault", 1, $2); } | |
1250 | | %empty { $$ = mk_none(); } | |
1251 | ; | |
1252 | ||
1253 | maybe_lifetimes | |
1254 | : lifetimes | |
1255 | | lifetimes ',' | |
1256 | | %empty { $$ = mk_none(); } | |
1257 | ; | |
1258 | ||
1259 | lifetimes | |
1260 | : lifetime_and_bounds { $$ = mk_node("Lifetimes", 1, $1); } | |
1261 | | lifetimes ',' lifetime_and_bounds { $$ = ext_node($1, 1, $3); } | |
1262 | ; | |
1263 | ||
1264 | lifetime_and_bounds | |
1265 | : LIFETIME maybe_ltbounds { $$ = mk_node("lifetime", 2, mk_atom(yytext), $2); } | |
1266 | | STATIC_LIFETIME { $$ = mk_atom("static_lifetime"); } | |
1267 | ; | |
1268 | ||
1269 | lifetime | |
1270 | : LIFETIME { $$ = mk_node("lifetime", 1, mk_atom(yytext)); } | |
1271 | | STATIC_LIFETIME { $$ = mk_atom("static_lifetime"); } | |
1272 | ; | |
1273 | ||
1274 | trait_ref | |
1275 | : %prec IDENT path_generic_args_without_colons | |
1276 | | %prec IDENT MOD_SEP path_generic_args_without_colons { $$ = $2; } | |
1277 | ; | |
1278 | ||
1279 | //////////////////////////////////////////////////////////////////////// | |
1280 | // Part 4: Blocks, statements, and expressions | |
1281 | //////////////////////////////////////////////////////////////////////// | |
1282 | ||
1283 | inner_attrs_and_block | |
1284 | : '{' maybe_inner_attrs maybe_stmts '}' { $$ = mk_node("ExprBlock", 2, $2, $3); } | |
1285 | ; | |
1286 | ||
1287 | block | |
1288 | : '{' maybe_stmts '}' { $$ = mk_node("ExprBlock", 1, $2); } | |
1289 | ; | |
1290 | ||
1291 | maybe_stmts | |
1292 | : stmts | |
1293 | | stmts nonblock_expr { $$ = ext_node($1, 1, $2); } | |
1294 | | nonblock_expr | |
1295 | | %empty { $$ = mk_none(); } | |
1296 | ; | |
1297 | ||
1298 | // There are two sub-grammars within a "stmts: exprs" derivation | |
1299 | // depending on whether each stmt-expr is a block-expr form; this is to | |
1300 | // handle the "semicolon rule" for stmt sequencing that permits | |
1301 | // writing | |
1302 | // | |
1303 | // if foo { bar } 10 | |
1304 | // | |
1305 | // as a sequence of two stmts (one if-expr stmt, one lit-10-expr | |
1306 | // stmt). Unfortunately by permitting juxtaposition of exprs in | |
1307 | // sequence like that, the non-block expr grammar has to have a | |
1308 | // second limited sub-grammar that excludes the prefix exprs that | |
1309 | // are ambiguous with binops. That is to say: | |
1310 | // | |
1311 | // {10} - 1 | |
1312 | // | |
1313 | // should parse as (progn (progn 10) (- 1)) not (- (progn 10) 1), that | |
1314 | // is to say, two statements rather than one, at least according to | |
1315 | // the mainline rust parser. | |
1316 | // | |
1317 | // So we wind up with a 3-way split in exprs that occur in stmt lists: | |
1318 | // block, nonblock-prefix, and nonblock-nonprefix. | |
1319 | // | |
1320 | // In non-stmts contexts, expr can relax this trichotomy. | |
476ff2be SL |
1321 | |
1322 | stmts | |
1323 | : stmt { $$ = mk_node("stmts", 1, $1); } | |
1324 | | stmts stmt { $$ = ext_node($1, 1, $2); } | |
1325 | ; | |
1326 | ||
1327 | stmt | |
abe05a73 | 1328 | : maybe_outer_attrs let { $$ = $2; } |
476ff2be SL |
1329 | | stmt_item |
1330 | | PUB stmt_item { $$ = $2; } | |
1331 | | outer_attrs stmt_item { $$ = $2; } | |
1332 | | outer_attrs PUB stmt_item { $$ = $3; } | |
1333 | | full_block_expr | |
abe05a73 XL |
1334 | | maybe_outer_attrs block { $$ = $2; } |
1335 | | nonblock_expr ';' | |
1336 | | outer_attrs nonblock_expr ';' { $$ = $2; } | |
476ff2be SL |
1337 | | ';' { $$ = mk_none(); } |
1338 | ; | |
1339 | ||
1340 | maybe_exprs | |
1341 | : exprs | |
1342 | | exprs ',' | |
1343 | | %empty { $$ = mk_none(); } | |
1344 | ; | |
1345 | ||
1346 | maybe_expr | |
1347 | : expr | |
1348 | | %empty { $$ = mk_none(); } | |
1349 | ; | |
1350 | ||
1351 | exprs | |
1352 | : expr { $$ = mk_node("exprs", 1, $1); } | |
1353 | | exprs ',' expr { $$ = ext_node($1, 1, $3); } | |
1354 | ; | |
1355 | ||
1356 | path_expr | |
1357 | : path_generic_args_with_colons | |
1358 | | MOD_SEP path_generic_args_with_colons { $$ = $2; } | |
1359 | | SELF MOD_SEP path_generic_args_with_colons { $$ = mk_node("SelfPath", 1, $3); } | |
1360 | ; | |
1361 | ||
1362 | // A path with a lifetime and type parameters with double colons before | |
1363 | // the type parameters; e.g. `foo::bar::<'a>::Baz::<T>` | |
1364 | // | |
1365 | // These show up in expr context, in order to disambiguate from "less-than" | |
1366 | // expressions. | |
1367 | path_generic_args_with_colons | |
1368 | : ident { $$ = mk_node("components", 1, $1); } | |
abe05a73 | 1369 | | SUPER { $$ = mk_atom("Super"); } |
476ff2be | 1370 | | path_generic_args_with_colons MOD_SEP ident { $$ = ext_node($1, 1, $3); } |
abe05a73 | 1371 | | path_generic_args_with_colons MOD_SEP SUPER { $$ = ext_node($1, 1, mk_atom("Super")); } |
476ff2be SL |
1372 | | path_generic_args_with_colons MOD_SEP generic_args { $$ = ext_node($1, 1, $3); } |
1373 | ; | |
1374 | ||
1375 | // the braces-delimited macro is a block_expr so it doesn't appear here | |
1376 | macro_expr | |
1377 | : path_expr '!' maybe_ident parens_delimited_token_trees { $$ = mk_node("MacroExpr", 3, $1, $3, $4); } | |
1378 | | path_expr '!' maybe_ident brackets_delimited_token_trees { $$ = mk_node("MacroExpr", 3, $1, $3, $4); } | |
1379 | ; | |
1380 | ||
1381 | nonblock_expr | |
1382 | : lit { $$ = mk_node("ExprLit", 1, $1); } | |
1383 | | %prec IDENT | |
1384 | path_expr { $$ = mk_node("ExprPath", 1, $1); } | |
1385 | | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); } | |
1386 | | macro_expr { $$ = mk_node("ExprMac", 1, $1); } | |
1387 | | path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); } | |
abe05a73 | 1388 | | nonblock_expr '?' { $$ = mk_node("ExprTry", 1, $1); } |
476ff2be SL |
1389 | | nonblock_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); } |
1390 | | nonblock_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); } | |
1391 | | nonblock_expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); } | |
1392 | | nonblock_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); } | |
1393 | | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); } | |
1394 | | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); } | |
1395 | | CONTINUE { $$ = mk_node("ExprAgain", 0); } | |
1396 | | CONTINUE lifetime { $$ = mk_node("ExprAgain", 1, $2); } | |
1397 | | RETURN { $$ = mk_node("ExprRet", 0); } | |
1398 | | RETURN expr { $$ = mk_node("ExprRet", 1, $2); } | |
1399 | | BREAK { $$ = mk_node("ExprBreak", 0); } | |
1400 | | BREAK lifetime { $$ = mk_node("ExprBreak", 1, $2); } | |
abe05a73 XL |
1401 | | YIELD { $$ = mk_node("ExprYield", 0); } |
1402 | | YIELD expr { $$ = mk_node("ExprYield", 1, $2); } | |
476ff2be SL |
1403 | | nonblock_expr LARROW expr { $$ = mk_node("ExprInPlace", 2, $1, $3); } |
1404 | | nonblock_expr '=' expr { $$ = mk_node("ExprAssign", 2, $1, $3); } | |
1405 | | nonblock_expr SHLEQ expr { $$ = mk_node("ExprAssignShl", 2, $1, $3); } | |
1406 | | nonblock_expr SHREQ expr { $$ = mk_node("ExprAssignShr", 2, $1, $3); } | |
1407 | | nonblock_expr MINUSEQ expr { $$ = mk_node("ExprAssignSub", 2, $1, $3); } | |
1408 | | nonblock_expr ANDEQ expr { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); } | |
1409 | | nonblock_expr OREQ expr { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); } | |
1410 | | nonblock_expr PLUSEQ expr { $$ = mk_node("ExprAssignAdd", 2, $1, $3); } | |
1411 | | nonblock_expr STAREQ expr { $$ = mk_node("ExprAssignMul", 2, $1, $3); } | |
1412 | | nonblock_expr SLASHEQ expr { $$ = mk_node("ExprAssignDiv", 2, $1, $3); } | |
1413 | | nonblock_expr CARETEQ expr { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); } | |
1414 | | nonblock_expr PERCENTEQ expr { $$ = mk_node("ExprAssignRem", 2, $1, $3); } | |
1415 | | nonblock_expr OROR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); } | |
1416 | | nonblock_expr ANDAND expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); } | |
1417 | | nonblock_expr EQEQ expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); } | |
1418 | | nonblock_expr NE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); } | |
1419 | | nonblock_expr '<' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); } | |
1420 | | nonblock_expr '>' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); } | |
1421 | | nonblock_expr LE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); } | |
1422 | | nonblock_expr GE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); } | |
1423 | | nonblock_expr '|' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); } | |
1424 | | nonblock_expr '^' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); } | |
1425 | | nonblock_expr '&' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); } | |
1426 | | nonblock_expr SHL expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); } | |
1427 | | nonblock_expr SHR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); } | |
1428 | | nonblock_expr '+' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); } | |
1429 | | nonblock_expr '-' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); } | |
1430 | | nonblock_expr '*' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); } | |
1431 | | nonblock_expr '/' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); } | |
1432 | | nonblock_expr '%' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); } | |
1433 | | nonblock_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); } | |
1434 | | nonblock_expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); } | |
1435 | | DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); } | |
1436 | | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); } | |
1437 | | nonblock_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); } | |
abe05a73 XL |
1438 | | nonblock_expr ':' ty { $$ = mk_node("ExprTypeAscr", 2, $1, $3); } |
1439 | | BOX expr { $$ = mk_node("ExprBox", 1, $2); } | |
476ff2be SL |
1440 | | expr_qualified_path |
1441 | | nonblock_prefix_expr | |
1442 | ; | |
1443 | ||
1444 | expr | |
1445 | : lit { $$ = mk_node("ExprLit", 1, $1); } | |
1446 | | %prec IDENT | |
1447 | path_expr { $$ = mk_node("ExprPath", 1, $1); } | |
1448 | | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); } | |
1449 | | macro_expr { $$ = mk_node("ExprMac", 1, $1); } | |
1450 | | path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); } | |
abe05a73 | 1451 | | expr '?' { $$ = mk_node("ExprTry", 1, $1); } |
476ff2be SL |
1452 | | expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); } |
1453 | | expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); } | |
1454 | | expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); } | |
1455 | | expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); } | |
1456 | | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); } | |
1457 | | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); } | |
1458 | | CONTINUE { $$ = mk_node("ExprAgain", 0); } | |
1459 | | CONTINUE ident { $$ = mk_node("ExprAgain", 1, $2); } | |
1460 | | RETURN { $$ = mk_node("ExprRet", 0); } | |
1461 | | RETURN expr { $$ = mk_node("ExprRet", 1, $2); } | |
1462 | | BREAK { $$ = mk_node("ExprBreak", 0); } | |
1463 | | BREAK ident { $$ = mk_node("ExprBreak", 1, $2); } | |
abe05a73 XL |
1464 | | YIELD { $$ = mk_node("ExprYield", 0); } |
1465 | | YIELD expr { $$ = mk_node("ExprYield", 1, $2); } | |
476ff2be SL |
1466 | | expr LARROW expr { $$ = mk_node("ExprInPlace", 2, $1, $3); } |
1467 | | expr '=' expr { $$ = mk_node("ExprAssign", 2, $1, $3); } | |
1468 | | expr SHLEQ expr { $$ = mk_node("ExprAssignShl", 2, $1, $3); } | |
1469 | | expr SHREQ expr { $$ = mk_node("ExprAssignShr", 2, $1, $3); } | |
1470 | | expr MINUSEQ expr { $$ = mk_node("ExprAssignSub", 2, $1, $3); } | |
1471 | | expr ANDEQ expr { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); } | |
1472 | | expr OREQ expr { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); } | |
1473 | | expr PLUSEQ expr { $$ = mk_node("ExprAssignAdd", 2, $1, $3); } | |
1474 | | expr STAREQ expr { $$ = mk_node("ExprAssignMul", 2, $1, $3); } | |
1475 | | expr SLASHEQ expr { $$ = mk_node("ExprAssignDiv", 2, $1, $3); } | |
1476 | | expr CARETEQ expr { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); } | |
1477 | | expr PERCENTEQ expr { $$ = mk_node("ExprAssignRem", 2, $1, $3); } | |
1478 | | expr OROR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); } | |
1479 | | expr ANDAND expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); } | |
1480 | | expr EQEQ expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); } | |
1481 | | expr NE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); } | |
1482 | | expr '<' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); } | |
1483 | | expr '>' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); } | |
1484 | | expr LE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); } | |
1485 | | expr GE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); } | |
1486 | | expr '|' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); } | |
1487 | | expr '^' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); } | |
1488 | | expr '&' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); } | |
1489 | | expr SHL expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); } | |
1490 | | expr SHR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); } | |
1491 | | expr '+' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); } | |
1492 | | expr '-' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); } | |
1493 | | expr '*' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); } | |
1494 | | expr '/' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); } | |
1495 | | expr '%' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); } | |
1496 | | expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); } | |
1497 | | expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); } | |
1498 | | DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); } | |
1499 | | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); } | |
1500 | | expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); } | |
abe05a73 XL |
1501 | | expr ':' ty { $$ = mk_node("ExprTypeAscr", 2, $1, $3); } |
1502 | | BOX expr { $$ = mk_node("ExprBox", 1, $2); } | |
476ff2be SL |
1503 | | expr_qualified_path |
1504 | | block_expr | |
1505 | | block | |
1506 | | nonblock_prefix_expr | |
1507 | ; | |
1508 | ||
1509 | expr_nostruct | |
1510 | : lit { $$ = mk_node("ExprLit", 1, $1); } | |
1511 | | %prec IDENT | |
1512 | path_expr { $$ = mk_node("ExprPath", 1, $1); } | |
1513 | | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); } | |
1514 | | macro_expr { $$ = mk_node("ExprMac", 1, $1); } | |
abe05a73 | 1515 | | expr_nostruct '?' { $$ = mk_node("ExprTry", 1, $1); } |
476ff2be SL |
1516 | | expr_nostruct '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); } |
1517 | | expr_nostruct '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); } | |
1518 | | expr_nostruct '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); } | |
1519 | | expr_nostruct '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); } | |
1520 | | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); } | |
1521 | | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); } | |
1522 | | CONTINUE { $$ = mk_node("ExprAgain", 0); } | |
1523 | | CONTINUE ident { $$ = mk_node("ExprAgain", 1, $2); } | |
1524 | | RETURN { $$ = mk_node("ExprRet", 0); } | |
1525 | | RETURN expr { $$ = mk_node("ExprRet", 1, $2); } | |
1526 | | BREAK { $$ = mk_node("ExprBreak", 0); } | |
1527 | | BREAK ident { $$ = mk_node("ExprBreak", 1, $2); } | |
abe05a73 XL |
1528 | | YIELD { $$ = mk_node("ExprYield", 0); } |
1529 | | YIELD expr { $$ = mk_node("ExprYield", 1, $2); } | |
476ff2be SL |
1530 | | expr_nostruct LARROW expr_nostruct { $$ = mk_node("ExprInPlace", 2, $1, $3); } |
1531 | | expr_nostruct '=' expr_nostruct { $$ = mk_node("ExprAssign", 2, $1, $3); } | |
1532 | | expr_nostruct SHLEQ expr_nostruct { $$ = mk_node("ExprAssignShl", 2, $1, $3); } | |
1533 | | expr_nostruct SHREQ expr_nostruct { $$ = mk_node("ExprAssignShr", 2, $1, $3); } | |
1534 | | expr_nostruct MINUSEQ expr_nostruct { $$ = mk_node("ExprAssignSub", 2, $1, $3); } | |
1535 | | expr_nostruct ANDEQ expr_nostruct { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); } | |
1536 | | expr_nostruct OREQ expr_nostruct { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); } | |
1537 | | expr_nostruct PLUSEQ expr_nostruct { $$ = mk_node("ExprAssignAdd", 2, $1, $3); } | |
1538 | | expr_nostruct STAREQ expr_nostruct { $$ = mk_node("ExprAssignMul", 2, $1, $3); } | |
1539 | | expr_nostruct SLASHEQ expr_nostruct { $$ = mk_node("ExprAssignDiv", 2, $1, $3); } | |
1540 | | expr_nostruct CARETEQ expr_nostruct { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); } | |
1541 | | expr_nostruct PERCENTEQ expr_nostruct { $$ = mk_node("ExprAssignRem", 2, $1, $3); } | |
1542 | | expr_nostruct OROR expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); } | |
1543 | | expr_nostruct ANDAND expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); } | |
1544 | | expr_nostruct EQEQ expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); } | |
1545 | | expr_nostruct NE expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); } | |
1546 | | expr_nostruct '<' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); } | |
1547 | | expr_nostruct '>' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); } | |
1548 | | expr_nostruct LE expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); } | |
1549 | | expr_nostruct GE expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); } | |
1550 | | expr_nostruct '|' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); } | |
1551 | | expr_nostruct '^' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); } | |
1552 | | expr_nostruct '&' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); } | |
1553 | | expr_nostruct SHL expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); } | |
1554 | | expr_nostruct SHR expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); } | |
1555 | | expr_nostruct '+' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); } | |
1556 | | expr_nostruct '-' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); } | |
1557 | | expr_nostruct '*' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); } | |
1558 | | expr_nostruct '/' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); } | |
1559 | | expr_nostruct '%' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); } | |
1560 | | expr_nostruct DOTDOT %prec RANGE { $$ = mk_node("ExprRange", 2, $1, mk_none()); } | |
1561 | | expr_nostruct DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, $1, $3); } | |
1562 | | DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, mk_none(), $2); } | |
1563 | | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); } | |
1564 | | expr_nostruct AS ty { $$ = mk_node("ExprCast", 2, $1, $3); } | |
abe05a73 XL |
1565 | | expr_nostruct ':' ty { $$ = mk_node("ExprTypeAscr", 2, $1, $3); } |
1566 | | BOX expr { $$ = mk_node("ExprBox", 1, $2); } | |
476ff2be SL |
1567 | | expr_qualified_path |
1568 | | block_expr | |
1569 | | block | |
1570 | | nonblock_prefix_expr_nostruct | |
1571 | ; | |
1572 | ||
1573 | nonblock_prefix_expr_nostruct | |
1574 | : '-' expr_nostruct { $$ = mk_node("ExprUnary", 2, mk_atom("UnNeg"), $2); } | |
1575 | | '!' expr_nostruct { $$ = mk_node("ExprUnary", 2, mk_atom("UnNot"), $2); } | |
1576 | | '*' expr_nostruct { $$ = mk_node("ExprUnary", 2, mk_atom("UnDeref"), $2); } | |
1577 | | '&' maybe_mut expr_nostruct { $$ = mk_node("ExprAddrOf", 2, $2, $3); } | |
1578 | | ANDAND maybe_mut expr_nostruct { $$ = mk_node("ExprAddrOf", 1, mk_node("ExprAddrOf", 2, $2, $3)); } | |
1579 | | lambda_expr_nostruct | |
1580 | | MOVE lambda_expr_nostruct { $$ = $2; } | |
476ff2be SL |
1581 | ; |
1582 | ||
1583 | nonblock_prefix_expr | |
1584 | : '-' expr { $$ = mk_node("ExprUnary", 2, mk_atom("UnNeg"), $2); } | |
1585 | | '!' expr { $$ = mk_node("ExprUnary", 2, mk_atom("UnNot"), $2); } | |
1586 | | '*' expr { $$ = mk_node("ExprUnary", 2, mk_atom("UnDeref"), $2); } | |
1587 | | '&' maybe_mut expr { $$ = mk_node("ExprAddrOf", 2, $2, $3); } | |
1588 | | ANDAND maybe_mut expr { $$ = mk_node("ExprAddrOf", 1, mk_node("ExprAddrOf", 2, $2, $3)); } | |
1589 | | lambda_expr | |
1590 | | MOVE lambda_expr { $$ = $2; } | |
476ff2be SL |
1591 | ; |
1592 | ||
1593 | expr_qualified_path | |
1594 | : '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_qpath_params | |
1595 | { | |
1596 | $$ = mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7); | |
1597 | } | |
1598 | | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident | |
1599 | { | |
1600 | $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 3, $2, $3, $6), $7, $10); | |
1601 | } | |
1602 | | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args maybe_as_trait_ref '>' MOD_SEP ident | |
1603 | { | |
1604 | $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7), $8, $11); | |
1605 | } | |
1606 | | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident generic_args | |
1607 | { | |
1608 | $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 3, $2, $3, $6), $7, $10, $11); | |
1609 | } | |
1610 | | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args maybe_as_trait_ref '>' MOD_SEP ident generic_args | |
1611 | { | |
1612 | $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7), $8, $11, $12); | |
1613 | } | |
1614 | ||
1615 | maybe_qpath_params | |
1616 | : MOD_SEP generic_args { $$ = $2; } | |
1617 | | %empty { $$ = mk_none(); } | |
1618 | ; | |
1619 | ||
1620 | maybe_as_trait_ref | |
1621 | : AS trait_ref { $$ = $2; } | |
1622 | | %empty { $$ = mk_none(); } | |
1623 | ; | |
1624 | ||
1625 | lambda_expr | |
1626 | : %prec LAMBDA | |
abe05a73 | 1627 | OROR ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); } |
476ff2be | 1628 | | %prec LAMBDA |
abe05a73 | 1629 | '|' '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $3, $4); } |
476ff2be | 1630 | | %prec LAMBDA |
abe05a73 | 1631 | '|' inferrable_params '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, $2, $4, $5); } |
476ff2be | 1632 | | %prec LAMBDA |
abe05a73 | 1633 | '|' inferrable_params OROR lambda_expr_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $2, mk_none(), $4); } |
476ff2be SL |
1634 | ; |
1635 | ||
abe05a73 | 1636 | lambda_expr_no_first_bar |
476ff2be | 1637 | : %prec LAMBDA |
abe05a73 | 1638 | '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); } |
476ff2be | 1639 | | %prec LAMBDA |
abe05a73 | 1640 | inferrable_params '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, $1, $3, $4); } |
476ff2be | 1641 | | %prec LAMBDA |
abe05a73 | 1642 | inferrable_params OROR lambda_expr_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $1, mk_none(), $3); } |
476ff2be SL |
1643 | ; |
1644 | ||
abe05a73 | 1645 | lambda_expr_nostruct |
476ff2be | 1646 | : %prec LAMBDA |
abe05a73 XL |
1647 | OROR expr_nostruct { $$ = mk_node("ExprFnBlock", 2, mk_none(), $2); } |
1648 | | %prec LAMBDA | |
1649 | '|' '|' ret_ty expr_nostruct { $$ = mk_node("ExprFnBlock", 3, mk_none(), $3, $4); } | |
476ff2be | 1650 | | %prec LAMBDA |
abe05a73 XL |
1651 | '|' inferrable_params '|' expr_nostruct { $$ = mk_node("ExprFnBlock", 2, $2, $4); } |
1652 | | %prec LAMBDA | |
1653 | '|' inferrable_params OROR lambda_expr_nostruct_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $2, mk_none(), $4); } | |
476ff2be SL |
1654 | ; |
1655 | ||
abe05a73 | 1656 | lambda_expr_nostruct_no_first_bar |
476ff2be | 1657 | : %prec LAMBDA |
abe05a73 XL |
1658 | '|' ret_ty expr_nostruct { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); } |
1659 | | %prec LAMBDA | |
1660 | inferrable_params '|' ret_ty expr_nostruct { $$ = mk_node("ExprFnBlock", 3, $1, $3, $4); } | |
476ff2be | 1661 | | %prec LAMBDA |
abe05a73 | 1662 | inferrable_params OROR lambda_expr_nostruct_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $1, mk_none(), $3); } |
476ff2be SL |
1663 | ; |
1664 | ||
1665 | vec_expr | |
1666 | : maybe_exprs | |
1667 | | exprs ';' expr { $$ = mk_node("VecRepeat", 2, $1, $3); } | |
1668 | ; | |
1669 | ||
1670 | struct_expr_fields | |
1671 | : field_inits | |
1672 | | field_inits ',' | |
1673 | | maybe_field_inits default_field_init { $$ = ext_node($1, 1, $2); } | |
abe05a73 | 1674 | | %empty { $$ = mk_none(); } |
476ff2be SL |
1675 | ; |
1676 | ||
1677 | maybe_field_inits | |
1678 | : field_inits | |
1679 | | field_inits ',' | |
1680 | | %empty { $$ = mk_none(); } | |
1681 | ; | |
1682 | ||
1683 | field_inits | |
1684 | : field_init { $$ = mk_node("FieldInits", 1, $1); } | |
1685 | | field_inits ',' field_init { $$ = ext_node($1, 1, $3); } | |
1686 | ; | |
1687 | ||
1688 | field_init | |
abe05a73 XL |
1689 | : ident { $$ = mk_node("FieldInit", 1, $1); } |
1690 | | ident ':' expr { $$ = mk_node("FieldInit", 2, $1, $3); } | |
1691 | | LIT_INTEGER ':' expr { $$ = mk_node("FieldInit", 2, mk_atom(yytext), $3); } | |
476ff2be SL |
1692 | ; |
1693 | ||
1694 | default_field_init | |
1695 | : DOTDOT expr { $$ = mk_node("DefaultFieldInit", 1, $2); } | |
1696 | ; | |
1697 | ||
1698 | block_expr | |
1699 | : expr_match | |
1700 | | expr_if | |
1701 | | expr_if_let | |
1702 | | expr_while | |
1703 | | expr_while_let | |
1704 | | expr_loop | |
1705 | | expr_for | |
1706 | | UNSAFE block { $$ = mk_node("UnsafeBlock", 1, $2); } | |
1707 | | path_expr '!' maybe_ident braces_delimited_token_trees { $$ = mk_node("Macro", 3, $1, $3, $4); } | |
1708 | ; | |
1709 | ||
1710 | full_block_expr | |
1711 | : block_expr | |
abe05a73 XL |
1712 | | block_expr_dot |
1713 | ; | |
1714 | ||
1715 | block_expr_dot | |
1716 | : block_expr '.' path_generic_args_with_colons %prec IDENT { $$ = mk_node("ExprField", 2, $1, $3); } | |
1717 | | block_expr_dot '.' path_generic_args_with_colons %prec IDENT { $$ = mk_node("ExprField", 2, $1, $3); } | |
1718 | | block_expr '.' path_generic_args_with_colons '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 3, $1, $3, $5); } | |
1719 | | block_expr_dot '.' path_generic_args_with_colons '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 3, $1, $3, $5); } | |
1720 | | block_expr '.' path_generic_args_with_colons '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 3, $1, $3, $5); } | |
1721 | | block_expr_dot '.' path_generic_args_with_colons '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 3, $1, $3, $5); } | |
1722 | | block_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); } | |
1723 | | block_expr_dot '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); } | |
476ff2be SL |
1724 | ; |
1725 | ||
1726 | expr_match | |
1727 | : MATCH expr_nostruct '{' '}' { $$ = mk_node("ExprMatch", 1, $2); } | |
1728 | | MATCH expr_nostruct '{' match_clauses '}' { $$ = mk_node("ExprMatch", 2, $2, $4); } | |
1729 | | MATCH expr_nostruct '{' match_clauses nonblock_match_clause '}' { $$ = mk_node("ExprMatch", 2, $2, ext_node($4, 1, $5)); } | |
1730 | | MATCH expr_nostruct '{' nonblock_match_clause '}' { $$ = mk_node("ExprMatch", 2, $2, mk_node("Arms", 1, $4)); } | |
1731 | ; | |
1732 | ||
1733 | match_clauses | |
1734 | : match_clause { $$ = mk_node("Arms", 1, $1); } | |
1735 | | match_clauses match_clause { $$ = ext_node($1, 1, $2); } | |
1736 | ; | |
1737 | ||
1738 | match_clause | |
1739 | : nonblock_match_clause ',' | |
1740 | | block_match_clause | |
1741 | | block_match_clause ',' | |
1742 | ; | |
1743 | ||
1744 | nonblock_match_clause | |
abe05a73 XL |
1745 | : maybe_outer_attrs pats_or maybe_guard FAT_ARROW nonblock_expr { $$ = mk_node("ArmNonblock", 4, $1, $2, $3, $5); } |
1746 | | maybe_outer_attrs pats_or maybe_guard FAT_ARROW block_expr_dot { $$ = mk_node("ArmNonblock", 4, $1, $2, $3, $5); } | |
476ff2be SL |
1747 | ; |
1748 | ||
1749 | block_match_clause | |
abe05a73 XL |
1750 | : maybe_outer_attrs pats_or maybe_guard FAT_ARROW block { $$ = mk_node("ArmBlock", 4, $1, $2, $3, $5); } |
1751 | | maybe_outer_attrs pats_or maybe_guard FAT_ARROW block_expr { $$ = mk_node("ArmBlock", 4, $1, $2, $3, $5); } | |
476ff2be SL |
1752 | ; |
1753 | ||
1754 | maybe_guard | |
1755 | : IF expr_nostruct { $$ = $2; } | |
1756 | | %empty { $$ = mk_none(); } | |
1757 | ; | |
1758 | ||
1759 | expr_if | |
1760 | : IF expr_nostruct block { $$ = mk_node("ExprIf", 2, $2, $3); } | |
1761 | | IF expr_nostruct block ELSE block_or_if { $$ = mk_node("ExprIf", 3, $2, $3, $5); } | |
1762 | ; | |
1763 | ||
1764 | expr_if_let | |
1765 | : IF LET pat '=' expr_nostruct block { $$ = mk_node("ExprIfLet", 3, $3, $5, $6); } | |
1766 | | IF LET pat '=' expr_nostruct block ELSE block_or_if { $$ = mk_node("ExprIfLet", 4, $3, $5, $6, $8); } | |
1767 | ; | |
1768 | ||
1769 | block_or_if | |
1770 | : block | |
1771 | | expr_if | |
1772 | | expr_if_let | |
1773 | ; | |
1774 | ||
1775 | expr_while | |
1776 | : maybe_label WHILE expr_nostruct block { $$ = mk_node("ExprWhile", 3, $1, $3, $4); } | |
1777 | ; | |
1778 | ||
1779 | expr_while_let | |
1780 | : maybe_label WHILE LET pat '=' expr_nostruct block { $$ = mk_node("ExprWhileLet", 4, $1, $4, $6, $7); } | |
1781 | ; | |
1782 | ||
1783 | expr_loop | |
1784 | : maybe_label LOOP block { $$ = mk_node("ExprLoop", 2, $1, $3); } | |
1785 | ; | |
1786 | ||
1787 | expr_for | |
1788 | : maybe_label FOR pat IN expr_nostruct block { $$ = mk_node("ExprForLoop", 4, $1, $3, $5, $6); } | |
1789 | ; | |
1790 | ||
1791 | maybe_label | |
1792 | : lifetime ':' | |
1793 | | %empty { $$ = mk_none(); } | |
1794 | ; | |
1795 | ||
1796 | let | |
1797 | : LET pat maybe_ty_ascription maybe_init_expr ';' { $$ = mk_node("DeclLocal", 3, $2, $3, $4); } | |
1798 | ; | |
1799 | ||
1800 | //////////////////////////////////////////////////////////////////////// | |
1801 | // Part 5: Macros and misc. rules | |
1802 | //////////////////////////////////////////////////////////////////////// | |
1803 | ||
1804 | lit | |
1805 | : LIT_BYTE { $$ = mk_node("LitByte", 1, mk_atom(yytext)); } | |
1806 | | LIT_CHAR { $$ = mk_node("LitChar", 1, mk_atom(yytext)); } | |
1807 | | LIT_INTEGER { $$ = mk_node("LitInteger", 1, mk_atom(yytext)); } | |
1808 | | LIT_FLOAT { $$ = mk_node("LitFloat", 1, mk_atom(yytext)); } | |
1809 | | TRUE { $$ = mk_node("LitBool", 1, mk_atom(yytext)); } | |
1810 | | FALSE { $$ = mk_node("LitBool", 1, mk_atom(yytext)); } | |
1811 | | str | |
1812 | ; | |
1813 | ||
1814 | str | |
1815 | : LIT_STR { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("CookedStr")); } | |
1816 | | LIT_STR_RAW { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("RawStr")); } | |
1817 | | LIT_BYTE_STR { $$ = mk_node("LitByteStr", 1, mk_atom(yytext), mk_atom("ByteStr")); } | |
1818 | | LIT_BYTE_STR_RAW { $$ = mk_node("LitByteStr", 1, mk_atom(yytext), mk_atom("RawByteStr")); } | |
1819 | ; | |
1820 | ||
1821 | maybe_ident | |
1822 | : %empty { $$ = mk_none(); } | |
1823 | | ident | |
1824 | ; | |
1825 | ||
1826 | ident | |
1827 | : IDENT { $$ = mk_node("ident", 1, mk_atom(yytext)); } | |
abe05a73 XL |
1828 | // Weak keywords that can be used as identifiers |
1829 | | CATCH { $$ = mk_node("ident", 1, mk_atom(yytext)); } | |
1830 | | DEFAULT { $$ = mk_node("ident", 1, mk_atom(yytext)); } | |
1831 | | UNION { $$ = mk_node("ident", 1, mk_atom(yytext)); } | |
476ff2be SL |
1832 | ; |
1833 | ||
1834 | unpaired_token | |
1835 | : SHL { $$ = mk_atom(yytext); } | |
1836 | | SHR { $$ = mk_atom(yytext); } | |
1837 | | LE { $$ = mk_atom(yytext); } | |
1838 | | EQEQ { $$ = mk_atom(yytext); } | |
1839 | | NE { $$ = mk_atom(yytext); } | |
1840 | | GE { $$ = mk_atom(yytext); } | |
1841 | | ANDAND { $$ = mk_atom(yytext); } | |
1842 | | OROR { $$ = mk_atom(yytext); } | |
1843 | | LARROW { $$ = mk_atom(yytext); } | |
1844 | | SHLEQ { $$ = mk_atom(yytext); } | |
1845 | | SHREQ { $$ = mk_atom(yytext); } | |
1846 | | MINUSEQ { $$ = mk_atom(yytext); } | |
1847 | | ANDEQ { $$ = mk_atom(yytext); } | |
1848 | | OREQ { $$ = mk_atom(yytext); } | |
1849 | | PLUSEQ { $$ = mk_atom(yytext); } | |
1850 | | STAREQ { $$ = mk_atom(yytext); } | |
1851 | | SLASHEQ { $$ = mk_atom(yytext); } | |
1852 | | CARETEQ { $$ = mk_atom(yytext); } | |
1853 | | PERCENTEQ { $$ = mk_atom(yytext); } | |
1854 | | DOTDOT { $$ = mk_atom(yytext); } | |
1855 | | DOTDOTDOT { $$ = mk_atom(yytext); } | |
1856 | | MOD_SEP { $$ = mk_atom(yytext); } | |
1857 | | RARROW { $$ = mk_atom(yytext); } | |
1858 | | FAT_ARROW { $$ = mk_atom(yytext); } | |
1859 | | LIT_BYTE { $$ = mk_atom(yytext); } | |
1860 | | LIT_CHAR { $$ = mk_atom(yytext); } | |
1861 | | LIT_INTEGER { $$ = mk_atom(yytext); } | |
1862 | | LIT_FLOAT { $$ = mk_atom(yytext); } | |
1863 | | LIT_STR { $$ = mk_atom(yytext); } | |
1864 | | LIT_STR_RAW { $$ = mk_atom(yytext); } | |
1865 | | LIT_BYTE_STR { $$ = mk_atom(yytext); } | |
1866 | | LIT_BYTE_STR_RAW { $$ = mk_atom(yytext); } | |
1867 | | IDENT { $$ = mk_atom(yytext); } | |
1868 | | UNDERSCORE { $$ = mk_atom(yytext); } | |
1869 | | LIFETIME { $$ = mk_atom(yytext); } | |
1870 | | SELF { $$ = mk_atom(yytext); } | |
1871 | | STATIC { $$ = mk_atom(yytext); } | |
abe05a73 XL |
1872 | | ABSTRACT { $$ = mk_atom(yytext); } |
1873 | | ALIGNOF { $$ = mk_atom(yytext); } | |
476ff2be | 1874 | | AS { $$ = mk_atom(yytext); } |
abe05a73 | 1875 | | BECOME { $$ = mk_atom(yytext); } |
476ff2be | 1876 | | BREAK { $$ = mk_atom(yytext); } |
abe05a73 | 1877 | | CATCH { $$ = mk_atom(yytext); } |
476ff2be | 1878 | | CRATE { $$ = mk_atom(yytext); } |
abe05a73 XL |
1879 | | DEFAULT { $$ = mk_atom(yytext); } |
1880 | | DO { $$ = mk_atom(yytext); } | |
476ff2be SL |
1881 | | ELSE { $$ = mk_atom(yytext); } |
1882 | | ENUM { $$ = mk_atom(yytext); } | |
1883 | | EXTERN { $$ = mk_atom(yytext); } | |
1884 | | FALSE { $$ = mk_atom(yytext); } | |
abe05a73 | 1885 | | FINAL { $$ = mk_atom(yytext); } |
476ff2be SL |
1886 | | FN { $$ = mk_atom(yytext); } |
1887 | | FOR { $$ = mk_atom(yytext); } | |
1888 | | IF { $$ = mk_atom(yytext); } | |
1889 | | IMPL { $$ = mk_atom(yytext); } | |
1890 | | IN { $$ = mk_atom(yytext); } | |
1891 | | LET { $$ = mk_atom(yytext); } | |
1892 | | LOOP { $$ = mk_atom(yytext); } | |
abe05a73 | 1893 | | MACRO { $$ = mk_atom(yytext); } |
476ff2be SL |
1894 | | MATCH { $$ = mk_atom(yytext); } |
1895 | | MOD { $$ = mk_atom(yytext); } | |
1896 | | MOVE { $$ = mk_atom(yytext); } | |
1897 | | MUT { $$ = mk_atom(yytext); } | |
abe05a73 XL |
1898 | | OFFSETOF { $$ = mk_atom(yytext); } |
1899 | | OVERRIDE { $$ = mk_atom(yytext); } | |
476ff2be SL |
1900 | | PRIV { $$ = mk_atom(yytext); } |
1901 | | PUB { $$ = mk_atom(yytext); } | |
abe05a73 | 1902 | | PURE { $$ = mk_atom(yytext); } |
476ff2be SL |
1903 | | REF { $$ = mk_atom(yytext); } |
1904 | | RETURN { $$ = mk_atom(yytext); } | |
1905 | | STRUCT { $$ = mk_atom(yytext); } | |
abe05a73 XL |
1906 | | SIZEOF { $$ = mk_atom(yytext); } |
1907 | | SUPER { $$ = mk_atom(yytext); } | |
476ff2be SL |
1908 | | TRUE { $$ = mk_atom(yytext); } |
1909 | | TRAIT { $$ = mk_atom(yytext); } | |
1910 | | TYPE { $$ = mk_atom(yytext); } | |
abe05a73 | 1911 | | UNION { $$ = mk_atom(yytext); } |
476ff2be | 1912 | | UNSAFE { $$ = mk_atom(yytext); } |
abe05a73 | 1913 | | UNSIZED { $$ = mk_atom(yytext); } |
476ff2be | 1914 | | USE { $$ = mk_atom(yytext); } |
abe05a73 | 1915 | | VIRTUAL { $$ = mk_atom(yytext); } |
476ff2be | 1916 | | WHILE { $$ = mk_atom(yytext); } |
abe05a73 | 1917 | | YIELD { $$ = mk_atom(yytext); } |
476ff2be SL |
1918 | | CONTINUE { $$ = mk_atom(yytext); } |
1919 | | PROC { $$ = mk_atom(yytext); } | |
1920 | | BOX { $$ = mk_atom(yytext); } | |
1921 | | CONST { $$ = mk_atom(yytext); } | |
1922 | | WHERE { $$ = mk_atom(yytext); } | |
1923 | | TYPEOF { $$ = mk_atom(yytext); } | |
1924 | | INNER_DOC_COMMENT { $$ = mk_atom(yytext); } | |
1925 | | OUTER_DOC_COMMENT { $$ = mk_atom(yytext); } | |
1926 | | SHEBANG { $$ = mk_atom(yytext); } | |
1927 | | STATIC_LIFETIME { $$ = mk_atom(yytext); } | |
1928 | | ';' { $$ = mk_atom(yytext); } | |
1929 | | ',' { $$ = mk_atom(yytext); } | |
1930 | | '.' { $$ = mk_atom(yytext); } | |
1931 | | '@' { $$ = mk_atom(yytext); } | |
1932 | | '#' { $$ = mk_atom(yytext); } | |
1933 | | '~' { $$ = mk_atom(yytext); } | |
1934 | | ':' { $$ = mk_atom(yytext); } | |
1935 | | '$' { $$ = mk_atom(yytext); } | |
1936 | | '=' { $$ = mk_atom(yytext); } | |
1937 | | '?' { $$ = mk_atom(yytext); } | |
1938 | | '!' { $$ = mk_atom(yytext); } | |
1939 | | '<' { $$ = mk_atom(yytext); } | |
1940 | | '>' { $$ = mk_atom(yytext); } | |
1941 | | '-' { $$ = mk_atom(yytext); } | |
1942 | | '&' { $$ = mk_atom(yytext); } | |
1943 | | '|' { $$ = mk_atom(yytext); } | |
1944 | | '+' { $$ = mk_atom(yytext); } | |
1945 | | '*' { $$ = mk_atom(yytext); } | |
1946 | | '/' { $$ = mk_atom(yytext); } | |
1947 | | '^' { $$ = mk_atom(yytext); } | |
1948 | | '%' { $$ = mk_atom(yytext); } | |
1949 | ; | |
1950 | ||
1951 | token_trees | |
1952 | : %empty { $$ = mk_node("TokenTrees", 0); } | |
1953 | | token_trees token_tree { $$ = ext_node($1, 1, $2); } | |
1954 | ; | |
1955 | ||
1956 | token_tree | |
1957 | : delimited_token_trees | |
1958 | | unpaired_token { $$ = mk_node("TTTok", 1, $1); } | |
1959 | ; | |
1960 | ||
1961 | delimited_token_trees | |
1962 | : parens_delimited_token_trees | |
1963 | | braces_delimited_token_trees | |
1964 | | brackets_delimited_token_trees | |
1965 | ; | |
1966 | ||
1967 | parens_delimited_token_trees | |
1968 | : '(' token_trees ')' | |
1969 | { | |
1970 | $$ = mk_node("TTDelim", 3, | |
1971 | mk_node("TTTok", 1, mk_atom("(")), | |
1972 | $2, | |
1973 | mk_node("TTTok", 1, mk_atom(")"))); | |
1974 | } | |
1975 | ; | |
1976 | ||
1977 | braces_delimited_token_trees | |
1978 | : '{' token_trees '}' | |
1979 | { | |
1980 | $$ = mk_node("TTDelim", 3, | |
1981 | mk_node("TTTok", 1, mk_atom("{")), | |
1982 | $2, | |
1983 | mk_node("TTTok", 1, mk_atom("}"))); | |
1984 | } | |
1985 | ; | |
1986 | ||
1987 | brackets_delimited_token_trees | |
1988 | : '[' token_trees ']' | |
1989 | { | |
1990 | $$ = mk_node("TTDelim", 3, | |
1991 | mk_node("TTTok", 1, mk_atom("[")), | |
1992 | $2, | |
1993 | mk_node("TTTok", 1, mk_atom("]"))); | |
1994 | } | |
abe05a73 | 1995 | ; |