Constant tree_sitter_cpp::GRAMMAR [−][src]
pub const GRAMMAR: &str = "const C = require(\"tree-sitter-c/grammar\")\n\nconst PREC = Object.assign(C.PREC, {\n LAMBDA: 18,\n NEW: C.PREC.CALL + 1,\n STRUCTURED_BINDING: -1,\n})\n\nmodule.exports = grammar(C, {\n name: \'cpp\',\n\n externals: $ => [\n $.raw_string_literal\n ],\n\n conflicts: ($, original) => original.concat([\n [$.template_function, $.template_type],\n [$.template_function, $.template_type, $._expression],\n [$.template_function, $.template_type, $.qualified_identifier],\n [$.template_method, $.field_expression],\n [$.template_type, $.qualified_type_identifier],\n [$.qualified_type_identifier, $.qualified_identifier],\n [$.dependent_type_identifier, $.dependent_identifier],\n [$.comma_expression, $.initializer_list],\n [$._expression, $._declarator],\n [$._expression, $.structured_binding_declarator],\n [$._expression, $._declarator, $._type_specifier],\n [$.parameter_list, $.argument_list],\n [$._type_specifier, $.call_expression],\n [$._declaration_specifiers, $._constructor_specifiers],\n [$._declaration_modifiers, $.operator_cast_declaration, $.operator_cast_definition, $.constructor_or_destructor_definition],\n [$._declaration_modifiers, $.attributed_statement, $.operator_cast_declaration, $.operator_cast_definition, $.constructor_or_destructor_definition],\n [$.attributed_statement, $.operator_cast_declaration, $.operator_cast_definition, $.constructor_or_destructor_definition],\n ]),\n\n inline: ($, original) => original.concat([\n $._namespace_identifier,\n ]),\n\n rules: {\n _top_level_item: ($, original) => choice(\n original,\n $.namespace_definition,\n $.using_declaration,\n $.alias_declaration,\n $.static_assert_declaration,\n $.template_declaration,\n $.template_instantiation,\n alias($.constructor_or_destructor_definition, $.function_definition),\n alias($.operator_cast_definition, $.function_definition),\n alias($.operator_cast_declaration, $.declaration),\n ),\n\n // Types\n\n decltype: $ => seq(\n \'decltype\',\n \'(\',\n $._expression,\n \')\',\n ),\n\n _type_specifier: $ => choice(\n $.struct_specifier,\n $.union_specifier,\n $.enum_specifier,\n $.class_specifier,\n $.sized_type_specifier,\n $.primitive_type,\n $.template_type,\n $.auto,\n $.dependent_type,\n $.decltype,\n prec.right(choice(\n alias($.qualified_type_identifier, $.qualified_identifier),\n $._type_identifier\n ))\n ),\n\n type_qualifier: ($, original) => choice(\n original,\n \'mutable\',\n \'constexpr\'\n ),\n\n // When used in a trailing return type, these specifiers can now occur immediately before\n // a compound statement. This introduces a shift/reduce conflict that needs to be resolved\n // with an associativity.\n class_specifier: $ => prec.right(seq(\n \'class\',\n optional($.ms_declspec_modifier),\n choice(\n field(\'name\', $._class_name),\n seq(\n optional(field(\'name\', $._class_name)),\n optional($.virtual_specifier),\n optional($.base_class_clause),\n field(\'body\', $.field_declaration_list)\n )\n )\n )),\n\n union_specifier: $ => prec.right(seq(\n \'union\',\n optional($.ms_declspec_modifier),\n choice(\n field(\'name\', $._class_name),\n seq(\n optional(field(\'name\', $._class_name)),\n optional($.virtual_specifier),\n optional($.base_class_clause),\n field(\'body\', $.field_declaration_list)\n )\n )\n )),\n\n struct_specifier: $ => prec.right(seq(\n \'struct\',\n optional($.ms_declspec_modifier),\n choice(\n field(\'name\', $._class_name),\n seq(\n optional(field(\'name\', $._class_name)),\n optional($.virtual_specifier),\n optional($.base_class_clause),\n field(\'body\', $.field_declaration_list)\n )\n )\n )),\n\n _class_name: $ => prec.right(choice(\n $._type_identifier,\n $.template_type,\n alias($.qualified_type_identifier, $.qualified_identifier)\n )),\n\n virtual_specifier: $ => choice(\n \'final\', // the only legal value here for classes\n \'override\' // legal for functions in addition to final, plus permutations.\n ),\n\n virtual_function_specifier: $ => choice(\n \'virtual\'\n ),\n\n _declaration_modifiers: ($, original) => choice(\n original,\n $.virtual_function_specifier,\n ),\n\n explicit_function_specifier: $ => choice(\n \'explicit\',\n prec(PREC.CALL, seq(\n \'explicit\',\n \'(\',\n $._expression,\n \')\'\n ))\n ),\n\n base_class_clause: $ => seq(\n \':\',\n commaSep1(seq(\n optional(choice(\'public\', \'private\', \'protected\')),\n $._class_name,\n optional(\'...\')\n ))\n ),\n\n enum_specifier: $ => prec.left(seq(\n \'enum\',\n optional(choice(\'class\', \'struct\')),\n choice(\n seq(\n field(\'name\', $._class_name),\n optional($._enum_base_clause),\n optional(field(\'body\', $.enumerator_list))\n ),\n field(\'body\', $.enumerator_list)\n )\n )),\n\n _enum_base_clause: $ => prec.left(seq(\n \':\',\n field(\'base\', choice(\n alias($.qualified_type_identifier, $.qualified_identifier),\n $._type_identifier,\n $.sized_type_specifier\n ))\n )),\n\n // The `auto` storage class is removed in C++0x in order to allow for the `auto` type.\n storage_class_specifier: ($, original) => choice(\n ...original.members.filter(member => member.value !== \'auto\'),\n \'thread_local\',\n ),\n\n auto: $ => \'auto\',\n\n dependent_type: $ => prec.dynamic(-1, seq(\n \'typename\',\n $._type_specifier\n )),\n\n // Declarations\n\n template_declaration: $ => seq(\n \'template\',\n field(\'parameters\', $.template_parameter_list),\n choice(\n $._empty_declaration,\n $.alias_declaration,\n $.declaration,\n $.template_declaration,\n $.function_definition,\n alias($.constructor_or_destructor_declaration, $.declaration),\n alias($.constructor_or_destructor_definition, $.function_definition),\n alias($.operator_cast_declaration, $.declaration),\n alias($.operator_cast_definition, $.function_definition),\n )\n ),\n\n template_instantiation: $ => seq(\n \'template\',\n optional($._declaration_specifiers),\n field(\'declarator\', $._declarator),\n \';\'\n ),\n\n template_parameter_list: $ => seq(\n \'<\',\n commaSep(choice(\n $.parameter_declaration,\n $.optional_parameter_declaration,\n $.type_parameter_declaration,\n $.variadic_parameter_declaration,\n $.variadic_type_parameter_declaration,\n $.optional_type_parameter_declaration,\n $.template_template_parameter_declaration\n )),\n alias(token(prec(1, \'>\')), \'>\')\n ),\n\n type_parameter_declaration: $ => prec(1, seq(\n choice(\'typename\', \'class\'),\n optional($._type_identifier)\n )),\n\n variadic_type_parameter_declaration: $ => prec(1, seq(\n choice(\'typename\', \'class\'),\n \'...\',\n optional($._type_identifier)\n )),\n\n optional_type_parameter_declaration: $ => seq(\n choice(\'typename\', \'class\'),\n optional(field(\'name\', $._type_identifier)),\n \'=\',\n field(\'default_type\', $._type_specifier)\n ),\n\n template_template_parameter_declaration: $ => seq(\n \'template\',\n field(\'parameters\', $.template_parameter_list),\n choice(\n $.type_parameter_declaration,\n $.variadic_type_parameter_declaration,\n $.optional_type_parameter_declaration\n )\n ),\n\n parameter_list: $ => seq(\n \'(\',\n commaSep(choice(\n $.parameter_declaration,\n $.optional_parameter_declaration,\n $.variadic_parameter_declaration,\n \'...\'\n )),\n \')\'\n ),\n\n optional_parameter_declaration: $ => seq(\n $._declaration_specifiers,\n field(\'declarator\', optional($._declarator)),\n \'=\',\n field(\'default_value\', $._expression)\n ),\n\n variadic_parameter_declaration: $ => seq(\n $._declaration_specifiers,\n field(\'declarator\', choice(\n $.variadic_declarator,\n alias($.variadic_reference_declarator, $.reference_declarator)\n ))\n ),\n\n variadic_declarator: $ => seq(\n \'...\',\n optional($.identifier)\n ),\n\n variadic_reference_declarator: $ => seq(\n choice(\'&&\', \'&\'),\n $.variadic_declarator\n ),\n\n init_declarator: ($, original) => choice(\n original,\n seq(\n field(\'declarator\', $._declarator),\n field(\'value\', choice(\n $.argument_list,\n $.initializer_list\n ))\n )\n ),\n\n operator_cast: $ => prec.right(1, seq(\n \'operator\',\n $._declaration_specifiers,\n field(\'declarator\', $._abstract_declarator),\n )),\n\n // Avoid ambiguity between compound statement and initializer list in a construct like:\n // A b {};\n compound_statement: ($, original) => prec(-1, original),\n\n field_initializer_list: $ => seq(\n \':\',\n commaSep1($.field_initializer)\n ),\n\n field_initializer: $ => prec(1, seq(\n choice(\n $._field_identifier,\n $.template_method,\n alias($.qualified_field_identifier, $.qualified_identifier),\n ),\n choice($.initializer_list, $.argument_list),\n optional(\'...\')\n )),\n\n _field_declaration_list_item: ($, original) => choice(\n original,\n $.template_declaration,\n alias($.inline_method_definition, $.function_definition),\n alias($.constructor_or_destructor_definition, $.function_definition),\n alias($.constructor_or_destructor_declaration, $.declaration),\n alias($.operator_cast_definition, $.function_definition),\n alias($.operator_cast_declaration, $.declaration),\n $.friend_declaration,\n $.access_specifier,\n $.alias_declaration,\n $.using_declaration,\n $.type_definition,\n $.static_assert_declaration\n ),\n\n field_declaration: $ => seq(\n $._declaration_specifiers,\n commaSep(field(\'declarator\', $._field_declarator)),\n optional(choice(\n $.bitfield_clause,\n field(\'default_value\', $.initializer_list),\n seq(\'=\', field(\'default_value\', choice($._expression, $.initializer_list)))\n )),\n \';\'\n ),\n\n inline_method_definition: $ => seq(\n $._declaration_specifiers,\n field(\'declarator\', $._field_declarator),\n choice(\n field(\'body\', $.compound_statement),\n $.default_method_clause,\n $.delete_method_clause\n )\n ),\n\n _constructor_specifiers: $ => choice(\n $._declaration_modifiers,\n $.explicit_function_specifier\n ),\n\n operator_cast_definition: $ => seq(\n repeat($._constructor_specifiers),\n field(\'declarator\', choice(\n $.operator_cast,\n alias($.qualified_operator_cast_identifier, $.qualified_identifier)\n )),\n field(\'body\', $.compound_statement)\n ),\n\n operator_cast_declaration: $ => prec(1, seq(\n repeat($._constructor_specifiers),\n field(\'declarator\', choice(\n $.operator_cast,\n alias($.qualified_operator_cast_identifier, $.qualified_identifier)\n )),\n optional(seq(\'=\', field(\'default_value\', $._expression))),\n \';\'\n )),\n\n constructor_or_destructor_definition: $ => seq(\n repeat($._constructor_specifiers),\n field(\'declarator\', $.function_declarator),\n optional($.field_initializer_list),\n choice(\n field(\'body\', $.compound_statement),\n $.default_method_clause,\n $.delete_method_clause\n )\n ),\n\n constructor_or_destructor_declaration: $ => seq(\n repeat($._constructor_specifiers),\n field(\'declarator\', $.function_declarator),\n \';\'\n ),\n\n default_method_clause: $ => seq(\'=\', \'default\', \';\'),\n delete_method_clause: $ => seq(\'=\', \'delete\', \';\'),\n\n friend_declaration: $ => seq(\n \'friend\',\n choice(\n $.declaration,\n $.function_definition,\n seq(\n optional(choice(\n \'class\',\n \'struct\',\n \'union\'\n )),\n $._class_name, \';\'\n )\n )\n ),\n\n access_specifier: $ => seq(\n choice(\n \'public\',\n \'private\',\n \'protected\'\n ),\n \':\'\n ),\n\n _declarator: ($, original) => choice(\n original,\n $.reference_declarator,\n $.qualified_identifier,\n $.template_function,\n $.operator_name,\n $.destructor_name,\n $.structured_binding_declarator\n ),\n\n _field_declarator: ($, original) => choice(\n original,\n alias($.reference_field_declarator, $.reference_declarator),\n $.template_method,\n $.operator_name\n ),\n\n _abstract_declarator: ($, original) => choice(\n original,\n $.abstract_reference_declarator\n ),\n\n reference_declarator: $ => prec.dynamic(1, prec.right(seq(choice(\'&\', \'&&\'), $._declarator))),\n reference_field_declarator: $ => prec.dynamic(1, prec.right(seq(choice(\'&\', \'&&\'), $._field_declarator))),\n abstract_reference_declarator: $ => prec.right(seq(choice(\'&\', \'&&\'), optional($._abstract_declarator))),\n\n structured_binding_declarator: $ => prec.dynamic(PREC.STRUCTURED_BINDING, seq(\n \'[\', commaSep1($.identifier), \']\'\n )),\n\n ref_qualifier: $ => choice(\'&\', \'&&\'),\n\n function_declarator: ($, original) => prec.dynamic(1, seq(\n original,\n repeat(choice(\n $.type_qualifier,\n $.ref_qualifier,\n $.virtual_specifier,\n $.noexcept,\n $.throw_specifier,\n $.trailing_return_type\n ))\n )),\n\n function_field_declarator: ($, original) => prec.dynamic(1, seq(\n original,\n repeat(choice(\n $.type_qualifier,\n $.ref_qualifier,\n $.virtual_specifier,\n $.noexcept,\n $.throw_specifier,\n $.trailing_return_type\n ))\n )),\n\n abstract_function_declarator: ($, original) => prec.right(seq(\n original,\n repeat(choice(\n $.type_qualifier,\n $.ref_qualifier,\n $.noexcept,\n $.throw_specifier\n )),\n optional($.trailing_return_type)\n )),\n\n trailing_return_type: $ => prec.right(seq(\n \'->\',\n optional($.type_qualifier),\n $._type_specifier,\n optional($._abstract_declarator)\n )),\n\n noexcept: $ => prec.right(seq(\n \'noexcept\',\n optional(\n seq(\n \'(\',\n optional($._expression),\n \')\',\n ),\n ),\n )),\n\n throw_specifier: $ => seq(\n \'throw\',\n seq(\n \'(\',\n commaSep($.type_descriptor),\n \')\',\n )\n ),\n\n template_type: $ => seq(\n field(\'name\', $._type_identifier),\n field(\'arguments\', $.template_argument_list)\n ),\n\n template_method: $ => seq(\n field(\'name\', $._field_identifier),\n field(\'arguments\', $.template_argument_list)\n ),\n\n template_function: $ => seq(\n field(\'name\', $.identifier),\n field(\'arguments\', $.template_argument_list)\n ),\n\n template_argument_list: $ => seq(\n \'<\',\n commaSep(choice(\n prec.dynamic(3, $.type_descriptor),\n prec.dynamic(2, alias($.type_parameter_pack_expansion, $.parameter_pack_expansion)),\n prec.dynamic(1, $._expression)\n )),\n alias(token(prec(1, \'>\')), \'>\')\n ),\n\n namespace_definition: $ => seq(\n \'namespace\',\n field(\'name\', optional(\n choice(\n $.identifier,\n $.namespace_definition_name,\n ))),\n field(\'body\', $.declaration_list)\n ),\n\n namespace_definition_name: $ => seq(\n choice(\n $.identifier,\n $.namespace_definition_name,\n ),\n \'::\',\n optional(\'inline\'),\n $.identifier,\n ),\n\n using_declaration: $ => seq(\n \'using\',\n optional(\'namespace\'),\n choice(\n $.identifier,\n $.qualified_identifier\n ),\n \';\'\n ),\n\n alias_declaration: $ => seq(\n \'using\',\n field(\'name\', $._type_identifier),\n \'=\',\n field(\'type\', $.type_descriptor),\n \';\'\n ),\n\n static_assert_declaration: $ => seq(\n \'static_assert\',\n \'(\',\n field(\'condition\', $._expression),\n optional(seq(\n \',\',\n field(\'message\', choice(\n $.string_literal,\n $.raw_string_literal,\n $.concatenated_string,\n ))\n )),\n \')\',\n \';\'\n ),\n\n // Statements\n\n _non_case_statement: ($, original) => choice(\n original,\n $.co_return_statement,\n $.co_yield_statement,\n $.for_range_loop,\n $.try_statement,\n $.throw_statement,\n ),\n\n switch_statement: $ => seq(\n \'switch\',\n field(\'condition\', $.condition_clause),\n field(\'body\', $.compound_statement)\n ),\n\n while_statement: $ => seq(\n \'while\',\n field(\'condition\', $.condition_clause),\n field(\'body\', $._statement)\n ),\n\n if_statement: $ => prec.right(seq(\n \'if\',\n optional(\'constexpr\'),\n field(\'condition\', $.condition_clause),\n field(\'consequence\', $._statement),\n optional(seq(\n \'else\',\n field(\'alternative\', $._statement)\n ))\n )),\n\n condition_clause: $ => seq(\n \'(\',\n choice(\n seq(\n field(\'initializer\', optional(choice(\n $.declaration,\n $.expression_statement\n ))),\n field(\'value\', choice(\n $._expression,\n $.comma_expression\n )),\n ),\n field(\'value\', alias($.condition_declaration, $.declaration))\n ),\n \')\',\n ),\n\n condition_declaration: $ => seq(\n $._declaration_specifiers,\n field(\'declarator\', $._declarator),\n choice(\n seq(\n \'=\',\n field(\'value\', $._expression),\n ),\n field(\'value\', $.initializer_list),\n )\n ),\n\n for_range_loop: $ => seq(\n \'for\',\n \'(\',\n $._declaration_specifiers,\n field(\'declarator\', $._declarator),\n \':\',\n field(\'right\', choice(\n $._expression,\n $.initializer_list,\n )),\n \')\',\n field(\'body\', $._statement)\n ),\n\n return_statement: ($, original) => seq(\n choice(\n original,\n seq(\'return\', $.initializer_list, \';\')\n )\n ),\n\n co_return_statement: $ => seq(\n \'co_return\',\n optional($._expression),\n \';\'\n ),\n\n co_yield_statement: $ => seq(\n \'co_yield\',\n $._expression,\n \';\'\n ),\n\n throw_statement: $ => seq(\n \'throw\',\n optional($._expression),\n \';\'\n ),\n\n try_statement: $ => seq(\n \'try\',\n field(\'body\', $.compound_statement),\n repeat1($.catch_clause)\n ),\n\n catch_clause: $ => seq(\n \'catch\',\n field(\'parameters\', $.parameter_list),\n field(\'body\', $.compound_statement)\n ),\n\n // Expressions\n\n _expression: ($, original) => choice(\n original,\n $.co_await_expression,\n $.template_function,\n $.qualified_identifier,\n $.new_expression,\n $.delete_expression,\n $.lambda_expression,\n $.parameter_pack_expansion,\n $.nullptr,\n $.this,\n $.raw_string_literal,\n $.user_defined_literal\n ),\n\n subscript_expression: $ => prec(PREC.SUBSCRIPT, seq(\n field(\'argument\', $._expression),\n \'[\',\n field(\'index\', choice($._expression, $.initializer_list)),\n \']\'\n )),\n\n\n call_expression: ($, original) => choice(original, seq(\n field(\'function\', $.primitive_type),\n field(\'arguments\', $.argument_list)\n )),\n\n co_await_expression: $ => prec.left(PREC.UNARY, seq(\n field(\'operator\', \'co_await\'),\n field(\'argument\', $._expression)\n )),\n\n new_expression: $ => prec.right(PREC.NEW, seq(\n optional(\'::\'),\n \'new\',\n field(\'placement\', optional($.argument_list)),\n field(\'type\', $._type_specifier),\n field(\'declarator\', optional($.new_declarator)),\n field(\'arguments\', optional(choice(\n $.argument_list,\n $.initializer_list\n )))\n )),\n\n new_declarator: $ => prec.right(seq(\n \'[\',\n field(\'length\', $._expression),\n \']\',\n optional($.new_declarator)\n )),\n\n delete_expression: $ => seq(\n optional(\'::\'),\n \'delete\',\n optional(seq(\'[\', \']\')),\n $._expression\n ),\n\n field_expression: ($, original) => choice(\n original,\n seq(\n prec(PREC.FIELD, seq(\n field(\'argument\', $._expression),\n choice(\'.\', \'->\')\n )),\n field(\'field\', choice(\n $.destructor_name,\n $.template_method,\n alias($.dependent_field_identifier, $.dependent_name)\n ))\n )\n ),\n\n lambda_expression: $ => seq(\n field(\'captures\', $.lambda_capture_specifier),\n optional(field(\'declarator\', $.abstract_function_declarator)),\n field(\'body\', $.compound_statement)\n ),\n\n lambda_capture_specifier: $ => prec(PREC.LAMBDA, seq(\n \'[\',\n choice(\n $.lambda_default_capture,\n commaSep($._expression),\n seq(\n $.lambda_default_capture,\n \',\', commaSep1($._expression)\n )\n ),\n \']\'\n )),\n\n lambda_default_capture: $ => choice(\'=\', \'&\'),\n\n parameter_pack_expansion: $ => prec(-1, seq(\n field(\'pattern\', $._expression),\n \'...\'\n )),\n\n type_parameter_pack_expansion: $ => seq(\n field(\'pattern\', $.type_descriptor),\n \'...\'\n ),\n\n sizeof_expression: ($, original) => choice(\n original,\n seq(\n \'sizeof\', \'...\',\n \'(\',\n field(\'value\', $.identifier),\n \')\'\n ),\n ),\n\n argument_list: $ => seq(\n \'(\',\n commaSep(choice($._expression, $.initializer_list)),\n \')\'\n ),\n\n destructor_name: $ => prec(1, seq(\'~\', $.identifier)),\n\n compound_literal_expression: ($, original) => choice(\n original,\n seq(\n field(\'type\', $._class_name),\n field(\'value\', $.initializer_list)\n )\n ),\n\n dependent_identifier: $ => seq(\'template\', $.template_function),\n dependent_field_identifier: $ => seq(\'template\', $.template_method),\n dependent_type_identifier: $ => seq(\'template\', $.template_type),\n\n _scope_resolution: $=> prec(1, seq(\n field(\'scope\', optional(choice(\n $._namespace_identifier,\n $.template_type,\n alias($.dependent_type_identifier, $.dependent_name)\n ))),\n \'::\',\n )),\n\n qualified_field_identifier: $ => seq(\n $._scope_resolution,\n field(\'name\', choice(\n alias($.dependent_field_identifier, $.dependent_name),\n alias($.qualified_field_identifier, $.qualified_identifier),\n $.template_method,\n $._field_identifier\n ))\n ),\n\n qualified_identifier: $ => seq(\n $._scope_resolution,\n field(\'name\', choice(\n alias($.dependent_identifier, $.dependent_name),\n $.qualified_identifier,\n $.template_function,\n $.identifier,\n $.operator_name,\n $.destructor_name\n )),\n ),\n\n qualified_type_identifier: $ => seq(\n $._scope_resolution,\n field(\'name\', choice(\n alias($.dependent_type_identifier, $.dependent_name),\n alias($.qualified_type_identifier, $.qualified_identifier),\n $.template_type,\n $._type_identifier\n )),\n ),\n\n qualified_operator_cast_identifier: $ => seq(\n $._scope_resolution,\n field(\'name\', choice(\n alias($.qualified_operator_cast_identifier, $.qualified_identifier),\n $.operator_cast\n ))\n ),\n\n _assignment_left_expression: ($, original) => choice(\n original,\n $.qualified_identifier,\n ),\n\n operator_name: $ => prec(1, seq(\n \'operator\',\n choice(\n \'co_await\',\n \'+\', \'-\', \'*\', \'/\', \'%\',\n \'^\', \'&\', \'|\', \'~\',\n \'!\', \'=\', \'<\', \'>\',\n \'+=\', \'-=\', \'*=\', \'/=\', \'%=\', \'^=\', \'&=\', \'|=\',\n \'<<\', \'>>\', \'>>=\', \'<<=\',\n \'==\', \'!=\', \'<=\', \'>=\',\n \'&&\', \'||\',\n \'++\', \'--\',\n \',\',\n \'->*\',\n \'->\',\n \'()\', \'[]\',\n seq(choice(\'new\', \'delete\'), optional(\'[]\')),\n seq(\'\"\"\', $.identifier)\n\t )\n\t)),\n\n this: $ => \'this\',\n nullptr: $ => \'nullptr\',\n\n concatenated_string: $ => seq(\n choice($.raw_string_literal, $.string_literal),\n repeat1(choice($.raw_string_literal, $.string_literal))\n ),\n\n\tliteral_suffix: $ => token.immediate(/[a-zA-Z_]\\w*/),\n\n user_defined_literal: $ => seq(\n choice(\n $.number_literal,\n $.char_literal,\n $.string_literal,\n $.raw_string_literal,\n $.concatenated_string\n ),\n $.literal_suffix\n ),\n\n _namespace_identifier: $ => alias($.identifier, $.namespace_identifier)\n }\n});\n\nfunction commaSep(rule) {\n return optional(commaSep1(rule));\n}\n\nfunction commaSep1(rule) {\n return seq(rule, repeat(seq(\',\', rule)));\n}\n";
Expand description
The source of the Cpp tree-sitter grammar description.