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.