Support template value params with optional names

Fixes #9
edge_only_predecessors
Max Brunsfeld 2018-08-23 17:24:04 +07:00
parent 9f907498d7
commit b673eceee3
4 changed files with 120679 additions and 115424 deletions

@ -428,7 +428,7 @@ class Person {
(compound_statement))))))
==========================================
Templates with default type parameters
Templates with optional type parameters
==========================================
template <typename T = U::V<void>>
@ -451,6 +451,49 @@ class X
(type_descriptor (primitive_type))))))
(class_specifier (type_identifier) (field_declaration_list))))
==============================================
Templates with optional anonymous parameters
==============================================
template <class T, typename a::b<!c<T>{} && (d<T>{} || e<T>{})>::type = 0>
class X
{
};
---
(translation_unit
(template_declaration
(template_parameter_list
(type_parameter_declaration (type_identifier))
(optional_parameter_declaration
(dependent_type (scoped_type_identifier
(template_type
(scoped_type_identifier (namespace_identifier) (type_identifier))
(template_argument_list
(logical_expression
(logical_expression
(compound_literal_expression
(template_type
(type_identifier)
(template_argument_list (type_descriptor (type_identifier))))
(initializer_list)))
(parenthesized_expression
(logical_expression
(compound_literal_expression
(template_type
(type_identifier)
(template_argument_list (type_descriptor (type_identifier))))
(initializer_list))
(compound_literal_expression
(template_type
(type_identifier)
(template_argument_list (type_descriptor (type_identifier))))
(initializer_list)))))))
(type_identifier)))
(number_literal)))
(class_specifier (type_identifier) (field_declaration_list))))
==========================================
Declarations with braced initializer lists
==========================================

