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)))))) (compound_statement))))))
========================================== ==========================================
Templates with default type parameters Templates with optional type parameters
========================================== ==========================================
template <typename T = U::V<void>> template <typename T = U::V<void>>
@ -451,6 +451,49 @@ class X
(type_descriptor (primitive_type)))))) (type_descriptor (primitive_type))))))
(class_specifier (type_identifier) (field_declaration_list)))) (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 Declarations with braced initializer lists
========================================== ==========================================

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

722
src/grammar.json vendored

@ -1222,21 +1222,25 @@
"name": "array_declarator" "name": "array_declarator"
}, },
{ {
"type": "SEQ", "type": "PREC_DYNAMIC",
"members": [ "value": -10,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "(" "members": [
}, {
{ "type": "STRING",
"type": "SYMBOL", "value": "("
"name": "_declarator" },
}, {
{ "type": "SYMBOL",
"type": "STRING", "name": "_declarator"
"value": ")" },
} {
] "type": "STRING",
"value": ")"
}
]
}
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
@ -1300,21 +1304,25 @@
"value": "array_declarator" "value": "array_declarator"
}, },
{ {
"type": "SEQ", "type": "PREC_DYNAMIC",
"members": [ "value": -10,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "(" "members": [
}, {
{ "type": "STRING",
"type": "SYMBOL", "value": "("
"name": "_field_declarator" },
}, {
{ "type": "SYMBOL",
"type": "STRING", "name": "_field_declarator"
"value": ")" },
} {
] "type": "STRING",
"value": ")"
}
]
}
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
@ -1372,21 +1380,25 @@
"value": "array_declarator" "value": "array_declarator"
}, },
{ {
"type": "SEQ", "type": "PREC_DYNAMIC",
"members": [ "value": -10,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "(" "members": [
}, {
{ "type": "STRING",
"type": "SYMBOL", "value": "("
"name": "_type_declarator" },
}, {
{ "type": "SYMBOL",
"type": "STRING", "name": "_type_declarator"
"value": ")" },
} {
] "type": "STRING",
"value": ")"
}
]
}
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
@ -1442,107 +1454,123 @@
] ]
}, },
"pointer_declarator": { "pointer_declarator": {
"type": "PREC_RIGHT", "type": "PREC_DYNAMIC",
"value": 0, "value": 1,
"content": { "content": {
"type": "SEQ", "type": "PREC_RIGHT",
"members": [ "value": 0,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "*" "members": [
}, {
{ "type": "STRING",
"type": "REPEAT", "value": "*"
"content": { },
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "type_qualifier"
}
},
{
"type": "SYMBOL", "type": "SYMBOL",
"name": "type_qualifier" "name": "_declarator"
} }
}, ]
{ }
"type": "SYMBOL",
"name": "_declarator"
}
]
} }
}, },
"pointer_field_declarator": { "pointer_field_declarator": {
"type": "PREC_RIGHT", "type": "PREC_DYNAMIC",
"value": 0, "value": 1,
"content": { "content": {
"type": "SEQ", "type": "PREC_RIGHT",
"members": [ "value": 0,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "*" "members": [
}, {
{ "type": "STRING",
"type": "REPEAT", "value": "*"
"content": { },
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "type_qualifier"
}
},
{
"type": "SYMBOL", "type": "SYMBOL",
"name": "type_qualifier" "name": "_field_declarator"
} }
}, ]
{ }
"type": "SYMBOL",
"name": "_field_declarator"
}
]
} }
}, },
"pointer_type_declarator": { "pointer_type_declarator": {
"type": "PREC_RIGHT", "type": "PREC_DYNAMIC",
"value": 0, "value": 1,
"content": { "content": {
"type": "SEQ", "type": "PREC_RIGHT",
"members": [ "value": 0,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "*" "members": [
}, {
{ "type": "STRING",
"type": "REPEAT", "value": "*"
"content": { },
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "type_qualifier"
}
},
{
"type": "SYMBOL", "type": "SYMBOL",
"name": "type_qualifier" "name": "_type_declarator"
} }
}, ]
{ }
"type": "SYMBOL",
"name": "_type_declarator"
}
]
} }
}, },
"abstract_pointer_declarator": { "abstract_pointer_declarator": {
"type": "PREC_RIGHT", "type": "PREC_DYNAMIC",
"value": 0, "value": 1,
"content": { "content": {
"type": "SEQ", "type": "PREC_RIGHT",
"members": [ "value": 0,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "*" "members": [
}, {
{ "type": "STRING",
"type": "REPEAT", "value": "*"
"content": { },
"type": "SYMBOL", {
"name": "type_qualifier" "type": "REPEAT",
} "content": {
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL", "type": "SYMBOL",
"name": "_abstract_declarator" "name": "type_qualifier"
},
{
"type": "BLANK"
} }
] },
} {
] "type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_abstract_declarator"
},
{
"type": "BLANK"
}
]
}
]
}
} }
}, },
"function_declarator": { "function_declarator": {
@ -2688,72 +2716,68 @@
] ]
}, },
"parameter_list": { "parameter_list": {
"type": "PREC_DYNAMIC", "type": "SEQ",
"value": 1, "members": [
"content": { {
"type": "SEQ", "type": "STRING",
"members": [ "value": "("
{ },
"type": "STRING", {
"value": "(" "type": "CHOICE",
}, "members": [
{ {
"type": "CHOICE", "type": "SEQ",
"members": [ "members": [
{ {
"type": "SEQ", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "CHOICE", "type": "SYMBOL",
"name": "parameter_declaration"
},
{
"type": "STRING",
"value": "..."
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "STRING",
"name": "parameter_declaration" "value": ","
}, },
{ {
"type": "STRING", "type": "CHOICE",
"value": "..." "members": [
{
"type": "SYMBOL",
"name": "parameter_declaration"
},
{
"type": "STRING",
"value": "..."
}
]
} }
] ]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "parameter_declaration"
},
{
"type": "STRING",
"value": "..."
}
]
}
]
}
} }
] }
}, ]
{ },
"type": "BLANK" {
} "type": "BLANK"
] }
}, ]
{ },
"type": "STRING", {
"value": ")" "type": "STRING",
} "value": ")"
] }
} ]
}, },
"parameter_declaration": { "parameter_declaration": {
"type": "CHOICE", "type": "CHOICE",
@ -4143,72 +4167,68 @@
} }
}, },
"argument_list": { "argument_list": {
"type": "PREC_DYNAMIC", "type": "SEQ",
"value": 1, "members": [
"content": { {
"type": "SEQ", "type": "STRING",
"members": [ "value": "("
{ },
"type": "STRING", {
"value": "(" "type": "CHOICE",
}, "members": [
{ {
"type": "CHOICE", "type": "SEQ",
"members": [ "members": [
{ {
"type": "SEQ", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "CHOICE", "type": "SYMBOL",
"name": "_expression"
},
{
"type": "SYMBOL",
"name": "initializer_list"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "STRING",
"name": "_expression" "value": ","
}, },
{ {
"type": "SYMBOL", "type": "CHOICE",
"name": "initializer_list" "members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "SYMBOL",
"name": "initializer_list"
}
]
} }
] ]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "SYMBOL",
"name": "initializer_list"
}
]
}
]
}
} }
] }
}, ]
{ },
"type": "BLANK" {
} "type": "BLANK"
] }
}, ]
{ },
"type": "STRING", {
"value": ")" "type": "STRING",
} "value": ")"
] }
} ]
}, },
"field_expression": { "field_expression": {
"type": "CHOICE", "type": "CHOICE",
@ -5037,17 +5057,21 @@
"value": "auto" "value": "auto"
}, },
"dependent_type": { "dependent_type": {
"type": "SEQ", "type": "PREC_DYNAMIC",
"members": [ "value": -1,
{ "content": {
"type": "STRING", "type": "SEQ",
"value": "typename" "members": [
}, {
{ "type": "STRING",
"type": "SYMBOL", "value": "typename"
"name": "_type_specifier" },
} {
] "type": "SYMBOL",
"name": "_type_specifier"
}
]
}
}, },
"structured_binding_declaration": { "structured_binding_declaration": {
"type": "SEQ", "type": "SEQ",
@ -5194,6 +5218,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "parameter_declaration" "name": "parameter_declaration"
}, },
{
"type": "SYMBOL",
"name": "optional_parameter_declaration"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "type_parameter_declaration" "name": "type_parameter_declaration"
@ -5220,6 +5248,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "parameter_declaration" "name": "parameter_declaration"
}, },
{
"type": "SYMBOL",
"name": "optional_parameter_declaration"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "type_parameter_declaration" "name": "type_parameter_declaration"
@ -5241,7 +5273,19 @@
] ]
}, },
{ {
"type": "STRING", "type": "ALIAS",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 1,
"content": {
"type": "STRING",
"value": ">"
}
}
},
"named": false,
"value": ">" "value": ">"
} }
] ]
@ -5253,8 +5297,17 @@
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{ {
"type": "STRING", "type": "CHOICE",
"value": "typename" "members": [
{
"type": "STRING",
"value": "typename"
},
{
"type": "STRING",
"value": "class"
}
]
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
@ -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": { "field_initializer_list": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@ -5495,55 +5569,63 @@
] ]
}, },
"reference_declarator": { "reference_declarator": {
"type": "PREC_RIGHT", "type": "PREC_DYNAMIC",
"value": 0, "value": 1,
"content": { "content": {
"type": "SEQ", "type": "PREC_RIGHT",
"members": [ "value": 0,
{ "content": {
"type": "CHOICE", "type": "SEQ",
"members": [ "members": [
{ {
"type": "STRING", "type": "CHOICE",
"value": "&" "members": [
}, {
{ "type": "STRING",
"type": "STRING", "value": "&"
"value": "&&" },
} {
] "type": "STRING",
}, "value": "&&"
{ }
"type": "SYMBOL", ]
"name": "_declarator" },
} {
] "type": "SYMBOL",
"name": "_declarator"
}
]
}
} }
}, },
"reference_field_declarator": { "reference_field_declarator": {
"type": "PREC_RIGHT", "type": "PREC_DYNAMIC",
"value": 0, "value": 1,
"content": { "content": {
"type": "SEQ", "type": "PREC_RIGHT",
"members": [ "value": 0,
{ "content": {
"type": "CHOICE", "type": "SEQ",
"members": [ "members": [
{ {
"type": "STRING", "type": "CHOICE",
"value": "&" "members": [
}, {
{ "type": "STRING",
"type": "STRING", "value": "&"
"value": "&&" },
} {
] "type": "STRING",
}, "value": "&&"
{ }
"type": "SYMBOL", ]
"name": "_field_declarator" },
} {
] "type": "SYMBOL",
"name": "_field_declarator"
}
]
}
} }
}, },
"abstract_reference_declarator": { "abstract_reference_declarator": {
@ -5756,12 +5838,16 @@
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "PREC_DYNAMIC",
"name": "type_descriptor" "value": 1,
"content": {
"type": "SYMBOL",
"name": "type_descriptor"
}
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "parenthesized_expression" "name": "_expression"
} }
] ]
}, },
@ -5778,12 +5864,16 @@
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "PREC_DYNAMIC",
"name": "type_descriptor" "value": 1,
"content": {
"type": "SYMBOL",
"name": "type_descriptor"
}
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "parenthesized_expression" "name": "_expression"
} }
] ]
} }
@ -5798,7 +5888,19 @@
] ]
}, },
{ {
"type": "STRING", "type": "ALIAS",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 1,
"content": {
"type": "STRING",
"value": ">"
}
}
},
"named": false,
"value": ">" "value": ">"
} }
] ]
@ -6620,6 +6722,10 @@
"comma_expression", "comma_expression",
"initializer_list" "initializer_list"
], ],
[
"_type_specifier",
"optional_type_parameter_declaration"
],
[ [
"parameter_list", "parameter_list",
"argument_list" "argument_list"

235306
src/parser.c vendored

File diff suppressed because it is too large Load Diff