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