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