/* kit/grm/tkit.g */ /* --------------------------------------------------------------------- */ /* identifier : IDENT ; numeric_literal : NUMBER ; char_literal : CHAR_LITERAL ; string_literal : STRING_LITERAL ; */ /* --------------------------------------------------------------------- */ /* compound name */ base_subst : id: identifier; base_name : ( spec_func: special_function | base_subst // !? last - important ); base_args : ( (template_arg_list) => template_args:template_arg_list )? ; cont_item : "::" cont_name cont_args ; cont_subst : id: identifier; cont_name : ( '~' | "template" )? ( spec_func: special_function | cont_subst // !? last - important ); cont_args : ( (template_arg_list) => template_args:template_arg_list )? ; /* simple name */ simple_name : base_subst // only identifier ; /* qualified name */ qualified_name : ( "::" )? base_name base_args ( cont_item )* ; /* --------------------------------------------------------------------- */ /* id expr */ id_expr : qualified_name; /* primary expression */ primary_expr : modern_cast_expr | typeid_expr | typename_expr // !? | type_change_expr // !? | primary_expr ; // !? last - important modern_cast_expr : ( "dynamic_cast" | "static_cast" | "const_cast" | "reinterpret_cast" ) '<' type:type_id '>' '(' param:expr ')' ; typeid_expr : "typeid" '(' ( (type_id) => type:type_id | value:expr ) ')' ; typename_expr : "typename" name:qualified_name '(' list:expr_list ')' ; type_change_expr : // !? ( "signed" | "unsigned" | "short" /* */ | "long" /* */ | "bool" | "char" | "wchar_t" | "int" | "float" | "double" | "void" ) '(' list:expr_list ')' ; postfix_expr : postfix_start ( index_expr | call_expr | field_expr | ptr_field_expr | post_inc_expr | post_dec_expr )* ; index_expr : '[' right:expr ']' ; call_expr : '(' list:expr_list ')' ; field_expr : '.' ( '~' | "template" )? name:qualified_name ; ptr_field_expr : "->" ( '~' | "template" )? name:qualified_name ; post_inc_expr : "++" ; post_dec_expr : "--" ; expr_list : ( assignment_expr (',' assignment_expr)* )? ; /* unary expression */ unary_expr : // ( cast_formula ) => // !? // cast_formula // | unary_expr ; // cast_formula : // '(' type:type_id ')' param:cast_expr ; /* pm expression */ pm_expr : left:cast_expr ( ( ".*" | "->*" ) right:cast_expr )* ; /* arithmetic and logical expressions */ multiplicative_expr : left:pm_expr ( ( '*' | '/' | '%' ) right:pm_expr )* ; additive_expr : left:multiplicative_expr ( ( '+' | '-' ) right:multiplicative_expr )* ; shift_expr : left:additive_expr ( ( "<<" | ">>" ) right:additive_expr)* ; relational_expr : left:shift_expr ( ( '<' | '>' | "<=" | ">=" ) right:shift_expr )* ; equality_expr : left:relational_expr ( ( "==" | "!=" ) right:relational_expr )* ; and_expr : left:equality_expr ( ( '&' ) right:equality_expr )* ; exclusive_or_expr : left:and_expr ( ( '^' ) right:and_expr )* ; inclusive_or_expr : left:exclusive_or_expr ( ( '|' ) right:exclusive_or_expr ) ; logical_and_expr : left:inclusive_or_expr ( ( "&&" ) right:inclusive_or_expr )* ; logical_or_expr : left:logical_and_expr ( ( "||" ) right:logical_and_expr )* ; /* conditional and assignment expression */ assignment_expr : left:logical_or_expr // !? ( ( '=' | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | '?' /* middle:expr ':' */ ) // logical_or_expr ? expr : logical_or_expr right:logical_or_expr)*; conditional_expr : assignment_expr ; /* expression */ expr : left:assignment_expr ( ( ',' ) right:assignment_expr )* ; /* constant expression */ const_expr : conditional_expr ; /* --------------------------------------------------------------------- */ /* statement */ stat : /* ( "extern" string_literal ) => linkage_declaration */ /* | ( constructor_head ) => constructor_declaration */ /* | */ simple_declaration | empty_declaration | class_declaration | enum_declaration | typedef_declaration | friend_declaration | namespace_declaration | using_declaration | asm_declaration | template_declaration ; /* block declaration - used only in declaration_stat */ block_declaration : function_specifier | array_specifier ; function_specifier : '(' parameters:parameter_declaration_list ')' ( "const" | "volatile" )* ( exception_spec:exception_specification )? ; array_specifier : '[' (lim:expr)? ']' ; /* parameter declarations */ parameter_declaration_list : ( parameter_declaration ( ',' parameter_declaration )* )? ; parameter_declaration : type:common_type_id ( '=' init:assignment_expr )? | "..." // !? ; /* ---------------------------------------------------------------------- */ /* simple declaration */ simple_declaration : decl_spec:decl_specifiers type_spec:type_specifiers simple_item ( func_body:function_body | ( ',' simple_item )* ';' ); simple_item : decl:declarator // ( ':' width:const_expr )? ( init:initializer )? ; /* local declaration head - only for predicate */ local_head : decl_spec:decl_specifiers type_spec:type_specifiers decl:declarator ( '=' | ":=" | ',' | ';' ) ; /* condition declaration */ condition_declaration : decl_spec:decl_specifiers type_spec:type_specifiers simple_item ( ',' simple_item )* // no semicolon ; /* constructor declaration */ constructor_declaration : decl_spec:decl_specifiers constructor_item ( ( ':' ctor_init:ctor_initializer )? func_body:function_body | ';' ); constructor_item : ( '~' )? decl:declarator ; /* constructor declaration head - only for predicate */ constructor_head : decl_spec:decl_specifiers ( '~' )? name:qualified_name cont:cont_specifier_list ( ':' | '{' | ';' ); /* function body */ function_body : compound_stat ; /* ---------------------------------------------------------------------- */ // declarator ... name or inner declarator // abstract_declarator ... empty or inner declarator // common_declarator ... empty, name or inner declarator /* ---------------------------------------------------------------------- */ /* declarator */ declarator : ptr:ptr_specifier_list ( name:qualified_name | ( nested_declarator ) => // necessary '(' inner:declarator ')' ) cont:cont_specifier_list ; abstract_declarator : ptr:ptr_specifier_list ( ( nested_declarator ) => '(' inner:abstract_declarator ')' )? cont:cont_specifier_list ; common_declarator : ptr:ptr_specifier_list ( name:qualified_name | ( nested_declarator ) => '(' inner:common_declarator ')' )? cont:cont_specifier_list ; nested_declarator : ( '(' )@ ( '*' | '&' ); /* ---------------------------------------------------------------------- */ // type_id ... used in expressions, initialization of template_type_param, template_type_arg, exception_specification // common_type_id ... used in parameter_declaration, template_value_param, try handler /* ---------------------------------------------------------------------- */ /* type id */ type_id : /* abstract_type_id */ type_spec:type_specifiers decl:abstract_declarator ; common_type_id : type_spec:type_specifiers decl:common_declarator ; /* ---------------------------------------------------------------------- */ /* initializer */ initializer : '=' value:initializer_item | ":=" '(' value2:expr_list ')' // !? ; initializer_item : member_visibility /* | ( constructor_head ) => constructor_declaration */ | simple_declaration | empty_declaration | class_declaration | enum_declaration | typedef_declaration | friend_declaration | using_declaration | template_declaration ; member_list : ( member_item )* ; /* base specification */ base_specifier_list : base_specifier ( ',' base_specifier )* ; base_specifier : ( "virtual" )? ( "private" | "protected" | "public" | ) from:qualified_name ; /* constructor initializer */ ctor_initializer : member_initializer ( ',' member_initializer )* ; member_initializer : name:qualified_name // !? qualified_name '(' params:expr_list ')'; /* ---------------------------------------------------------------------- */ /* special member functions */ conversion_specifiers : // !? type_specifiers ptr:ptr_specifier_list ; special_function : "operator" ( conv:conversion_specifiers // !? | "new" ( ('[' ']') => '[' ']' )? // !? | "delete" ( ('[' ']') => '[' ']' )? | "+" | "-" | "*" | "/" | "%" | "^" | "&" | "|" | "~" | "!" | "=" | "<" | ">" | "+=" | "-=" | "*=" | "/=" | "%=" | "^=" | "&=" | "|=" | "<<" | ">>" | ">>=" | "<<=" | "==" | "!=" | "<=" | ">=" | "&&" | "||" | "++" | "--" | "," | "->*" | "->" | "(" ")" | "[" "]" ) ; /* ---------------------------------------------------------------------- */ /* template declaration */ template_declaration : ( "export" )? "template" ( '<' params:template_param_list '>' )? inner_decl:declaration; template_param_list : ( template_param ( ',' template_param )* )?; template_param : /* (type_id) => template_type_arg | */ template_value_arg; template_type_arg : type:type_id; // !? template_value_arg : value:shift_expr; // !? /* ---------------------------------------------------------------------- */ /* try statement */ try_stat : "try" body:compound_stat handlers:handler_list ; handler_list : handler ( handler )* ; handler : "catch" '(' ( type:common_type_id | "..." ) ')' body:compound_stat ; /* throw expression */ throw_expr : "throw" (expr:assignment_expr)? ; /* exception specification */ exception_specification : "throw" '(' ( exception_specification_item (',' exception_specification_item)* )? ')' ; exception_specification_item : type:type_id ; /* ---------------------------------------------------------------------- */