1*13fbcb42Sjoerg//===- Nodes.td - Node types in the Syntax Tree grammar -------------------===//
2*13fbcb42Sjoerg//
3*13fbcb42Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*13fbcb42Sjoerg// See https://llvm.org/LICENSE.txt for license information.
5*13fbcb42Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*13fbcb42Sjoerg//
7*13fbcb42Sjoerg//===----------------------------------------------------------------------===//
8*13fbcb42Sjoerg//
9*13fbcb42Sjoerg// This file defines concrete nodes in the syntax tree.
10*13fbcb42Sjoerg// The archetypes they fall into (Sequence, List etc) are defined in Syntax.td.
11*13fbcb42Sjoerg//
12*13fbcb42Sjoerg// The C++ classes for the archetypes themselves are written by hand, and the
13*13fbcb42Sjoerg// concrete node classes will be generated. Migration to TableGen is not
14*13fbcb42Sjoerg// complete, so currently there is a mix of generated and hand-authored code.
15*13fbcb42Sjoerg//
16*13fbcb42Sjoerg//===----------------------------------------------------------------------===//
17*13fbcb42Sjoerg
18*13fbcb42Sjoerginclude "clang/Tooling/Syntax/Syntax.td"
19*13fbcb42Sjoerg
20*13fbcb42Sjoergdef TranslationUnit : Unconstrained {
21*13fbcb42Sjoerg  let documentation = [{
22*13fbcb42Sjoerg    A root node for a translation unit. Parent is always null.
23*13fbcb42Sjoerg  }];
24*13fbcb42Sjoerg}
25*13fbcb42Sjoerg
26*13fbcb42Sjoergdef UnqualifiedId : External<Tree> {}
27*13fbcb42Sjoerg
28*13fbcb42Sjoerg// Lists
29*13fbcb42Sjoergdef List : External<Tree> {}
30*13fbcb42Sjoergdef DeclaratorList : External<List> {}
31*13fbcb42Sjoergdef ParameterDeclarationList : External<List> {}
32*13fbcb42Sjoergdef CallArguments : External<List> {}
33*13fbcb42Sjoergdef NestedNameSpecifier : External<List> {}
34*13fbcb42Sjoerg
35*13fbcb42Sjoergdef Expression : Alternatives {
36*13fbcb42Sjoerg  let documentation = [{
37*13fbcb42Sjoerg    A base class for all expressions. Note that expressions are not statements,
38*13fbcb42Sjoerg    even though they are in clang.
39*13fbcb42Sjoerg  }];
40*13fbcb42Sjoerg}
41*13fbcb42Sjoergdef UnknownExpression : External<Expression> {}
42*13fbcb42Sjoergdef UnaryOperatorExpression : External<Tree> {}
43*13fbcb42Sjoergdef PrefixUnaryOperatorExpression : External<UnaryOperatorExpression> {}
44*13fbcb42Sjoergdef PostfixUnaryOperatorExpression : External<UnaryOperatorExpression> {}
45*13fbcb42Sjoergdef BinaryOperatorExpression : External<Expression> {}
46*13fbcb42Sjoergdef ParenExpression : Sequence<Expression> {
47*13fbcb42Sjoerg  let documentation = [{
48*13fbcb42Sjoerg    Models a parenthesized expression `(E)`. C++ [expr.prim.paren]
49*13fbcb42Sjoerg    e.g. `(3 + 2)` in `a = 1 + (3 + 2);`
50*13fbcb42Sjoerg  }];
51*13fbcb42Sjoerg  let children = [
52*13fbcb42Sjoerg    Role<"OpenParen", Token<"l_paren">>,
53*13fbcb42Sjoerg    Role<"SubExpression", Expression>,
54*13fbcb42Sjoerg    Role<"CloseParen", Token<"r_paren">>,
55*13fbcb42Sjoerg  ];
56*13fbcb42Sjoerg}
57*13fbcb42Sjoergdef LiteralExpression : Alternatives<Expression> {
58*13fbcb42Sjoerg  let documentation = [{
59*13fbcb42Sjoerg    Expression for literals. C++ [lex.literal]
60*13fbcb42Sjoerg  }];
61*13fbcb42Sjoerg}
62*13fbcb42Sjoergdef IntegerLiteralExpression : Sequence<LiteralExpression> {
63*13fbcb42Sjoerg  let documentation = [{
64*13fbcb42Sjoerg    Expression for integer literals. C++ [lex.icon]
65*13fbcb42Sjoerg  }];
66*13fbcb42Sjoerg  let children = [
67*13fbcb42Sjoerg    Role<"LiteralToken", Token<"numeric_constant">>,
68*13fbcb42Sjoerg  ];
69*13fbcb42Sjoerg}
70*13fbcb42Sjoergdefvar AnyCharacterLiteral = AnyToken<[
71*13fbcb42Sjoerg  "char_constant", "wide_char_constant", "utf8_char_constant",
72*13fbcb42Sjoerg  "utf16_char_constant", "utf32_char_constant"
73*13fbcb42Sjoerg]>;
74*13fbcb42Sjoergdef CharacterLiteralExpression : Sequence<LiteralExpression> {
75*13fbcb42Sjoerg  let documentation = [{
76*13fbcb42Sjoerg    Expression for character literals. C++ [lex.ccon]
77*13fbcb42Sjoerg  }];
78*13fbcb42Sjoerg  let children = [
79*13fbcb42Sjoerg    Role<"LiteralToken", AnyCharacterLiteral>,
80*13fbcb42Sjoerg  ];
81*13fbcb42Sjoerg}
82*13fbcb42Sjoergdef FloatingLiteralExpression : Sequence<LiteralExpression> {
83*13fbcb42Sjoerg  let documentation = [{
84*13fbcb42Sjoerg    Expression for floating-point literals. C++ [lex.fcon]
85*13fbcb42Sjoerg  }];
86*13fbcb42Sjoerg  let children = [
87*13fbcb42Sjoerg    Role<"LiteralToken", Token<"numeric_constant">>,
88*13fbcb42Sjoerg  ];
89*13fbcb42Sjoerg}
90*13fbcb42Sjoergdefvar AnyStringLiteral = AnyToken<[
91*13fbcb42Sjoerg  "string_literal", "wide_string_literal", "utf8_string_literal",
92*13fbcb42Sjoerg  "utf16_string_literal", "utf32_string_literal"
93*13fbcb42Sjoerg]>;
94*13fbcb42Sjoergdef StringLiteralExpression : Sequence<LiteralExpression> {
95*13fbcb42Sjoerg  let documentation = [{
96*13fbcb42Sjoerg    Expression for string-literals. C++ [lex.string]
97*13fbcb42Sjoerg  }];
98*13fbcb42Sjoerg  // FIXME: string literals may consist of multiple tokens.
99*13fbcb42Sjoerg  // These are merged in phase 6, but tokens are captured after phase 4.
100*13fbcb42Sjoerg  // The child here should be a list of literal tokens instead.
101*13fbcb42Sjoerg  let children = [
102*13fbcb42Sjoerg    Role<"LiteralToken", AnyStringLiteral>,
103*13fbcb42Sjoerg  ];
104*13fbcb42Sjoerg}
105*13fbcb42Sjoergdef BoolLiteralExpression : Sequence<LiteralExpression> {
106*13fbcb42Sjoerg  let documentation = [{
107*13fbcb42Sjoerg    Expression for boolean literals. C++ [lex.bool]
108*13fbcb42Sjoerg  }];
109*13fbcb42Sjoerg  let children = [
110*13fbcb42Sjoerg    Role<"LiteralToken", AnyToken<["kw_false","kw_true"]>>,
111*13fbcb42Sjoerg  ];
112*13fbcb42Sjoerg}
113*13fbcb42Sjoergdef CxxNullPtrExpression : Sequence<LiteralExpression> {
114*13fbcb42Sjoerg  let documentation = [{
115*13fbcb42Sjoerg    Expression for the `nullptr` literal. C++ [lex.nullptr]
116*13fbcb42Sjoerg  }];
117*13fbcb42Sjoerg  let children = [
118*13fbcb42Sjoerg    Role<"LiteralToken", Keyword<"nullptr">>,
119*13fbcb42Sjoerg  ];
120*13fbcb42Sjoerg}
121*13fbcb42Sjoergdef UserDefinedLiteralExpression : Alternatives<LiteralExpression> {
122*13fbcb42Sjoerg  let documentation = [{
123*13fbcb42Sjoerg    Expression for user-defined literal. C++ [lex.ext]
124*13fbcb42Sjoerg    user-defined-literal:
125*13fbcb42Sjoerg      user-defined-integer-literal
126*13fbcb42Sjoerg      user-defined-floating-point-literal
127*13fbcb42Sjoerg      user-defined-string-literal
128*13fbcb42Sjoerg      user-defined-character-literal
129*13fbcb42Sjoerg  }];
130*13fbcb42Sjoerg}
131*13fbcb42Sjoergdef IntegerUserDefinedLiteralExpression : Sequence<UserDefinedLiteralExpression> {
132*13fbcb42Sjoerg  let documentation = [{
133*13fbcb42Sjoerg    Expression for user-defined-integer-literal. C++ [lex.ext]
134*13fbcb42Sjoerg  }];
135*13fbcb42Sjoerg  let children = [
136*13fbcb42Sjoerg    Role<"LiteralToken", Keyword<"numeric_constant">>,
137*13fbcb42Sjoerg  ];
138*13fbcb42Sjoerg}
139*13fbcb42Sjoergdef FloatUserDefinedLiteralExpression : Sequence<UserDefinedLiteralExpression> {
140*13fbcb42Sjoerg  let documentation = [{
141*13fbcb42Sjoerg    Expression for user-defined-floating-point-literal. C++ [lex.ext]
142*13fbcb42Sjoerg  }];
143*13fbcb42Sjoerg  let children = [
144*13fbcb42Sjoerg    Role<"LiteralToken", Keyword<"numeric_constant">>,
145*13fbcb42Sjoerg  ];
146*13fbcb42Sjoerg}
147*13fbcb42Sjoergdef CharUserDefinedLiteralExpression : Sequence<UserDefinedLiteralExpression> {
148*13fbcb42Sjoerg  let documentation = [{
149*13fbcb42Sjoerg    Expression for user-defined-character-literal. C++ [lex.ext]
150*13fbcb42Sjoerg  }];
151*13fbcb42Sjoerg  let children = [
152*13fbcb42Sjoerg    Role<"LiteralToken", AnyCharacterLiteral>,
153*13fbcb42Sjoerg  ];
154*13fbcb42Sjoerg}
155*13fbcb42Sjoergdef StringUserDefinedLiteralExpression : Sequence<UserDefinedLiteralExpression> {
156*13fbcb42Sjoerg  let documentation = [{
157*13fbcb42Sjoerg    Expression for user-defined-string-literal. C++ [lex.ext]
158*13fbcb42Sjoerg  }];
159*13fbcb42Sjoerg  let children = [
160*13fbcb42Sjoerg    Role<"LiteralToken", AnyStringLiteral>,
161*13fbcb42Sjoerg  ];
162*13fbcb42Sjoerg}
163*13fbcb42Sjoergdef IdExpression : Sequence<Expression> {
164*13fbcb42Sjoerg  let documentation = [{
165*13fbcb42Sjoerg    Models an `id-expression`, e.g. `std::vector<int>::size`.
166*13fbcb42Sjoerg    C++ [expr.prim.id]
167*13fbcb42Sjoerg    id-expression:
168*13fbcb42Sjoerg      unqualified-id
169*13fbcb42Sjoerg      qualified-id
170*13fbcb42Sjoerg    qualified-id:
171*13fbcb42Sjoerg      nested-name-specifier template_opt unqualified-id
172*13fbcb42Sjoerg  }];
173*13fbcb42Sjoerg  let children = [
174*13fbcb42Sjoerg    Role<"Qualifier", Optional<NestedNameSpecifier>>,
175*13fbcb42Sjoerg    Role<"TemplateKeyword", Optional<Keyword<"template">>>,
176*13fbcb42Sjoerg    Role<"UnqualifiedId", UnqualifiedId>,
177*13fbcb42Sjoerg  ];
178*13fbcb42Sjoerg}
179*13fbcb42Sjoergdef MemberExpression : Sequence<Expression> {
180*13fbcb42Sjoerg  let documentation = [{
181*13fbcb42Sjoerg    Models a class member access. C++ [expr.ref]
182*13fbcb42Sjoerg    member-expression:
183*13fbcb42Sjoerg      expression -> template_opt id-expression
184*13fbcb42Sjoerg      expression .  template_opt id-expression
185*13fbcb42Sjoerg    e.g. `x.a`, `xp->a`
186*13fbcb42Sjoerg
187*13fbcb42Sjoerg    Note: An implicit member access inside a class, i.e. `a` instead of
188*13fbcb42Sjoerg    `this->a`, is an `id-expression`.
189*13fbcb42Sjoerg  }];
190*13fbcb42Sjoerg  let children = [
191*13fbcb42Sjoerg    Role<"Object", Expression>,
192*13fbcb42Sjoerg    Role<"AccessToken", AnyToken<["period","arrow"]>>,
193*13fbcb42Sjoerg    Role<"TemplateKeyword", Optional<Keyword<"template">>>,
194*13fbcb42Sjoerg    Role<"Member", IdExpression>,
195*13fbcb42Sjoerg  ];
196*13fbcb42Sjoerg}
197*13fbcb42Sjoergdef ThisExpression : Sequence<Expression> {
198*13fbcb42Sjoerg  let documentation = [{
199*13fbcb42Sjoerg    Models a this expression `this`. C++ [expr.prim.this]
200*13fbcb42Sjoerg  }];
201*13fbcb42Sjoerg  let children = [
202*13fbcb42Sjoerg    Role<"IntroducerKeyword", Keyword<"this">>,
203*13fbcb42Sjoerg  ];
204*13fbcb42Sjoerg}
205*13fbcb42Sjoergdef CallExpression : Sequence<Expression> {
206*13fbcb42Sjoerg  let documentation = [{
207*13fbcb42Sjoerg    A function call. C++ [expr.call]
208*13fbcb42Sjoerg    call-expression:
209*13fbcb42Sjoerg      expression '(' call-arguments ')'
210*13fbcb42Sjoerg    e.g `f(1, '2')` or `this->Base::f()`
211*13fbcb42Sjoerg  }];
212*13fbcb42Sjoerg  let children = [
213*13fbcb42Sjoerg    Role<"Callee", Expression>,
214*13fbcb42Sjoerg    Role<"OpenParen", Token<"l_paren">>,
215*13fbcb42Sjoerg    Role<"Arguments", CallArguments>,
216*13fbcb42Sjoerg    Role<"CloseParen", Token<"r_paren">>,
217*13fbcb42Sjoerg  ];
218*13fbcb42Sjoerg}
219*13fbcb42Sjoerg
220*13fbcb42Sjoerg// Statements.
221*13fbcb42Sjoergdef Statement : External<Tree> {}
222*13fbcb42Sjoergdef UnknownStatement : External<Statement> {}
223*13fbcb42Sjoergdef DeclarationStatement : External<Statement> {}
224*13fbcb42Sjoergdef EmptyStatement : External<Statement> {}
225*13fbcb42Sjoergdef SwitchStatement : External<Statement> {}
226*13fbcb42Sjoergdef CaseStatement : External<Statement> {}
227*13fbcb42Sjoergdef DefaultStatement : External<Statement> {}
228*13fbcb42Sjoergdef IfStatement : External<Statement> {}
229*13fbcb42Sjoergdef ForStatement : External<Statement> {}
230*13fbcb42Sjoergdef WhileStatement : External<Statement> {}
231*13fbcb42Sjoergdef ContinueStatement : External<Statement> {}
232*13fbcb42Sjoergdef BreakStatement : External<Statement> {}
233*13fbcb42Sjoergdef ReturnStatement : External<Statement> {}
234*13fbcb42Sjoergdef RangeBasedForStatement : External<Statement> {}
235*13fbcb42Sjoergdef ExpressionStatement : External<Statement> {}
236*13fbcb42Sjoergdef CompoundStatement : External<Statement> {}
237*13fbcb42Sjoerg
238*13fbcb42Sjoerg// Declarations.
239*13fbcb42Sjoergdef Declaration : External<Tree> {}
240*13fbcb42Sjoergdef UnknownDeclaration : External<Declaration> {}
241*13fbcb42Sjoergdef EmptyDeclaration : External<Declaration> {}
242*13fbcb42Sjoergdef StaticAssertDeclaration : External<Declaration> {}
243*13fbcb42Sjoergdef LinkageSpecificationDeclaration : External<Declaration> {}
244*13fbcb42Sjoergdef SimpleDeclaration : External<Declaration> {}
245*13fbcb42Sjoergdef TemplateDeclaration : External<Declaration> {}
246*13fbcb42Sjoergdef ExplicitTemplateInstantiation : External<Declaration> {}
247*13fbcb42Sjoergdef NamespaceDefinition : External<Declaration> {}
248*13fbcb42Sjoergdef NamespaceAliasDefinition : External<Declaration> {}
249*13fbcb42Sjoergdef UsingNamespaceDirective : External<Declaration> {}
250*13fbcb42Sjoergdef UsingDeclaration : External<Declaration> {}
251*13fbcb42Sjoergdef TypeAliasDeclaration : External<Declaration> {}
252*13fbcb42Sjoerg
253*13fbcb42Sjoerg// Declarators.
254*13fbcb42Sjoergdef Declarator : External<Tree> {}
255*13fbcb42Sjoergdef SimpleDeclarator : External<Declarator> {}
256*13fbcb42Sjoergdef ParenDeclarator : External<Declarator> {}
257*13fbcb42Sjoerg
258*13fbcb42Sjoergdef ArraySubscript : External<Tree> {}
259*13fbcb42Sjoergdef TrailingReturnType : External<Tree> {}
260*13fbcb42Sjoergdef ParametersAndQualifiers : External<Tree> {}
261*13fbcb42Sjoergdef MemberPointer : External<Tree> {}
262*13fbcb42Sjoerg
263*13fbcb42Sjoerg// Name Specifiers.
264*13fbcb42Sjoergdef NameSpecifier : Alternatives {
265*13fbcb42Sjoerg  let documentation = [{
266*13fbcb42Sjoerg    A sequence of these specifiers make a `nested-name-specifier`.
267*13fbcb42Sjoerg    e.g. the `std` or `vector<int>` in `std::vector<int>::size`.
268*13fbcb42Sjoerg  }];
269*13fbcb42Sjoerg}
270*13fbcb42Sjoergdef GlobalNameSpecifier : Unconstrained<NameSpecifier> {
271*13fbcb42Sjoerg  let documentation = [{
272*13fbcb42Sjoerg    The global namespace name specifier, this specifier doesn't correspond to a
273*13fbcb42Sjoerg    token instead an absence of tokens before a `::` characterizes it, in
274*13fbcb42Sjoerg    `::std::vector<int>` it would be characterized by the absence of a token
275*13fbcb42Sjoerg    before the first `::`
276*13fbcb42Sjoerg  }];
277*13fbcb42Sjoerg}
278*13fbcb42Sjoergdef DecltypeNameSpecifier : Unconstrained<NameSpecifier> {
279*13fbcb42Sjoerg  let documentation = [{
280*13fbcb42Sjoerg    A name specifier holding a decltype, of the form: `decltype ( expression ) `
281*13fbcb42Sjoerg    e.g. the `decltype(s)` in `decltype(s)::size`.
282*13fbcb42Sjoerg  }];
283*13fbcb42Sjoerg}
284*13fbcb42Sjoergdef IdentifierNameSpecifier : Unconstrained<NameSpecifier> {
285*13fbcb42Sjoerg  let documentation = [{
286*13fbcb42Sjoerg    A identifier name specifier, of the form `identifier`
287*13fbcb42Sjoerg    e.g. the `std` in `std::vector<int>::size`.
288*13fbcb42Sjoerg  }];
289*13fbcb42Sjoerg}
290*13fbcb42Sjoergdef SimpleTemplateNameSpecifier : Unconstrained<NameSpecifier> {
291*13fbcb42Sjoerg  let documentation = [{
292*13fbcb42Sjoerg    A name specifier with a simple-template-id, of the form `template_opt
293*13fbcb42Sjoerg    identifier < template-args >` e.g. the `vector<int>` in
294*13fbcb42Sjoerg    `std::vector<int>::size`.
295*13fbcb42Sjoerg  }];
296*13fbcb42Sjoerg}
297