@ -19,6 +19,7 @@ module.exports = grammar(C, {
[$.scoped_type_identifier, $.scoped_identifier],
[$.scoped_type_identifier, $.scoped_field_identifier],
[$.comma_expression, $.initializer_list],
[$._type_specifier, $.optional_type_parameter_declaration],
[$.parameter_list, $.argument_list],
]),
@ -131,10 +132,10 @@ module.exports = grammar(C, {
auto: $ => 'auto',
dependent_type: $ => seq(
dependent_type: $ => prec.dynamic(-1, seq(
'typename',
$._type_specifier
),
)),
// Declarations
@ -173,14 +174,15 @@ module.exports = grammar(C, {
'<',
commaSep(choice(
$.parameter_declaration,
$.optional_parameter_declaration,
$.type_parameter_declaration,
$.optional_type_parameter_declaration
)),
'>'
alias(token(prec(1, '>')), '>')
),
type_parameter_declaration: $ => prec(1, seq(
'typename',
choice('typename', 'class'),
$._type_identifier
)),
@ -199,6 +201,12 @@ module.exports = grammar(C, {
)
),
optional_parameter_declaration: $ => prec(20, seq(
$._type_specifier,
'=',
$._expression
)),
init_declarator: ($, original) => choice(
original,
seq(
@ -299,8 +307,8 @@ module.exports = grammar(C, {
$.abstract_reference_declarator
),
reference_declarator: $ => prec.right(seq(choice('&', '&&'), $._declarator)),
reference_field_declarator: $ => prec.right(seq(choice('&', '&&'), $._field_declarator)),
reference_declarator: $ => prec.dynamic(1, prec.right(seq(choice('&', '&&'), $._declarator))),
reference_field_declarator: $ => prec.dynamic(1, prec.right(seq(choice('&', '&&'), $._field_declarator))),
abstract_reference_declarator: $ => prec.right(seq(choice('&', '&&'), optional($._abstract_declarator))),
structured_binding_reference_declarator: $ => seq(choice('&', '&&'), $.structured_binding_declarator),
@ -361,10 +369,10 @@ module.exports = grammar(C, {
template_argument_list: $ => seq(
'<',
commaSep(choice(
$.type_descriptor,
$.parenthesized_expression
prec.dynamic(1, $.type_descriptor),
$._expression
)),
'>'
alias(token(prec(1, '>')), '>')
),
namespace_definition: $ => seq(
@ -505,11 +513,11 @@ module.exports = grammar(C, {
lambda_default_capture: $ => choice('=', '&'),
argument_list: $ => prec.dynamic(1, seq(
argument_list: $ => seq(
'(',
commaSep(choice($._expression, $.initializer_list)),
')'
)),
),
destructor_name: $ => prec(1, seq('~', $.identifier)),

126
src/grammar.json vendored

@ -1222,6 +1222,9 @@
"name": "array_declarator"
},
{
"type": "PREC_DYNAMIC",
"value": -10,
"content": {
"type": "SEQ",
"members": [
{
@ -1237,6 +1240,7 @@
"value": ")"
}
]
}
},
{
"type": "SYMBOL",
@ -1300,6 +1304,9 @@
"value": "array_declarator"
},
{
"type": "PREC_DYNAMIC",
"value": -10,
"content": {
"type": "SEQ",
"members": [
{
@ -1315,6 +1322,7 @@
"value": ")"
}
]
}
},
{
"type": "SYMBOL",
@ -1372,6 +1380,9 @@
"value": "array_declarator"
},
{
"type": "PREC_DYNAMIC",
"value": -10,
"content": {
"type": "SEQ",
"members": [
{
@ -1387,6 +1398,7 @@
"value": ")"
}
]
}
},
{
"type": "SYMBOL",
@ -1442,6 +1454,9 @@
]
},
"pointer_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
@ -1464,8 +1479,12 @@
}
]
}
}
},
"pointer_field_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
@ -1488,8 +1507,12 @@
}
]
}
}
},
"pointer_type_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
@ -1512,8 +1535,12 @@
}
]
}
}
},
"abstract_pointer_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
@ -1544,6 +1571,7 @@
}
]
}
}
},
"function_declarator": {
"type": "SEQ",
@ -2688,9 +2716,6 @@
]
},
"parameter_list": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
@ -2753,7 +2778,6 @@
"value": ")"
}
]
}
},
"parameter_declaration": {
"type": "CHOICE",
@ -4143,9 +4167,6 @@
}
},
"argument_list": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
@ -4208,7 +4229,6 @@
"value": ")"
}
]
}
},
"field_expression": {
"type": "CHOICE",
@ -5037,6 +5057,9 @@
"value": "auto"
},
"dependent_type": {
"type": "PREC_DYNAMIC",
"value": -1,
"content": {
"type": "SEQ",
"members": [
{
@ -5048,6 +5071,7 @@
"name": "_type_specifier"
}
]
}
},
"structured_binding_declaration": {
"type": "SEQ",
@ -5194,6 +5218,10 @@
"type": "SYMBOL",
"name": "parameter_declaration"
},
{
"type": "SYMBOL",
"name": "optional_parameter_declaration"
},
{
"type": "SYMBOL",
"name": "type_parameter_declaration"
@ -5220,6 +5248,10 @@
"type": "SYMBOL",
"name": "parameter_declaration"
},
{
"type": "SYMBOL",
"name": "optional_parameter_declaration"
},
{
"type": "SYMBOL",
"name": "type_parameter_declaration"
@ -5241,9 +5273,21 @@
]
},
{
"type": "ALIAS",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 1,
"content": {
"type": "STRING",
"value": ">"
}
}
},
"named": false,
"value": ">"
}
]
},
"type_parameter_declaration": {
@ -5251,11 +5295,20 @@
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "typename"
},
{
"type": "STRING",
"value": "class"
}
]
},
{
"type": "SYMBOL",
"name": "_type_identifier"
@ -5284,6 +5337,27 @@
}
]
},
"optional_parameter_declaration": {
"type": "PREC",
"value": 20,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_type_specifier"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
}
},
"field_initializer_list": {
"type": "SEQ",
"members": [
@ -5495,6 +5569,9 @@
]
},
"reference_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
@ -5519,8 +5596,12 @@
}
]
}
}
},
"reference_field_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
@ -5545,6 +5626,7 @@
}
]
}
}
},
"abstract_reference_declarator": {
"type": "PREC_RIGHT",
@ -5756,12 +5838,16 @@
"type": "CHOICE",
"members": [
{
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "SYMBOL",
"name": "type_descriptor"
}
},
{
"type": "SYMBOL",
"name": "parenthesized_expression"
"name": "_expression"
}
]
},
@ -5778,12 +5864,16 @@
"type": "CHOICE",
"members": [
{
"type": "PREC_DYNAMIC",
"value": 1,
"content": {
"type": "SYMBOL",
"name": "type_descriptor"
}
},
{
"type": "SYMBOL",
"name": "parenthesized_expression"
"name": "_expression"
}
]
}
@ -5798,9 +5888,21 @@
]
},
{
"type": "ALIAS",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 1,
"content": {
"type": "STRING",
"value": ">"
}
}
},
"named": false,
"value": ">"
}
]
},
"namespace_definition": {
@ -6620,6 +6722,10 @@
"comma_expression",
"initializer_list"
],
[
"_type_specifier",
"optional_type_parameter_declaration"
],
[
"parameter_list",
"argument_list"

235306
src/parser.c vendored

File diff suppressed because it is too large Load Diff