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