cmm_parser
identifier :
IDENT |
numeric_literal :
NUMBER |
char_literal :
CHAR_LITERAL |
string_literal :
STRING_LITERAL |
base_subst :
identifier
base_name :
(
special_function |
base_subst
)
base_args :
(
template_arg_list
)?
cont_item :
"::" cont_name cont_args
cont_subst :
identifier
cont_name :
(
"~" |
"template"
)?
(
special_function |
cont_subst
)
cont_args :
(
template_arg_list
)?
compound_name :
base_name base_args
(
cont_item
)*
simple_name :
base_name
global_mark :
(
"::"
)?
qualified_name :
compound_name
global_name :
global_mark compound_name
global_declaring_name :
global_mark compound_name
global_type_name :
global_mark compound_name
simple_new_name :
simple_name
global_new_name :
global_mark compound_name
id_expr :
qualified_name
primary_expr :
numeric_literal_expr |
char_literal_expr |
string_literal_expr |
this_expr |
subexpr_expr |
id_expr
numeric_literal_expr :
numeric_literal
char_literal_expr :
char_literal
string_literal_cont :
string_literal
string_literal_expr :
string_literal
(
string_literal_cont
)*
this_expr :
"this"
subexpr_expr :
"(" expr ")"
postfix_start :
modern_cast_expr |
typeid_expr |
typename_expr |
type_change_expr |
primary_expr
modern_cast_expr :
(
"dynamic_cast" |
"static_cast" |
"const_cast" |
"reinterpret_cast"
)
"<" type_id ">" "(" expr ")"
typeid_expr :
"typeid" "("
(
type_id |
expr
)
")"
typename_expr :
"typename" global_type_name "(" expr_list ")"
type_change_expr :
(
"signed" |
"unsigned" |
"short" |
"long" |
"bool" |
"char" |
"wchar_t" |
"int" |
"float" |
"double" |
"void"
)
"(" expr_list ")"
postfix_expr :
postfix_start
(
index_expr |
call_expr |
field_expr |
ptr_field_expr |
post_inc_expr |
post_dec_expr
)*
index_expr :
"[" expr "]"
call_expr :
"(" expr_list ")"
field_expr :
"."
(
"~" |
"template"
)?
qualified_name
ptr_field_expr :
"->"
(
"~" |
"template"
)?
qualified_name
post_inc_expr :
"++"
post_dec_expr :
"--"
expr_list :
(
assignment_expr
(
"," assignment_expr
)*
)?
unary_expr :
inc_expr |
dec_expr |
deref_expr |
addr_expr |
plus_expr |
minus_expr |
bit_not_expr |
log_not_expr |
scope_expr |
sizeof_expr |
allocation_expr |
deallocation_expr |
throw_expr |
postfix_expr
inc_expr :
"++" cast_expr
dec_expr :
"--" cast_expr
deref_expr :
"*" cast_expr
addr_expr :
"&" cast_expr
plus_expr :
"+" cast_expr
minus_expr :
"-" cast_expr
bit_not_expr :
"~" cast_expr
log_not_expr :
"!" cast_expr
scope_expr :
"::" cast_expr
sizeof_expr :
"sizeof"
(
"(" type_id ")" |
unary_expr
)
allocation_expr :
"new"
(
new_placement
)?
(
new_type_id |
"(" type_id ")"
)
(
"(" expr_list ")"
)?
new_placement :
"(" expr_list ")"
new_type_id :
type_specifiers ptr_specifier_list
(
allocation_array_limit
)*
allocation_array_limit :
"[" expr "]"
deallocation_expr :
"delete"
(
"[" "]"
)?
cast_expr
cast_expr :
cast_formula |
unary_expr
cast_formula :
"(" type_id ")" cast_expr
pm_expr :
cast_expr
(
".*" cast_expr |
"->*" cast_expr |
)*
multiplicative_expr :
pm_expr
(
"*" pm_expr |
"/" pm_expr |
"%" pm_expr |
)*
additive_expr :
multiplicative_expr
(
"+" multiplicative_expr |
"-" multiplicative_expr |
)*
shift_expr :
additive_expr
(
"<<" additive_expr |
">>" additive_expr |
)*
relational_expr :
shift_expr
(
"<" shift_expr |
">" shift_expr |
"<=" shift_expr |
">=" shift_expr |
)*
equality_expr :
relational_expr
(
"==" relational_expr |
"!=" relational_expr |
)*
and_expr :
equality_expr
(
"&" equality_expr |
)*
exclusive_or_expr :
and_expr
(
"^" and_expr |
)*
inclusive_or_expr :
exclusive_or_expr
(
"|" exclusive_or_expr |
)*
logical_and_expr :
inclusive_or_expr
(
"&&" inclusive_or_expr |
)*
logical_or_expr :
logical_and_expr
(
"||" logical_and_expr |
)*
assignment_expr :
logical_or_expr
(
"=" logical_or_expr |
"+=" logical_or_expr |
"-=" logical_or_expr |
"*=" logical_or_expr |
"/=" logical_or_expr |
"%=" logical_or_expr |
"<<=" logical_or_expr |
">>=" logical_or_expr |
"&=" logical_or_expr |
"^=" logical_or_expr |
"|=" logical_or_expr |
"?" expr ":" logical_or_expr |
)*
conditional_expr :
assignment_expr
expr :
assignment_expr
(
"," assignment_expr |
)*
const_expr :
conditional_expr
stat :
labeled_stat |
declaration_stat |
expression_stat |
empty_stat |
compound_stat |
case_stat |
default_stat |
if_stat |
switch_stat |
while_stat |
do_stat |
for_stat |
break_stat |
continue_stat |
return_stat |
goto_stat |
try_stat
inner_stat :
stat
tail_stat :
stat
stat_list :
(
stat
)*
inner_stat_list :
stat_list
condition :
condition_declaration |
expr
for_condition :
condition_declaration |
expr
declaration_stat :
block_declaration
labeled_stat :
identifier ":" stat
case_stat :
"case" expr ":" stat
default_stat :
"default" ":" stat
expression_stat :
expr ";"
empty_stat :
";"
compound_stat :
"{" inner_stat_list "}"
if_stat :
"if" "(" condition ")" inner_stat
(
"else" tail_stat
)?
switch_stat :
"switch" "(" condition ")" inner_stat
while_stat :
"while" "(" condition ")" inner_stat
do_stat :
"do" inner_stat "while" "(" expr ")" ";"
for_stat :
"for" "("
(
for_condition
)?
";"
(
expr
)?
";"
(
expr
)?
")" inner_stat
break_stat :
"break" ";"
continue_stat :
"continue" ";"
return_stat :
"return"
(
expr
)?
";"
goto_stat :
"goto" identifier ";"
declaration_list :
(
declaration
)*
declaration :
linkage_declaration |
extern_template_declaration |
constructor_declaration |
simple_declaration |
empty_declaration |
namespace_declaration |
using_declaration |
asm_declaration |
template_declaration
block_declaration :
local_declaration |
namespace_declaration |
using_declaration |
asm_declaration
namespace_declaration :
"namespace"
(
simple_new_name
(
"=" global_name ";" |
namespace_body
)
|
namespace_body
)
namespace_body :
"{" declaration_list "}"
using_declaration :
"using"
(
"namespace" |
"typename"
)?
global_name ";"
linkage_declaration :
"extern" string_literal
(
"{" declaration_list "}" |
declaration
)
asm_declaration :
"asm" "(" string_literal ")" ";"
empty_declaration :
";"
decl_specifiers :
simple_decl_specifiers
(
global_declaring_name |
class_specifier |
enum_specifier |
typename_specifier |
simple_type_specifiers
)
simple_decl_specifiers
type_specifiers :
simple_cv_specifiers
(
"register"
)?
(
global_declaring_name |
elaborated_class_specifier |
elaborated_enum_specifier |
typename_specifier |
simple_type_specifiers
)
simple_decl_specifiers
typename_specifier :
"typename" global_type_name
simple_decl_specifiers :
(
"typedef" |
"friend" |
"inline" |
"virtual" |
"explicit" |
"mutable" |
"extern" |
"static" |
"auto" |
"register" |
"const" |
"volatile"
)*
constructor_decl_specifiers :
(
"inline" |
"virtual" |
"explicit"
)*
simple_cv_specifiers :
(
"const" |
"volatile"
)*
simple_type_specifiers :
(
"signed" |
"unsigned" |
"short" |
"long" |
"bool" |
"char" |
"wchar_t" |
"int" |
"float" |
"double" |
"void"
)@
ptr_specifier_list :
(
ptr_specifier
)*
ptr_specifier :
"*" ptr_cv_specifier_list |
"&" ptr_cv_specifier_list
member_specifier :
global_name member_specifier_tail
member_specifier_tail :
"::" "*" ptr_cv_specifier_list
ptr_cv_specifier_list :
(
"const" |
"volatile"
)*
cont_specifier_list :
(
cont_specifier
)*
cont_specifier :
function_specifier |
array_specifier
function_specifier :
"(" parameter_declaration_list ")"
(
"const" |
"volatile"
)*
(
exception_specification
)?
array_specifier :
"["
(
expr
)?
"]"
parameter_declaration_list :
(
parameter_declaration
(
"," parameter_declaration
)*
)?
parameter_declaration :
(
common_type_id parameter_initialization
(
"..."
)?
|
expr |
"..."
)
parameter_initialization :
(
"=" assignment_expr
)?
simple_declaration :
decl_specifiers
(
":" conditional_expr ";" |
";" |
init_declarator
(
function_body |
(
"," init_declarator
)*
";"
)
)
local_declaration :
decl_specifiers init_declarator
(
"," init_declarator
)*
";"
condition_declaration :
decl_specifiers init_declarator
(
"," init_declarator
)*
constructor_declaration :
constructor_decl_specifiers
(
"~"
)?
init_declarator
(
function_body |
";"
)
constructor_head :
constructor_decl_specifiers
(
"~"
)?
constructor_head_declarator
(
":" |
"{" |
"try" |
"=" |
";"
)
constructor_head_declarator :
global_new_name constructor_head_specifier_list
constructor_head_specifier_list :
constructor_head_specifier
constructor_head_specifier :
function_specifier
function_body :
(
(
":" ctor_initializer
)?
compound_stat |
"try"
(
":" ctor_initializer
)?
compound_stat handler_list
)
declarator :
ptr_specifier_list
(
global_new_name |
"(" declarator ")"
)
cont_specifier_list
abstract_declarator :
ptr_specifier_list
(
"(" abstract_declarator ")"
)?
cont_specifier_list
common_declarator_name :
global_new_name
common_declarator :
ptr_specifier_list
(
"(" common_declarator ")" |
common_declarator_name
)?
cont_specifier_list
type_id :
type_specifiers abstract_declarator
common_type_id :
type_specifiers common_declarator
init_declarator :
declarator
(
":" conditional_expr
)?
(
initializer
)?
initializer :
"=" initializer_item
initializer_item :
simple_initializer |
initializer_list
empty_initializer :
simple_initializer :
|
assignment_expr
initializer_list :
"{"
(
initializer_item
(
"," initializer_item
)*
)?
"}"
elaborated_enum_specifier :
"enum" global_new_name
elaborated_class_specifier :
(
"class" |
"struct" |
"union"
)
global_new_name
class_declaration :
class_specifier ";"
enum_declaration :
enum_specifier ";"
enum_specifier :
"enum"
(
global_new_name
(
enum_body |
)
|
enum_body
)
enum_body :
"{" enum_list "}"
enum_list :
(
enumerator
(
"," enumerator
)*
)?
enumerator :
|
simple_new_name
(
"=" const_expr
)?
class_specifier :
(
"class" |
"struct" |
"union"
)
(
global_new_name
(
class_body |
)
|
class_body
)
class_body :
(
":" base_specifier_list
)?
"{" member_list "}"
member_visibility :
(
"private" |
"protected" |
"public"
)
":"
member_item :
member_visibility |
constructor_declaration |
simple_declaration |
empty_declaration |
using_declaration |
template_declaration
member_list :
(
member_item
)*
base_specifier_list :
base_specifier
(
"," base_specifier
)*
base_specifier :
virtual_base_specifier
(
"private" |
"protected" |
"public" |
)
virtual_base_specifier global_type_name
virtual_base_specifier :
(
"virtual"
)?
ctor_initializer :
member_initializer
(
"," member_initializer
)*
member_initializer :
global_name "(" expr_list ")"
conversion_specifiers :
type_specifiers ptr_specifier_list
special_function :
"operator"
(
conversion_specifiers |
"new"
(
"[" "]"
)?
|
"delete"
(
"[" "]"
)?
|
"+" |
"-" |
"*" |
"/" |
"%" |
"^" |
"&" |
"|" |
"~" |
"!" |
"=" |
"<" |
">" |
"+=" |
"-=" |
"*=" |
"/=" |
"%=" |
"^=" |
"&=" |
"|=" |
"<<" |
">>" |
">>=" |
"<<=" |
"==" |
"!=" |
"<=" |
">=" |
"&&" |
"||" |
"++" |
"--" |
"," |
"->*" |
"->" |
"(" ")" |
"[" "]"
)
template_declaration :
common_template_declaration
extern_template_declaration :
"extern" common_template_declaration
common_template_declaration :
template_specification declaration
template_specification :
(
"export"
)?
"template"
(
"<"
(
template_param_list |
)
">" |
)
template_param_list :
template_param
(
"," template_param
)*
template_param :
template_type_param |
template_value_param
template_type_param :
(
"template" "<" template_param_list ">"
)?
(
"class" |
"typename"
)
(
simple_new_name
)?
(
"=" type_id
)?
template_value_param :
common_type_id
(
"=" shift_expr
)?
template_arg_list :
"<"
(
template_arg
(
"," template_arg
)*
)?
">"
template_arg :
template_type_arg |
template_value_arg
template_type_arg :
type_id
template_value_arg :
shift_expr
try_stat :
"try" compound_stat handler_list
handler_list :
handler
(
handler
)*
handler :
"catch" "("
(
common_type_id |
"..."
)
")" compound_stat
throw_expr :
"throw"
(
assignment_expr
)?
exception_specification :
"throw" "("
(
exception_specification_item
(
"," exception_specification_item
)*
)?
")"
exception_specification_item :
type_id