cairo_lang_syntax_codegen/
cairo_spec.rs

1use crate::spec::{EnumBuilder, Node, NodesAggregator, StructBuilder};
2
3/// The specific syntax specification of Cairo.
4pub fn get_spec() -> Vec<Node> {
5    NodesAggregator::default()
6    .add_list("Trivia", "Trivium")
7    .add_enum(
8        EnumBuilder::new("Trivium")
9            .node_with_explicit_kind("SingleLineComment", "TokenSingleLineComment")
10            .node_with_explicit_kind("SingleLineDocComment", "TokenSingleLineDocComment")
11            .node_with_explicit_kind("SingleLineInnerComment", "TokenSingleLineInnerComment")
12            .node_with_explicit_kind("Whitespace", "TokenWhitespace")
13            .node_with_explicit_kind("Newline", "TokenNewline")
14            .node_with_explicit_kind("Skipped", "TokenSkipped")
15            .node("SkippedNode"),
16    )
17    // --- Expressions ---
18    .add_enum(EnumBuilder::new("Expr")
19        .missing("Missing")
20        .node("Path")
21        .node_with_explicit_kind("Literal", "TerminalLiteralNumber")
22        .node_with_explicit_kind("ShortString", "TerminalShortString")
23        .node_with_explicit_kind("String", "TerminalString")
24        .node_with_explicit_kind("False", "TerminalFalse")
25        .node_with_explicit_kind("True", "TerminalTrue")
26        .node("Parenthesized")
27        .node("Unary")
28        .node("Binary")
29        .node_with_explicit_kind("Tuple", "ExprListParenthesized")
30        .node("FunctionCall")
31        .node("StructCtorCall")
32        .node("Block")
33        .node("Match")
34        .node("If")
35        .node("Loop")
36        .node("While")
37        .node("For")
38        .node("Closure")
39        .node("ErrorPropagate")
40        .node("FieldInitShorthand")
41        .node("Indexed")
42        .node("InlineMacro")
43        .node("FixedSizeArray")
44        .node("Placeholder")
45    )
46    .add_separated_list("ExprList", "Expr", "TerminalComma")
47    .add_struct(StructBuilder::new("Arg")
48        .node("modifiers", "ModifierList")
49        .node("arg_clause", "ArgClause")
50    )
51    .add_enum(EnumBuilder::new("ArgClause")
52        .node("Unnamed")
53        .node("Named")
54        .node("FieldInitShorthand")
55    )
56    .add_struct(StructBuilder::new("ArgClauseNamed")
57        .node("name", "TerminalIdentifier")
58        .node("colon", "TerminalColon")
59        .node("value", "Expr")
60    )
61    .add_struct(StructBuilder::new("ArgClauseUnnamed")
62        .node("value", "Expr")
63    )
64    .add_struct(StructBuilder::new("ArgClauseFieldInitShorthand")
65        .node("colon", "TerminalColon")
66        .node("name", "ExprFieldInitShorthand")
67    )
68    .add_struct(StructBuilder::new("ExprFieldInitShorthand")
69        .node("name", "TerminalIdentifier")
70    )
71    .add_separated_list("ArgList", "Arg", "TerminalComma")
72    .add_struct(StructBuilder::new("ExprMissing"))
73    .add_enum(EnumBuilder::new("PathSegment")
74        .node("Simple")
75        .node("WithGenericArgs")
76        .missing("Missing")
77    )
78    .add_struct(StructBuilder::new("PathSegmentSimple").node("ident", "TerminalIdentifier"))
79    .add_option("TerminalColonColon")
80    .add_struct(StructBuilder::new("PathSegmentWithGenericArgs")
81        .node("ident", "TerminalIdentifier")
82        .node("separator", "OptionTerminalColonColon")
83        .node("generic_args", "GenericArgs")
84    )
85    .add_struct(StructBuilder::new("ExprPath")
86        .node("dollar", "OptionTerminalDollar")
87        .node("segments", "ExprPathInner")
88    )
89    .add_option("TerminalDollar")
90    // When a segment is missing, we parse a missing token, to point to from other
91    // parts of the code. This simplifies the handling of paths.
92    .add_struct(StructBuilder::new("PathSegmentMissing").node("ident","TerminalIdentifier"))
93    .add_separated_list("ExprPathInner", "PathSegment", "TerminalColonColon")
94    .add_struct(StructBuilder::new("ExprParenthesized")
95        .node("lparen", "TerminalLParen")
96        .node("expr", "Expr")
97        .node("rparen", "TerminalRParen")
98    )
99    .add_struct(StructBuilder::new("ExprUnary").node("op", "UnaryOperator").node("expr", "Expr"))
100    .add_enum(EnumBuilder::new("UnaryOperator")
101        .node_with_explicit_kind("Not", "TerminalNot")
102        .node_with_explicit_kind("BitNot", "TerminalBitNot")
103        .node_with_explicit_kind("Minus", "TerminalMinus")
104        .node_with_explicit_kind("At", "TerminalAt")
105        .node_with_explicit_kind("Desnap", "TerminalMul")
106    )
107    .add_struct(StructBuilder::new("ExprBinary")
108        .node("lhs", "Expr")
109        .node("op", "BinaryOperator")
110        .node("rhs", "Expr")
111    )
112    .add_enum(EnumBuilder::new("BinaryOperator")
113        .node_with_explicit_kind("Dot", "TerminalDot")
114        .node_with_explicit_kind("Not", "TerminalNot")
115        .node_with_explicit_kind("Mul", "TerminalMul")
116        .node_with_explicit_kind("MulEq", "TerminalMulEq")
117        .node_with_explicit_kind("Div", "TerminalDiv")
118        .node_with_explicit_kind("DivEq", "TerminalDivEq")
119        .node_with_explicit_kind("Mod", "TerminalMod")
120        .node_with_explicit_kind("ModEq", "TerminalModEq")
121        .node_with_explicit_kind("Plus", "TerminalPlus")
122        .node_with_explicit_kind("PlusEq", "TerminalPlusEq")
123        .node_with_explicit_kind("Minus", "TerminalMinus")
124        .node_with_explicit_kind("MinusEq", "TerminalMinusEq")
125        .node_with_explicit_kind("EqEq", "TerminalEqEq")
126        .node_with_explicit_kind("Neq", "TerminalNeq")
127        .node_with_explicit_kind("Eq", "TerminalEq")
128        .node_with_explicit_kind("And", "TerminalAnd")
129        .node_with_explicit_kind("AndAnd", "TerminalAndAnd")
130        .node_with_explicit_kind("Or", "TerminalOr")
131        .node_with_explicit_kind("OrOr", "TerminalOrOr")
132        .node_with_explicit_kind("Xor", "TerminalXor")
133        .node_with_explicit_kind("LE", "TerminalLE")
134        .node_with_explicit_kind("GE", "TerminalGE")
135        .node_with_explicit_kind("LT", "TerminalLT")
136        .node_with_explicit_kind("GT", "TerminalGT")
137        .node_with_explicit_kind("DotDot", "TerminalDotDot")
138        .node_with_explicit_kind("DotDotEq", "TerminalDotDotEq")
139    )
140    .add_struct(StructBuilder::new("ExprListParenthesized")
141        .node("lparen", "TerminalLParen")
142        .node("expressions", "ExprList")
143        .node("rparen", "TerminalRParen")
144    )
145    .add_struct(StructBuilder::new("ExprFunctionCall")
146        .node("path", "ExprPath")
147        .node("arguments", "ArgListParenthesized")
148    )
149    .add_struct(StructBuilder::new("ArgListParenthesized")
150        .node("lparen", "TerminalLParen")
151        .node("arguments", "ArgList")
152        .node("rparen", "TerminalRParen")
153    )
154    .add_option("ArgListParenthesized")
155    .add_struct(StructBuilder::new("ExprStructCtorCall")
156        .node("path", "ExprPath")
157        .node("arguments", "StructArgListBraced")
158    )
159    .add_struct(StructBuilder::new("StructArgListBraced")
160        .node("lbrace", "TerminalLBrace")
161        .node("arguments", "StructArgList")
162        .node("rbrace", "TerminalRBrace")
163    )
164    .add_struct(StructBuilder::new("ExprBlock")
165        .node("lbrace", "TerminalLBrace")
166        .node("statements", "StatementList")
167        .node("rbrace", "TerminalRBrace")
168    )
169    .add_struct(StructBuilder::new("ExprMatch")
170        .node("match_kw", "TerminalMatch")
171        // TODO(yuval): change to SimpleExpr
172        .node("expr", "Expr")
173        .node("lbrace", "TerminalLBrace")
174        .node("arms", "MatchArms")
175        .node("rbrace", "TerminalRBrace")
176    )
177    .add_separated_list("MatchArms", "MatchArm", "TerminalComma")
178    .add_struct(StructBuilder::new("MatchArm")
179        .node("patterns", "PatternListOr")
180        .node("arrow", "TerminalMatchArrow")
181        .node("expression", "Expr")
182    )
183    .add_struct(StructBuilder::new("ExprIf")
184        .node("if_kw", "TerminalIf")
185        .node("conditions", "ConditionListAnd")
186        .node("if_block", "ExprBlock")
187        .node("else_clause", "OptionElseClause")
188    )
189    .add_separated_list("ConditionListAnd", "Condition", "TerminalAndAnd")
190    .add_enum(EnumBuilder::new("Condition")
191        .node("Let")
192        .node("Expr")
193    )
194    .add_struct(StructBuilder::new("ConditionLet")
195        .node("let_kw", "TerminalLet")
196        .node("patterns", "PatternListOr")
197        .node("eq", "TerminalEq")
198        .node("expr", "Expr")
199    )
200    .add_struct(StructBuilder::new("ConditionExpr")
201        .node("expr", "Expr")
202    )
203    .add_enum(EnumBuilder::new("BlockOrIf")
204        .node_with_explicit_kind("Block", "ExprBlock")
205        .node_with_explicit_kind("If", "ExprIf")
206    )
207    .add_struct(StructBuilder::new("ExprLoop")
208        .node("loop_kw", "TerminalLoop")
209        .node("body", "ExprBlock")
210    )
211    .add_struct(StructBuilder::new("ExprWhile")
212        .node("while_kw", "TerminalWhile")
213        .node("conditions", "ConditionListAnd")
214        .node("body", "ExprBlock")
215    )
216    .add_struct(StructBuilder::new("ExprFor")
217        .node("for_kw", "TerminalFor")
218        .key_node("pattern", "Pattern")
219        .key_node("identifier", "TerminalIdentifier")
220        .node("expr", "Expr")
221        .node("body", "ExprBlock")
222    )
223    .add_struct(StructBuilder::new("ElseClause")
224        .node("else_kw", "TerminalElse")
225        .node("else_block_or_if", "BlockOrIf")
226    )
227    .add_option("ElseClause")
228    .add_struct(StructBuilder::new("ExprErrorPropagate").node("expr", "Expr").node("op", "TerminalQuestionMark"))
229    .add_struct(StructBuilder::new("ExprIndexed")
230        .node("expr", "Expr")
231        .node("lbrack", "TerminalLBrack")
232        .node("index_expr", "Expr")
233        .node("rbrack", "TerminalRBrack")
234    )
235    .add_struct(StructBuilder::new("ExprFixedSizeArray")
236        .node("lbrack", "TerminalLBrack")
237        .node("exprs", "ExprList")
238        .node("size", "OptionFixedSizeArraySize")
239        .node("rbrack", "TerminalRBrack")
240    )
241    .add_struct(StructBuilder::new("FixedSizeArraySize")
242        .node("semicolon", "TerminalSemicolon")
243        .node("size", "Expr")
244    )
245    .add_option("FixedSizeArraySize")
246    .add_struct(StructBuilder::new("ExprClosure")
247        .node("wrapper", "ClosureParamWrapper")
248        .node("ret_ty", "OptionReturnTypeClause")
249        .node("optional_no_panic", "OptionTerminalNoPanic")
250        .node("expr", "Expr")
251    )
252    .add_enum(EnumBuilder::new("ClosureParamWrapper")
253        .node_with_explicit_kind("Nullary", "TerminalOrOr")
254        .node("NAry")
255    )
256    .add_struct(StructBuilder::new("ClosureParamWrapperNAry")
257        .node("leftor","TerminalOr")
258        .node("params", "ParamList")
259        .node("rightor", "TerminalOr")
260    )
261    .add_struct(StructBuilder::new("ExprPlaceholder")
262        .node("dollar", "TerminalDollar")
263        .node("path", "ExprPath")
264    )
265    // --- Struct ctor ---
266    .add_struct(StructBuilder::new("StructArgExpr")
267        .node("colon", "TerminalColon")
268        .node("expr", "Expr")
269    )
270    .add_option("StructArgExpr")
271    .add_struct(StructBuilder::new("StructArgSingle")
272        .key_node("identifier", "TerminalIdentifier")
273        .node("arg_expr", "OptionStructArgExpr")
274    )
275    .add_struct(StructBuilder::new("StructArgTail")
276        .node("dotdot", "TerminalDotDot")
277        .node("expression", "Expr")
278    )
279    .add_enum(EnumBuilder::new("StructArg")
280        .node_with_explicit_kind("StructArgSingle", "StructArgSingle")
281        .node_with_explicit_kind("StructArgTail", "StructArgTail")
282    )
283    .add_separated_list("StructArgList", "StructArg", "TerminalComma")
284    .add_struct(StructBuilder::new("ArgListBraced")
285        .node("lbrace", "TerminalLBrace")
286        .node("arguments", "ArgList")
287        .node("rbrace", "TerminalRBrace")
288    )
289    .add_struct(StructBuilder::new("ArgListBracketed")
290        .node("lbrack", "TerminalLBrack")
291        .node("arguments", "ArgList")
292        .node("rbrack", "TerminalRBrack")
293    )
294    .add_enum(EnumBuilder::new("WrappedArgList")
295        .missing("Missing")
296        .node_with_explicit_kind("BracketedArgList", "ArgListBracketed")
297        .node_with_explicit_kind("ParenthesizedArgList", "ArgListParenthesized")
298        .node_with_explicit_kind("BracedArgList", "ArgListBraced")
299    )
300    .add_struct(StructBuilder::new("WrappedArgListMissing"))
301    // ---Patterns ---
302    // TODO(spapini): Support "Or" patterns (e.g. 1 | 2).
303    // TODO(spapini): Support tuple patterns (e.g. (x, _)).
304    .add_enum(EnumBuilder::new("Pattern")
305        .node_with_explicit_kind("Underscore", "TerminalUnderscore")
306        .node_with_explicit_kind("Literal", "TerminalLiteralNumber")
307        .node_with_explicit_kind("False", "TerminalFalse")
308        .node_with_explicit_kind("True", "TerminalTrue")
309        .node_with_explicit_kind("ShortString", "TerminalShortString")
310        .node_with_explicit_kind("String", "TerminalString")
311        .node("Identifier")
312        .node("Struct")
313        .node("Tuple")
314        .node("Enum")
315        .node("FixedSizeArray")
316        .node_with_explicit_kind("Path", "ExprPath")
317    )
318    .add_struct(StructBuilder::new("PatternIdentifier")
319        .node("modifiers", "ModifierList")
320        .key_node("name", "TerminalIdentifier")
321    )
322    .add_struct(StructBuilder::new("PatternStruct")
323        // TODO(spapini): Use SimplePath instead - which is not an expr.
324        .node("path", "ExprPath")
325        .node("lbrace", "TerminalLBrace")
326        .node("params", "PatternStructParamList")
327        .node("rbrace", "TerminalRBrace")
328    )
329    .add_separated_list("PatternStructParamList", "PatternStructParam", "TerminalComma")
330    .add_struct(StructBuilder::new("PatternTuple")
331        .node("lparen", "TerminalLParen")
332        .node("patterns", "PatternList")
333        .node("rparen", "TerminalRParen")
334    )
335    .add_struct(StructBuilder::new("PatternFixedSizeArray")
336        .node("lbrack", "TerminalLBrack")
337        .node("patterns", "PatternList")
338        .node("rbrack", "TerminalRBrack"))
339    .add_separated_list("PatternList", "Pattern", "TerminalComma")
340    .add_separated_list("PatternListOr", "Pattern", "TerminalOr")
341    .add_enum(EnumBuilder::new("PatternStructParam")
342        .node_with_explicit_kind("Single", "PatternIdentifier")
343        .node("WithExpr")
344        .node_with_explicit_kind("Tail", "TerminalDotDot")
345    )
346    .add_struct(StructBuilder::new("PatternStructParamWithExpr")
347        .node("modifiers", "ModifierList")
348        .node("name", "TerminalIdentifier")
349        .node("colon", "TerminalColon")
350        .node("pattern", "Pattern")
351    )
352    .add_struct(StructBuilder::new("PatternEnum")
353        .node("path", "ExprPath")
354        .node("pattern", "OptionPatternEnumInnerPattern")
355    )
356    .add_struct(StructBuilder::new("PatternEnumInnerPattern")
357        .node("lparen", "TerminalLParen")
358        .node("pattern", "Pattern")
359        .node("rparen", "TerminalRParen")
360    )
361    .add_option("PatternEnumInnerPattern")
362    // --- Type clauses ---
363    // TODO(yuval): support SimpleExpr instead of Expr
364    .add_struct(StructBuilder::new("TypeClause").node("colon", "TerminalColon").node("ty", "Expr"))
365    .add_option("TypeClause")
366    .add_struct(StructBuilder::new("ReturnTypeClause")
367        .node("arrow", "TerminalArrow")
368        .node("ty", "Expr")
369    )
370    .add_option("ReturnTypeClause")
371    // --- Statements ---
372    .add_enum(EnumBuilder::new("Statement")
373        .missing("Missing")
374        .node("Let")
375        .node("Expr")
376        .node("Continue")
377        .node("Return")
378        .node("Break")
379        .node("Item")
380    )
381    .add_list("StatementList", "Statement")
382    .add_struct(StructBuilder::new("StatementMissing"))
383    .add_struct(StructBuilder::new("StatementLet")
384        .node("attributes" ,"AttributeList")
385        .node("let_kw", "TerminalLet")
386        .key_node("pattern", "Pattern")
387        .node("type_clause", "OptionTypeClause")
388        .node("eq", "TerminalEq")
389        .node("rhs", "Expr")
390        .node("let_else_clause", "OptionLetElseClause")
391        .node("semicolon", "TerminalSemicolon")
392    )
393    .add_struct(StructBuilder::new("LetElseClause")
394        .node("else_kw", "TerminalElse")
395        .node("else_block", "ExprBlock")
396    )
397    .add_option("LetElseClause")
398    .add_option("TerminalSemicolon")
399    .add_struct(StructBuilder::new("StatementExpr")
400        .node("attributes" ,"AttributeList")
401        .node("expr", "Expr")
402        .node("semicolon", "OptionTerminalSemicolon")
403    )
404    .add_struct(StructBuilder::new("StatementContinue")
405        .node("attributes" ,"AttributeList")
406        .node("continue_kw", "TerminalContinue")
407        .node("semicolon", "TerminalSemicolon")
408    )
409    .add_struct(StructBuilder::new("ExprClause")
410        .node("expr", "Expr"))
411    .add_option("ExprClause")
412    .add_struct(StructBuilder::new("StatementReturn")
413        .node("attributes" ,"AttributeList")
414        .node("return_kw", "TerminalReturn")
415        .node("expr_clause", "OptionExprClause")
416        .node("semicolon", "TerminalSemicolon")
417    )
418    .add_struct(StructBuilder::new("StatementBreak")
419        .node("attributes" ,"AttributeList")
420        .node("break_kw", "TerminalBreak")
421        .node("expr_clause", "OptionExprClause")
422        .node("semicolon", "TerminalSemicolon")
423    )
424    .add_struct(StructBuilder::new("StatementItem")
425        .node("item", "ModuleItem")
426    )
427    // --- Functions ---
428    .add_struct(StructBuilder::new("Param")
429        .node("modifiers", "ModifierList")
430        .key_node("name", "TerminalIdentifier")
431        .node("type_clause", "OptionTypeClause")
432    )
433    .add_list("ModifierList", "Modifier")
434    .add_enum(EnumBuilder::new("Modifier")
435        .node_with_explicit_kind("Ref", "TerminalRef")
436        .node_with_explicit_kind("Mut", "TerminalMut")
437    )
438    .add_separated_list("ParamList", "Param", "TerminalComma")
439    .add_struct(StructBuilder::new("ImplicitsClause")
440        .node("implicits_kw", "TerminalImplicits")
441        .node("lparen", "TerminalLParen")
442        .node("implicits", "ImplicitsList")
443        .node("rparen", "TerminalRParen")
444    )
445    .add_separated_list("ImplicitsList", "ExprPath", "TerminalComma")
446    .add_option("ImplicitsClause")
447    .add_option("TerminalNoPanic")
448    .add_option("TerminalConst")
449    // TODO(spapini): Add generic params.
450    // This is an unnamed signature, e.g. "() -> Type".
451    .add_struct(StructBuilder::new("FunctionSignature")
452        .node("lparen", "TerminalLParen")
453        .node("parameters", "ParamList")
454        .node("rparen", "TerminalRParen")
455        .node("ret_ty", "OptionReturnTypeClause")
456        .node("implicits_clause", "OptionImplicitsClause")
457        .node("optional_no_panic", "OptionTerminalNoPanic")
458    )
459    // --- Struct Members ---
460    // Struct member and enum variant have the same structure.
461    .add_struct(StructBuilder::new("Member")
462        .node("attributes" ,"AttributeList")
463        .node("visibility", "Visibility")
464        .key_node("name", "TerminalIdentifier")
465        .node("type_clause", "TypeClause")
466    )
467    .add_separated_list("MemberList", "Member", "TerminalComma")
468    .add_struct(StructBuilder::new("Variant")
469        .node("attributes" ,"AttributeList")
470        .key_node("name", "TerminalIdentifier")
471        .node("type_clause", "OptionTypeClause")
472    )
473    .add_separated_list("VariantList", "Variant", "TerminalComma")
474    // --- Items ---
475    .add_enum(EnumBuilder::new("ModuleItem")
476        .missing("Missing")
477        .node_with_explicit_kind("Constant", "ItemConstant")
478        .node_with_explicit_kind("Module", "ItemModule")
479        .node_with_explicit_kind("Use", "ItemUse")
480        .node_with_explicit_kind("FreeFunction", "FunctionWithBody")
481        .node_with_explicit_kind("ExternFunction", "ItemExternFunction")
482        .node_with_explicit_kind("ExternType", "ItemExternType")
483        .node_with_explicit_kind("Trait", "ItemTrait")
484        .node_with_explicit_kind("Impl", "ItemImpl")
485        .node_with_explicit_kind("ImplAlias", "ItemImplAlias")
486        .node_with_explicit_kind("Struct", "ItemStruct")
487        .node_with_explicit_kind("Enum", "ItemEnum")
488        .node_with_explicit_kind("TypeAlias", "ItemTypeAlias")
489        .node_with_explicit_kind("InlineMacro", "ItemInlineMacro")
490        .node_with_explicit_kind("MacroDeclaration", "ItemMacroDeclaration")
491        .node_with_explicit_kind("HeaderDoc", "ItemHeaderDoc")
492    )
493    .add_list("ModuleItemList", "ModuleItem")
494    .add_struct(StructBuilder::new("ModuleItemMissing"))
495    .add_struct(StructBuilder::new("Attribute")
496        .node("hash", "TerminalHash")
497        .node("lbrack", "TerminalLBrack")
498        .node("attr", "ExprPath")
499        .node("arguments", "OptionArgListParenthesized")
500        .node("rbrack", "TerminalRBrack")
501    )
502    .add_list("AttributeList", "Attribute")
503    .add_struct(StructBuilder::new("VisibilityDefault"))
504    .add_struct(StructBuilder::new("VisibilityPubArgumentClause")
505        .node("lparen", "TerminalLParen")
506        .node("argument", "TerminalIdentifier")
507        .node("rparen", "TerminalRParen")
508    )
509    .add_option("VisibilityPubArgumentClause")
510    .add_struct(StructBuilder::new("VisibilityPub")
511        .node("pub_kw", "TerminalPub")
512        .node("argument_clause", "OptionVisibilityPubArgumentClause")
513    )
514    .add_enum(EnumBuilder::new("Visibility")
515        .node("Default")
516        .node("Pub")
517    )
518    .add_struct(StructBuilder::new("ItemModule")
519        .node("attributes" ,"AttributeList")
520        .node("visibility", "Visibility")
521        .node("module_kw", "TerminalModule")
522        .key_node("name", "TerminalIdentifier")
523        .node("body", "MaybeModuleBody")
524    )
525    .add_enum(EnumBuilder::new("MaybeModuleBody")
526        .node_with_explicit_kind("Some", "ModuleBody")
527        .node_with_explicit_kind("None", "TerminalSemicolon")
528    )
529    .add_struct(StructBuilder::new("ModuleBody")
530        .node("lbrace", "TerminalLBrace")
531        .node("items", "ModuleItemList")
532        .node("rbrace", "TerminalRBrace")
533    )
534    .add_struct(StructBuilder::new("FunctionDeclaration")
535        .node("optional_const", "OptionTerminalConst")
536        .node("function_kw", "TerminalFunction")
537        .key_node("name", "TerminalIdentifier")
538        .node("generic_params", "OptionWrappedGenericParamList")
539        .node("signature", "FunctionSignature")
540    )
541    .add_struct(StructBuilder::new("ItemConstant")
542        .node("attributes" ,"AttributeList")
543        .node("visibility", "Visibility")
544        .node("const_kw", "TerminalConst")
545        .key_node("name", "TerminalIdentifier")
546        .node("type_clause", "TypeClause")
547        .node("eq", "TerminalEq")
548        .node("value", "Expr")
549        .node("semicolon", "TerminalSemicolon")
550    )
551    .add_struct(StructBuilder::new("FunctionWithBody")
552        .node("attributes" ,"AttributeList")
553        .node("visibility", "Visibility")
554         // TODO(ilya): Use only the name as key node.
555        .key_node("declaration", "FunctionDeclaration")
556        .node("body", "ExprBlock")
557    )
558    .add_struct(StructBuilder::new("ItemExternFunction")
559        .node("attributes" ,"AttributeList")
560        .node("visibility", "Visibility")
561        .node("extern_kw", "TerminalExtern")
562         // TODO(ilya): Use only the name as key node.
563        .key_node("declaration", "FunctionDeclaration")
564        .node("semicolon", "TerminalSemicolon")
565    )
566    .add_struct(StructBuilder::new("ItemExternType")
567        .node("attributes" ,"AttributeList")
568        .node("visibility", "Visibility")
569        .node("extern_kw", "TerminalExtern")
570        .node("type_kw", "TerminalType")
571        .key_node("name", "TerminalIdentifier")
572        .node("generic_params", "OptionWrappedGenericParamList")
573        .node("semicolon", "TerminalSemicolon")
574    )
575    .add_struct(StructBuilder::new("ItemTrait")
576        .node("attributes" ,"AttributeList")
577        .node("visibility", "Visibility")
578        .node("trait_kw", "TerminalTrait")
579        .key_node("name", "TerminalIdentifier")
580        .node("generic_params", "OptionWrappedGenericParamList")
581        .node("body", "MaybeTraitBody")
582    )
583    .add_enum(EnumBuilder::new("MaybeTraitBody")
584        .node_with_explicit_kind("Some", "TraitBody")
585        .node_with_explicit_kind("None", "TerminalSemicolon")
586    )
587    .add_struct(StructBuilder::new("TraitBody")
588        .node("lbrace", "TerminalLBrace")
589        .node("items", "TraitItemList")
590        .node("rbrace", "TerminalRBrace")
591    )
592    .add_list("TraitItemList", "TraitItem")
593    .add_enum(EnumBuilder::new("TraitItem")
594        .missing("Missing")
595        .node("Function")
596        .node("Type")
597        .node("Constant")
598        .node("Impl")
599    )
600    .add_struct(StructBuilder::new("TraitItemMissing"))
601    .add_struct(StructBuilder::new("TraitItemFunction")
602        .node("attributes" ,"AttributeList")
603         // TODO(ilya): Use only the name as key node.
604        .key_node("declaration", "FunctionDeclaration")
605        .node("body", "MaybeTraitFunctionBody")
606    )
607    .add_struct(StructBuilder::new("TraitItemType")
608        .node("attributes" ,"AttributeList")
609        .node("type_kw", "TerminalType")
610        .key_node("name", "TerminalIdentifier")
611        .node("generic_params", "OptionWrappedGenericParamList")
612        .node("semicolon", "TerminalSemicolon")
613    )
614    .add_struct(StructBuilder::new("TraitItemConstant")
615        .node("attributes" ,"AttributeList")
616        .node("const_kw", "TerminalConst")
617        .key_node("name", "TerminalIdentifier")
618        .node("type_clause", "TypeClause")
619        .node("semicolon", "TerminalSemicolon")
620    )
621    .add_struct(StructBuilder::new("TraitItemImpl")
622        .node("attributes" ,"AttributeList")
623        .node("impl_kw", "TerminalImpl")
624        .key_node("name", "TerminalIdentifier")
625        .node("colon", "TerminalColon")
626        .node("trait_path", "ExprPath")
627        .node("semicolon", "TerminalSemicolon")
628    )
629    .add_enum(EnumBuilder::new("MaybeTraitFunctionBody")
630        .node_with_explicit_kind("Some", "ExprBlock")
631        .node_with_explicit_kind("None", "TerminalSemicolon")
632    )
633    .add_struct(StructBuilder::new("ItemImpl")
634        .node("attributes" ,"AttributeList")
635        .node("visibility", "Visibility")
636        .node("impl_kw", "TerminalImpl")
637        .key_node("name", "TerminalIdentifier")
638        .node("generic_params", "OptionWrappedGenericParamList")
639        .node("of_kw", "TerminalOf")
640        .node("trait_path", "ExprPath")
641        .node("body", "MaybeImplBody")
642    )
643    // Empty struct, which is used for separating the first comments in a file or module from the
644    // rest of the items. This is needed to prevent the first comments from being moved by the
645    // formatter.
646    .add_struct(StructBuilder::new("ItemHeaderDoc")
647        .node("empty", "TerminalEmpty"))
648    .add_enum(EnumBuilder::new("MaybeImplBody")
649        .node_with_explicit_kind("Some", "ImplBody")
650        .node_with_explicit_kind("None", "TerminalSemicolon")
651    )
652    .add_struct(StructBuilder::new("ImplBody")
653            .node("lbrace", "TerminalLBrace")
654            .node("items", "ImplItemList")
655            .node("rbrace", "TerminalRBrace")
656    )
657    .add_list("ImplItemList", "ImplItem")
658    .add_enum(EnumBuilder::new("ImplItem")
659        .missing("Missing")
660        .node_with_explicit_kind("Function", "FunctionWithBody")
661        .node_with_explicit_kind("Type", "ItemTypeAlias")
662        .node_with_explicit_kind("Constant", "ItemConstant")
663        .node_with_explicit_kind("Impl", "ItemImplAlias")
664        // These are not supported semantically.
665        .node_with_explicit_kind("Module", "ItemModule")
666        .node_with_explicit_kind("Use", "ItemUse")
667        .node_with_explicit_kind("ExternFunction", "ItemExternFunction")
668        .node_with_explicit_kind("ExternType", "ItemExternType")
669        .node_with_explicit_kind("Trait", "ItemTrait")
670        .node_with_explicit_kind("Struct", "ItemStruct")
671        .node_with_explicit_kind("Enum", "ItemEnum")
672    )
673    .add_struct(StructBuilder::new("ImplItemMissing"))
674    .add_struct(StructBuilder::new("ItemImplAlias")
675        .node("attributes" ,"AttributeList")
676        .node("visibility", "Visibility")
677        .node("impl_kw", "TerminalImpl")
678        .key_node("name", "TerminalIdentifier")
679        .node("generic_params", "OptionWrappedGenericParamList")
680        .node("eq", "TerminalEq")
681        .node("impl_path", "ExprPath")
682        .node("semicolon", "TerminalSemicolon")
683    )
684    .add_struct(StructBuilder::new("ItemStruct")
685        .node("attributes" ,"AttributeList")
686        .node("visibility", "Visibility")
687        .node("struct_kw", "TerminalStruct")
688        .key_node("name", "TerminalIdentifier")
689        .node("generic_params", "OptionWrappedGenericParamList")
690        .node("lbrace", "TerminalLBrace")
691        .node("members", "MemberList")
692        .node("rbrace", "TerminalRBrace")
693    )
694    .add_struct(StructBuilder::new("ItemEnum")
695        .node("attributes" ,"AttributeList")
696        .node("visibility", "Visibility")
697        .node("enum_kw", "TerminalEnum")
698        .key_node("name", "TerminalIdentifier")
699        .node("generic_params", "OptionWrappedGenericParamList")
700        .node("lbrace", "TerminalLBrace")
701        .node("variants", "VariantList")
702        .node("rbrace", "TerminalRBrace")
703    )
704    .add_struct(StructBuilder::new("ItemTypeAlias")
705        .node("attributes" ,"AttributeList")
706        .node("visibility", "Visibility")
707        .node("type_kw", "TerminalType")
708        .key_node("name", "TerminalIdentifier")
709        .node("generic_params", "OptionWrappedGenericParamList")
710        .node("eq", "TerminalEq")
711        .node("ty", "Expr")
712        .node("semicolon", "TerminalSemicolon")
713    )
714    .add_struct(StructBuilder::new("ItemUse")
715        .node("attributes" ,"AttributeList")
716        .node("visibility", "Visibility")
717        .node("use_kw", "TerminalUse")
718        .key_node("use_path", "UsePath")
719        .node("semicolon", "TerminalSemicolon")
720    )
721    .add_enum(
722        EnumBuilder::new("UsePath")
723        .node("Leaf")
724        .node("Single")
725        .node("Multi")
726        .node("Star")
727    )
728    .add_struct(StructBuilder::new("UsePathLeaf")
729        .key_node("ident", "PathSegment")
730        .key_node("alias_clause", "OptionAliasClause")
731    )
732    .add_struct(StructBuilder::new("UsePathSingle")
733        .node("ident", "PathSegment")
734        .node("colon_colon", "TerminalColonColon")
735        .node("use_path", "UsePath")
736    )
737    .add_struct(StructBuilder::new("UsePathMulti")
738        .node("lbrace", "TerminalLBrace")
739        .node("use_paths", "UsePathList")
740        .node("rbrace", "TerminalRBrace")
741    )
742    .add_struct(StructBuilder::new("UsePathStar")
743        .node("star", "TerminalMul")
744    )
745    .add_separated_list("UsePathList", "UsePath", "TerminalComma")
746    .add_struct(StructBuilder::new("AliasClause")
747        .node("as_kw", "TerminalAs")
748        .key_node("alias", "TerminalIdentifier")
749    )
750    .add_option("AliasClause")
751    // --- Generics ---
752    .add_enum(
753        EnumBuilder::new("GenericArg")
754        .node("Unnamed")
755        .node("Named")
756    )
757    .add_struct(StructBuilder::new("GenericArgNamed")
758        .node("name", "TerminalIdentifier")
759        .node("colon", "TerminalColon")
760        .node("value", "GenericArgValue")
761    )
762    .add_struct(StructBuilder::new("GenericArgUnnamed")
763        .node("value", "GenericArgValue")
764    )
765    .add_enum(
766        EnumBuilder::new("GenericArgValue")
767        .node("Expr")
768        .node_with_explicit_kind("Underscore", "TerminalUnderscore")
769    )
770    .add_struct(StructBuilder::new("GenericArgValueExpr")
771        .node("expr", "Expr")
772    )
773    .add_struct(StructBuilder::new("GenericArgs")
774        .node("langle", "TerminalLT")
775        .node("generic_args", "GenericArgList")
776        .node("rangle", "TerminalGT")
777    )
778    .add_separated_list("GenericArgList", "GenericArg", "TerminalComma")
779    .add_struct(
780        StructBuilder::new("AssociatedItemConstraint")
781        .node("item","TerminalIdentifier")
782        .node("colon","TerminalColon")
783        .node("value","Expr")
784    )
785    .add_struct(StructBuilder::new("AssociatedItemConstraints")
786        .node("lbrack", "TerminalLBrack")
787        .node("associated_item_constraints", "AssociatedItemConstraintList")
788        .node("rbrack", "TerminalRBrack")
789    )
790    .add_separated_list("AssociatedItemConstraintList", "AssociatedItemConstraint", "TerminalComma")
791    .add_option("AssociatedItemConstraints")
792    .add_option("WrappedGenericParamList")
793    .add_struct(StructBuilder::new("WrappedGenericParamList")
794        .node("langle", "TerminalLT")
795        .node("generic_params", "GenericParamList")
796        .node("rangle", "TerminalGT")
797    )
798    .add_separated_list("GenericParamList", "GenericParam", "TerminalComma")
799    // TODO(spapini): Remove this indirection.
800    .add_enum(EnumBuilder::new("GenericParam")
801        .node("Type")
802        .node("Const")
803        .node("ImplNamed")
804        .node("ImplAnonymous")
805        .node("NegativeImpl")
806    )
807    .add_struct(StructBuilder::new("GenericParamType")
808        .key_node("name", "TerminalIdentifier")
809    )
810    .add_struct(StructBuilder::new("GenericParamConst")
811        .node("const_kw", "TerminalConst")
812        .key_node("name", "TerminalIdentifier")
813        .node("colon", "TerminalColon")
814        .node("ty", "Expr")
815    )
816    .add_struct(StructBuilder::new("GenericParamImplNamed")
817        .node("impl_kw", "TerminalImpl")
818        .key_node("name", "TerminalIdentifier")
819        .node("colon", "TerminalColon")
820        .node("trait_path", "ExprPath")
821        .node("type_constrains", "OptionAssociatedItemConstraints")
822    )
823    .add_struct(StructBuilder::new("GenericParamImplAnonymous")
824        .node("plus", "TerminalPlus")
825        .node("trait_path", "ExprPath")
826        .node("type_constrains", "OptionAssociatedItemConstraints")
827    )
828    .add_struct(StructBuilder::new("GenericParamNegativeImpl")
829        .node("minus", "TerminalMinus")
830        .node("trait_path", "ExprPath")
831    )
832    // --- Macros ---
833    // The structure of a token tree is:
834    // TokenTree: TokenNode | WrappedTokenTree
835    // Where WrappedTokenTree is:
836    // WrappedTokenTree: (TokenTree*) | {TokenTree*} | [TokenTree*]
837    // TokenTree* is represented as TokenList.
838    .add_list("TokenList", "TokenTree")
839    .add_struct(StructBuilder::new("TokenTreeLeaf")
840        .node("leaf", "TokenNode")
841    )
842    .add_struct(StructBuilder::new("TokenTreeNode")
843        .node("subtree", "WrappedTokenTree")
844    )
845    // TODO(Dean): Remove TokenTreeRepetition and TokenTreeParam (it's redundant).
846    .add_struct(StructBuilder::new("TokenTreeRepetition")
847        .node("dollar", "TerminalDollar")
848        .node("lparen", "TerminalLParen")
849        .node("elements", "TokenList")
850        .node("rparen", "TerminalRParen")
851        .node("separator", "OptionTerminalComma")
852        .node("operator", "MacroRepetitionOperator")
853    )
854    .add_struct(StructBuilder::new("TokenTreeParam")
855        .node("dollar", "TerminalDollar")
856        .node("name", "TerminalIdentifier")
857    )
858    .add_enum(EnumBuilder::new("TokenTree")
859        .missing("Missing")
860        .node_with_explicit_kind("Token", "TokenTreeLeaf")
861        .node_with_explicit_kind("Subtree", "TokenTreeNode")
862        .node_with_explicit_kind("Repetition", "TokenTreeRepetition")
863        .node_with_explicit_kind("Param", "TokenTreeParam")
864    )
865    .add_struct(StructBuilder::new("TokenTreeMissing"))
866    .add_enum(EnumBuilder::new("WrappedTokenTree")
867        .missing("Missing")
868        .node_with_explicit_kind("Parenthesized", "ParenthesizedTokenTree")
869        .node_with_explicit_kind("Braced", "BracedTokenTree")
870        .node_with_explicit_kind("Bracketed", "BracketedTokenTree")
871    )
872    .add_struct(StructBuilder::new("WrappedTokenTreeMissing"))
873    .add_struct(StructBuilder::new("ParenthesizedTokenTree")
874        .node("lparen", "TerminalLParen")
875        .node("tokens", "TokenList")
876        .node("rparen", "TerminalRParen")
877    )
878    .add_struct(StructBuilder::new("BracedTokenTree")
879        .node("lbrace", "TerminalLBrace")
880        .node("tokens", "TokenList")
881        .node("rbrace", "TerminalRBrace")
882    )
883    .add_struct(StructBuilder::new("BracketedTokenTree")
884        .node("lbrack", "TerminalLBrack")
885        .node("tokens", "TokenList")
886        .node("rbrack", "TerminalRBrack")
887    )
888    .add_struct(StructBuilder::new("ExprInlineMacro")
889        .node("path", "ExprPath")
890        .node("bang", "TerminalNot")
891        .node("arguments", "TokenTreeNode")
892    )
893    .add_struct(StructBuilder::new("ItemInlineMacro")
894    .node("attributes" ,"AttributeList")
895    .node("path", "ExprPath")
896    .node("bang", "TerminalNot")
897    .node("arguments", "TokenTreeNode")
898    .node("semicolon", "TerminalSemicolon"))
899    .add_struct(StructBuilder::new("ItemMacroDeclaration")
900        .node("attributes" ,"AttributeList")
901        .node("visibility", "Visibility")
902        .node("macro_kw", "TerminalMacro")
903        .key_node("name", "TerminalIdentifier")
904        .node("lbrace", "TerminalLBrace")
905        .node("rules", "MacroRulesList")
906        .node("rbrace", "TerminalRBrace")
907    )
908    .add_list("MacroRulesList", "MacroRule")
909    .add_struct(StructBuilder::new("MacroRule")
910        .node("lhs", "WrappedMacro")
911        .node("fat_arrow", "TerminalMatchArrow")
912        .node("rhs", "BracedMacro")
913        .node("semicolon", "TerminalSemicolon")
914    )
915    .add_struct(StructBuilder::new("ParamKind")
916        .node("colon", "TerminalColon")
917        .node("kind", "MacroParamKind")
918    )
919    .add_option("ParamKind")
920    .add_struct(StructBuilder::new("MacroParam")
921        .node("dollar", "TerminalDollar")
922        .node("name", "TerminalIdentifier")
923        .node("kind", "OptionParamKind")
924    )
925    .add_struct(StructBuilder::new("MacroRepetition")
926        .node("dollar", "TerminalDollar")
927        .node("lparen", "TerminalLParen")
928        .node("elements", "MacroElements")
929        .node("rparen", "TerminalRParen")
930        // TODO(Dean): Add support for more kinds of separators.
931        .node("separator", "OptionTerminalComma")
932        .node("operator", "MacroRepetitionOperator")
933    )
934    .add_option("TerminalComma")
935    .add_enum(EnumBuilder::new("MacroRepetitionOperator")
936        .node_with_explicit_kind("ZeroOrOne", "TerminalQuestionMark")
937        .node_with_explicit_kind("OneOrMore", "TerminalPlus")
938        .node_with_explicit_kind("ZeroOrMore", "TerminalMul")
939        .missing("Missing")
940    )
941    .add_struct(StructBuilder::new("MacroRepetitionOperatorMissing"))
942    // TODO(Gil): Add support for more kinds of macro rule parameters.
943    .add_struct(StructBuilder::new("ParamIdent")
944        .node("ident", "TerminalIdentifier")
945    )
946    .add_struct(StructBuilder::new("ParamExpr")
947        .node("expr", "TerminalIdentifier")
948    )
949    .add_enum(EnumBuilder::new("MacroParamKind")
950        .node_with_explicit_kind("Identifier", "ParamIdent")
951        .node_with_explicit_kind("Expr", "ParamExpr")
952        .missing("Missing")
953    )
954    .add_struct(StructBuilder::new("MacroParamKindMissing"))
955    .add_enum(EnumBuilder::new("MacroElement")
956        .node_with_explicit_kind("Token", "TokenTreeLeaf")
957        .node_with_explicit_kind("Param", "MacroParam")
958        .node_with_explicit_kind("Subtree", "MacroWrapper")
959        .node_with_explicit_kind("Repetition", "MacroRepetition")
960    )
961    .add_list("MacroElements", "MacroElement")
962    .add_struct(StructBuilder::new("MacroWrapper")
963        .node("subtree", "WrappedMacro")
964    )
965    .add_enum(EnumBuilder::new("WrappedMacro")
966        .node_with_explicit_kind("Parenthesized", "ParenthesizedMacro")
967        .node_with_explicit_kind("Braced", "BracedMacro")
968        .node_with_explicit_kind("Bracketed", "BracketedMacro")
969    )
970    .add_struct(StructBuilder::new("ParenthesizedMacro")
971        .node("lparen", "TerminalLParen")
972        .node("elements", "MacroElements")
973        .node("rparen", "TerminalRParen")
974    )
975    .add_struct(StructBuilder::new("BracedMacro")
976        .node("lbrace", "TerminalLBrace")
977        .node("elements", "MacroElements")
978        .node("rbrace", "TerminalRBrace")
979    )
980    .add_struct(StructBuilder::new("BracketedMacro")
981        .node("lbrack", "TerminalLBrack")
982        .node("elements", "MacroElements")
983        .node("rbrack", "TerminalRBrack")
984    )
985    .add_struct(StructBuilder::new("LegacyExprInlineMacro")
986        .node("path", "ExprPath")
987        .node("bang", "TerminalNot")
988        .node("arguments", "WrappedArgList")
989    )
990    .add_struct(StructBuilder::new("LegacyItemInlineMacro")
991        .node("attributes" ,"AttributeList")
992        .node("path", "ExprPath")
993        .node("bang", "TerminalNot")
994        .node("arguments", "WrappedArgList")
995        .node("semicolon", "TerminalSemicolon"))
996    // --- Skipped nodes ---
997    // A wrapper for the skipped node enum as the enum nodes (Trivium) can't have enum as a child directly.
998    .add_struct(StructBuilder::new("TriviumSkippedNode")
999        .node("node", "SkippedNode")
1000    )
1001    // An enum of all nodes that can be skipped while parsing, new nodes can be added here if needed to be skipped.
1002    .add_enum(EnumBuilder::new("SkippedNode")
1003        .node_with_explicit_kind("AttributeList", "AttributeList")
1004        .node_with_explicit_kind("VisibilityPub", "VisibilityPub")
1005        .node_with_explicit_kind("ExprPath", "ExprPath")
1006    )
1007    // --- Tokens + Terminals ---
1008    .add_token_and_terminal("Identifier")
1009    .add_token_and_terminal("LiteralNumber")
1010    .add_token_and_terminal("ShortString")
1011    .add_token_and_terminal("String")
1012    .add_keyword_token_and_terminal("As")
1013    .add_keyword_token_and_terminal("Const")
1014    .add_keyword_token_and_terminal("Else")
1015    .add_keyword_token_and_terminal("Enum")
1016    .add_keyword_token_and_terminal("Extern")
1017    .add_keyword_token_and_terminal("False")
1018    .add_keyword_token_and_terminal("Function")
1019    .add_keyword_token_and_terminal("If")
1020    .add_keyword_token_and_terminal("While")
1021    .add_keyword_token_and_terminal("For")
1022    .add_keyword_token_and_terminal("Loop")
1023    .add_keyword_token_and_terminal("Impl")
1024    .add_keyword_token_and_terminal("Implicits")
1025    .add_keyword_token_and_terminal("Let")
1026    .add_keyword_token_and_terminal("Macro")
1027    .add_keyword_token_and_terminal("Match")
1028    .add_keyword_token_and_terminal("Module")
1029    .add_keyword_token_and_terminal("Mut")
1030    .add_keyword_token_and_terminal("NoPanic")
1031    .add_keyword_token_and_terminal("Of")
1032    .add_keyword_token_and_terminal("Ref")
1033    .add_keyword_token_and_terminal("Continue")
1034    .add_keyword_token_and_terminal("Return")
1035    .add_keyword_token_and_terminal("Break")
1036    .add_keyword_token_and_terminal("Struct")
1037    .add_keyword_token_and_terminal("Trait")
1038    .add_keyword_token_and_terminal("True")
1039    .add_keyword_token_and_terminal("Type")
1040    .add_keyword_token_and_terminal("Use")
1041    .add_keyword_token_and_terminal("Pub")
1042    .add_token_and_terminal("And")
1043    .add_token_and_terminal("AndAnd")
1044    .add_token_and_terminal("Arrow")
1045    .add_token_and_terminal("At")
1046    .add_token_and_terminal("BadCharacters")
1047    .add_token_and_terminal("Colon")
1048    .add_token_and_terminal("ColonColon")
1049    .add_token_and_terminal("Comma")
1050    .add_token_and_terminal("Div")
1051    .add_token_and_terminal("DivEq")
1052    .add_token_and_terminal("Dollar")
1053    .add_token_and_terminal("Dot")
1054    .add_token_and_terminal("DotDot")
1055    .add_token_and_terminal("DotDotEq")
1056    .add_token_and_terminal("EndOfFile")
1057    .add_token_and_terminal("Eq")
1058    .add_token_and_terminal("EqEq")
1059    .add_token_and_terminal("GE")
1060    .add_token_and_terminal("GT")
1061    .add_token_and_terminal("Hash")
1062    .add_token_and_terminal("LBrace")
1063    .add_token_and_terminal("LBrack")
1064    .add_token_and_terminal("LE")
1065    .add_token_and_terminal("LParen")
1066    .add_token_and_terminal("LT")
1067    .add_token_and_terminal("MatchArrow")
1068    .add_token_and_terminal("Minus")
1069    .add_token_and_terminal("MinusEq")
1070    .add_token_and_terminal("Mod")
1071    .add_token_and_terminal("ModEq")
1072    .add_token_and_terminal("Mul")
1073    .add_token_and_terminal("MulEq")
1074    .add_token_and_terminal("Neq")
1075    .add_token_and_terminal("Not")
1076    .add_token_and_terminal("BitNot")
1077    .add_token_and_terminal("Or")
1078    .add_token_and_terminal("OrOr")
1079    .add_token_and_terminal("Plus")
1080    .add_token_and_terminal("PlusEq")
1081    .add_token_and_terminal("QuestionMark")
1082    .add_token_and_terminal("RBrace")
1083    .add_token_and_terminal("RBrack")
1084    .add_token_and_terminal("RParen")
1085    .add_token_and_terminal("Semicolon")
1086    .add_token_and_terminal("Underscore")
1087    .add_token_and_terminal("Xor")
1088    // --- Meta ---
1089    .add_struct(StructBuilder::new("SyntaxFile")
1090        .node("items", "ModuleItemList")
1091        .node("eof", "TerminalEndOfFile")
1092    )
1093    .add_token_and_terminal("Empty")
1094    .add_token("SingleLineComment")
1095    .add_token("SingleLineInnerComment")
1096    .add_token("SingleLineDocComment")
1097    .add_token("Whitespace")
1098    .add_token("Newline")
1099    .add_token("Missing")
1100    .add_token("Skipped")
1101    .add_all_tokens_enum("TokenNode")
1102    .get()
1103}