%{ #include "actions.h" #include extern int yyerror(char *); extern int yylex(); extern int line_number, token_number; extern char* yytext; using namespace std; extern int last_seen_cv; extern bool seen_const; extern bool seen_volatile; extern int last_seen; extern int line_num_for_abs_decl; %} %union { int tokenvalue; expression* expression_ptr; member_declarator* member_declarator_ptr; param_declarator* param_declarator_ptr; string* string_ptr; member_declarator_list* member_declarator_list_ptr; string_list* string_list_ptr; base_specifier_list* base_specifier_list_ptr; base_specifier* base_specifier_ptr; void* any_ptr; param_decl* param_decl_ptr; param_decl_list* param_decl_list_ptr; class_head* class_head_ptr; } /*** Keywords ***/ %token KW_asm KW_do KW_inline KW_short KW_typeid %token KW_auto KW_double KW_int KW_signed KW_typename %token KW_bool KW_dynamic_cast KW_long KW_sizeof KW_union %token KW_break KW_else KW_mutable KW_static KW_unsigned %token KW_case KW_enum KW_namespace KW_static_cast KW_using %token KW_catch KW_explicit KW_new KW_struct KW_virtual %token KW_char KW_extern KW_operator KW_switch KW_void %token KW_class KW_false KW_private KW_template KW_volatile %token KW_const KW_float KW_protected KW_this KW_wchar_t %token KW_const_cast KW_for KW_public KW_throw KW_while %token KW_continue KW_friend KW_register KW_true %token KW_default KW_goto KW_reinterpret_cast KW_try %token KW_delete KW_if KW_return KW_typedef %token KW_export %token KW_string /*** Pseduo Keywords ***/ %token KW_unsigned_char KW_unsigned_short KW_unsigned_long KW_long_double /*** Literals ***/ %token INTEGER_LITERAL CHARACTER_LITERAL FLOATING_LITERAL STRING_LITERAL /*** Axis specific ***/ /* %token ACCESSBEAN_MACRO */ /*** Single-Character Operators ***/ %token LEFTPAREN RIGHTPAREN // ( ) %token LEFTBRACK RIGHTBRACK // { } %token LEFTARRAY RIGHTARRAY // [ ] %token PLUS MINUS STAR DIVIDE MOD // + - * / % %token GREATER LESS EQUAL // > < = %token AND OR NOT XOR // & | ! ^ %token COMMA SEMI COLON // , ; : %token COMPLEMENT DOT QUESTION // ~ . ? /*** Multi-Character Operators ***/ %token COLCOL ELLIPSES %token PLUSEQ MINUSEQ STAREQ DIVEQ MODEQ %token XOREQ ANDEQ OREQ LTLT GTGT GTGTEQ LTLTEQ EQEQ NOTEQ %token LEQ GEQ ANDAND OROR PLUSPLUS MINUSMINUS DOTSTAR ARROWSTAR ARROW /*** The context-sensitive versions of IDENTIFIER ***/ %token IDENTIFIER %token ID_typedef_name %token ID_enum_name ID_class_name %type KW_class KW_struct KW_union KW_enum KW_namespace KW_template %type KW_protected KW_public KW_private %type KW_typename KW_operator class_key COMMA COLON %type colcol_opt ptr_operator %type comma_opt virtual_opt cv_qualifier cv_qualifier_seq %type cv_qualifier_seq_opt //%type <> CHARACTER_LITERAL FLOATING_LITERAL //%type <> STRING_LITERAL %type access_specifier access_specifier_opt //%type <> declaration block_declaration //%type <> simple_declaration %type declarator direct_declarator %type member_declarator init_declarator %type parameter_declarator direct_parameter_declarator //%type <> enumerator_definition %type parameter_declaration %type parameter_declaration_list parameter_declaration_list_opt parameter_declaration_clause %type initializer initializer_opt initializer_clause assignment_expression %type pure_specifier pure_specifier_opt %type constant_expression constant_expression_opt %type constant_initializer constant_initializer_opt //%type <> initializer_list %type unqualified_id id_expression %type class_name type_name declarator_id %type simple_type_specifier type_specifier decl_specifier function_specifier %type type_specifier_seq %type type_specifier_seq_opt %type class_specifier %type class_head %type base_specifier //%type <> expression_list expression_list_opt %type member_specification member_specification_opt %type member_declaration %type declaration_seq declaration_seq_opt %type member_declarator_list //%type <> enumerator_list enumerator_list_opt %type decl_specifier_seq decl_specifier_seq_opt %type base_clause_opt base_clause base_specifier_list %type any_identifier %start translation_unit %% any_identifier : ID_typedef_name {$$ = new string(yytext);} //| ID_original_namespace_name {$$ = new string(yytext);} //| ID_namespace_alias {$$ = new string(yytext);} //| ID_enum_name {$$ = new string(yytext);} | ID_class_name {$$ = new string(yytext);} //| ID_template_name {$$ = new string(yytext);} | IDENTIFIER {$$ = new string(yytext);} ; //any_identifier_or_template : // any_identifier {} //| template_id {} //; // ********* Context-sensitive identifiers ********** // // ID_typedef_name // : IDENTIFIER {} // ; // ID_original_namespace_name // : IDENTIFIER {} // ; ID_namespace_alias : IDENTIFIER { } ; // ID_enum_name // : IDENTIFIER {} // ; // ID_class_name // : IDENTIFIER {} // ; // ********** 1.1 Keywords [gram.key] ********** typedef_name : ID_typedef_name {} ; namespace_name : // original_namespace_name {} // | namespace_alias { } ; //original_namespace_name // : ID_original_namespace_name {} // ; namespace_alias : ID_namespace_alias {} ; class_name : ID_class_name {$$ = new string(yytext);} // | template_id {} ; //enum_name // : ID_enum_name {} // ; //template_name // : ID_template_name {} // ; // ********** 1.2 Lexical conventions [gram.lex] ********** // ********** 1.3 Basic concepts [gram.basic] ********** translation_unit : { translation_unit_start(); } declaration_seq_opt {} ; // ********** 1.4 Expressions [gram.expr] ********** //primary_expression // : INTEGER_LITERAL {} // | CHARACTER_LITERAL {} // | FLOATING_LITERAL {} // | STRING_LITERAL {} // | KW_true {} // | KW_false {} // | KW_this {} // | LEFTPAREN expression RIGHTPAREN {} // | id_expression {} //; id_expression : unqualified_id {$$ = $1;} // | qualified_id {} ; unqualified_id /* not any_identifier, cannot have :: */ : IDENTIFIER {$$ = new string(yytext);} | class_name {$$ = $1;} // | operator_function_id {} // | conversion_function_id {} | COMPLEMENT class_name {$$ = $2; g_bdestructor_seen = true;} // | template_id {} ; //qualified_id // : colcol_opt nested_name_specifier template_opt unqualified_id // {} // /* not any_identifier, must have :: */ // | COLCOL IDENTIFIER {} // | COLCOL operator_function_id {} // | COLCOL template_id {} // ; //nested_name_specifier // : class_or_namespace_name COLCOL nested_name_specifier_opt // {} // | class_or_namespace_name COLCOL KW_template nested_name_specifier // {} //; //nested_name_specifier_opt // : nested_name_specifier {} // | /* Empty */ {} // ; //class_or_namespace_name // : class_name {} // | namespace_name {} // ; //postfix_expression // : primary_expression // {} // | postfix_expression LEFTARRAY expression RIGHTARRAY // {} // | postfix_expression // {} // LEFTPAREN expression_list_opt RIGHTPAREN // {} // | simple_type_specifier LEFTPAREN expression_list_opt RIGHTPAREN // {} // | KW_typename colcol_opt nested_name_specifier any_identifier_or_template // LEFTPAREN expression_list_opt RIGHTPAREN // {} // | KW_typename colcol_opt nested_name_specifier template_opt template_id // LEFTPAREN expression_list_opt RIGHTPAREN // {} // | postfix_expression DOT template_opt id_expression // {} // | postfix_expression ARROW template_opt id_expression // {} // | postfix_expression DOT pseudo_destructor_name // {} // | postfix_expression ARROW pseudo_destructor_name // {} // | postfix_expression PLUSPLUS // {} // | postfix_expression MINUSMINUS // {} // | KW_dynamic_cast LESS type_id GREATER LEFTPAREN expression RIGHTPAREN // {} // | KW_static_cast LESS type_id GREATER LEFTPAREN expression RIGHTPAREN // {} // | KW_reinterpret_cast LESS type_id GREATER LEFTPAREN expression RIGHTPAREN // {} // | KW_const_cast LESS type_id GREATER LEFTPAREN expression RIGHTPAREN // {} // | KW_typeid LEFTPAREN expression RIGHTPAREN // {} // | KW_typeid LEFTPAREN type_id RIGHTPAREN // {} // ; expression_list : assignment_expression {} | expression_list COMMA assignment_expression {} ; //expression_list_opt // : expression_list {} // | /* Empty */ {} // ; //pseudo_destructor_name // : colcol_opt nested_name_specifier_opt type_name COLCOL COMPLEMENT type_name // {} // | colcol_opt nested_name_specifier KW_template template_id COLCOL // COMPLEMENT type_name // {} // | colcol_opt nested_name_specifier_opt COMPLEMENT type_name // {} // ; //unary_expression // : postfix_expression // {} // | PLUSPLUS cast_expression // {} // | MINUSMINUS cast_expression // {} // | STAR cast_expression // {} // | AND cast_expression // {} // | PLUS cast_expression // {} // | MINUS cast_expression // {} // | NOT cast_expression // {} // | COMPLEMENT cast_expression // {} // | KW_sizeof unary_expression // {} // | KW_sizeof LEFTPAREN type_id RIGHTPAREN // {} // | new_expression // {} // | delete_expression // {} // ; //new_expression // : colcol_opt KW_new new_placement_opt new_type_id new_initializer_opt // {} // | colcol_opt KW_new new_placement_opt LEFTPAREN type_id RIGHTPAREN // new_initializer_opt // {} // ; //new_placement // : LEFTPAREN expression_list RIGHTPAREN {} // ; //new_placement_opt // : new_placement {} // | /* Empty */ {/*$$ = NULL; */} // ; //new_type_id // : type_specifier_seq new_declarator_opt // {} // ; //new_declarator // : ptr_operator new_declarator_opt // {} // | direct_new_declarator // {} // ; //new_declarator_opt // : new_declarator {} // | /* Empty */ {} // ; //direct_new_declarator // : LEFTARRAY expression RIGHTARRAY // {} // | direct_new_declarator LEFTARRAY constant_expression RIGHTARRAY // {} // ; //new_initializer // : LEFTPAREN expression_list_opt RIGHTPAREN {} // ; //new_initializer_opt // : new_initializer {} // | /* Empty */ {} // ; //delete_expression // : colcol_opt KW_delete cast_expression // {} // | colcol_opt KW_delete LEFTARRAY RIGHTARRAY cast_expression // {} // ; //cast_expression // : unary_expression {} // | LEFTPAREN type_id RIGHTPAREN cast_expression // {} // ; //pm_expression // : cast_expression {} // | pm_expression DOTSTAR cast_expression // {} // | pm_expression ARROWSTAR cast_expression // {} // ; //multiplicative_expression // : pm_expression {} // | multiplicative_expression STAR pm_expression // {} // | multiplicative_expression DIVIDE pm_expression // {} // | multiplicative_expression MOD pm_expression // {} // ; //additive_expression // : multiplicative_expression {} // | additive_expression PLUS multiplicative_expression // {} // | additive_expression MINUS multiplicative_expression // {} // ; //shift_expression // : additive_expression {} // | shift_expression LTLT additive_expression // {} // | shift_expression GTGT additive_expression // {} // ; //relational_expression // : shift_expression {} // | relational_expression LESS shift_expression // {} // | relational_expression GREATER shift_expression // {} // | relational_expression LEQ shift_expression // {} // | relational_expression GEQ shift_expression // {} // ; //equality_expression // : relational_expression {} // | equality_expression EQEQ relational_expression // {} // | equality_expression NOTEQ relational_expression // {} // ; //and_expression // : equality_expression {} // | and_expression AND equality_expression // {} // ; //exclusive_or_expression // : and_expression {} // | exclusive_or_expression XOR and_expression // {} // ; //inclusive_or_expression // : exclusive_or_expression {} // | inclusive_or_expression OR exclusive_or_expression // {} // ; //logical_and_expression // : inclusive_or_expression {} // | logical_and_expression ANDAND inclusive_or_expression // {} // ; //logical_or_expression // : logical_and_expression {} // | logical_or_expression OROR logical_and_expression // {} // ; //conditional_expression // : logical_or_expression {} // | logical_or_expression QUESTION expression COLON assignment_expression // {} // ; assignment_expression : INTEGER_LITERAL { $$ = new expression; $$->expr.n = atoi(yytext); } // conditional_expression {} // | logical_or_expression assignment_operator assignment_expression // {} // | throw_expression {} ; //assignment_operator // : EQUAL {} // | STAREQ {} // | DIVEQ {} // | MODEQ {} // | PLUSEQ {} // | MINUSEQ {} // | GTGTEQ {} // | LTLTEQ {} // | ANDEQ {} // | XOREQ {} // | OREQ {} // ; //expression // : assignment_expression {} // | expression COMMA assignment_expression // {} // ; //expression_opt // : expression {} // | /* Empty */ {} // ; constant_expression : INTEGER_LITERAL { $$ = new expression; $$->expr.n = atoi(yytext); } ; constant_expression_opt : constant_expression {$$ = $1;} | /* Empty */ {$$ = NULL;} ; // ********** 1.5 Statements [gram.stmt.stmt] ********** //statement // : labeled_statement {} // | expression_statement {} // | compound_statement {} // | selection_statement {} // | iteration_statement {} // | jump_statement {} // | declaration_statement {} // | try_block {} // ; //labeled_statement // : any_identifier COLON statement // {} // | KW_case constant_expression COLON statement // {} // | KW_default COLON statement // {} // ; //expression_statement // : expression SEMI {} // // Was expression_opt, but this is covered by simple_declaration // ; //compound_statement // : LEFTBRACK // {} // statement_seq_opt // RIGHTBRACK // {} // ; //statement_seq // : statement // {} // | statement_seq statement // {} // ; //statement_seq_opt // : statement_seq {} // | /* Empty */ {} // ; //selection_statement // : KW_if LEFTPAREN condition RIGHTPAREN statement // {} // | KW_if LEFTPAREN condition RIGHTPAREN statement KW_else statement // {} // | KW_switch LEFTPAREN condition RIGHTPAREN statement // {} // ; //condition // : expression {} // | type_specifier_seq declarator EQUAL assignment_expression // {} // ; //condition_opt // : condition {} // | /* Empty */ {} // ; //iteration_statement // : KW_while LEFTPAREN condition RIGHTPAREN statement // {} // | KW_do statement KW_while LEFTPAREN expression RIGHTPAREN SEMI // {} // | KW_for LEFTPAREN for_init_statement condition_opt SEMI // expression_opt RIGHTPAREN statement // {} // ; //for_init_statement // : expression_statement {} // | simple_declaration {} // ; //jump_statement // : KW_break SEMI // {} // | KW_continue SEMI // {} // | KW_return expression_opt SEMI // {} // | KW_goto any_identifier SEMI // {} // ; //declaration_statement // : block_declaration {} // ; // ********** 1.6 Declarations [gram.dcl.dcl] ********** declaration_seq : declaration {} | declaration_seq declaration {} ; declaration_seq_opt : declaration_seq {} | /* Empty */ {} ; declaration : block_declaration {} // | function_definition // {} // | template_declaration // {} // | explicit_instantiation // {} // | explicit_specialization // {} // | linkage_specification // {} // | namespace_definition // {} ; block_declaration : simple_declaration {} // | asm_definition // {/* $$ = NULL;/*XXX*/ } // | namespace_alias_definition // {} // | using_declaration // {} | using_directive { } ; simple_declaration : decl_specifier_seq_opt init_declarator_list_opt // there can be global variable or extern declarations - Susantha. SEMI {} ; decl_specifier : // storage_class_specifier // {} // | type_specifier {} | function_specifier { $$ = $1;} // | KW_friend // {} // | KW_typedef // {} ; decl_specifier_seq : decl_specifier_seq_opt decl_specifier { if ($2 != NULL) { if ($$ == NULL) {$$ = new string_list;} $$->push_back($2); } else { $$ = NULL; } } ; decl_specifier_seq_opt : decl_specifier_seq {$$ = $1;} | /* Empty */ {$$ = NULL;} ; //storage_class_specifier // : KW_auto // {} // | KW_register // {} // | KW_static // {} // | KW_extern // {} // | KW_mutable // {} // ; function_specifier : // KW_inline // {} // | KW_virtual { $$ = NULL;} // | KW_explicit // {} ; type_specifier : simple_type_specifier {$$ = $1;} | class_specifier {} // | enum_specifier // {} // | elaborated_type_specifier // {} | cv_qualifier {} ; /***** Multi word types ********/ simple_type_specifier : // colcol_opt nested_name_specifier_opt type_name {$$ = $1;} // | colcol_opt nested_name_specifier KW_template template_id // {} // | | KW_char {$$ = new string("char");} | KW_unsigned_char {$$ = new string("unsigned char");} | KW_wchar_t {$$ = new string("wchar_t");} | KW_bool {$$ = new string("bool");} | KW_short {$$ = new string("short");} | KW_unsigned_short {$$ = new string("unsigned short");} | KW_int {$$ = new string("int");} | KW_long {$$ = new string("long");} | KW_unsigned_long {$$ = new string("unsigned long");} | KW_signed {$$ = new string("signed");} | KW_unsigned {$$ = new string("unsigned");} | KW_float {$$ = new string("float");} | KW_double {$$ = new string("double");} | KW_void {$$ = new string("void");} | KW_string {$$ = new string("string");} ; type_name : class_name {$$ = $1;} // | enum_name {} // | typedef_name {} ; //elaborated_type_specifier // : class_key colcol_opt nested_name_specifier_opt any_identifier_or_template // {} // | KW_enum colcol_opt nested_name_specifier_opt any_identifier // {} // | KW_typename colcol_opt nested_name_specifier any_identifier // {} // | KW_typename colcol_opt nested_name_specifier template_opt template_id // {} // ; //enum_specifier // : KW_enum identifier_opt // {} // LEFTBRACK enumerator_list_opt RIGHTBRACK // {} // ; //enumerator_list // : enumerator_definition // {} // | enumerator_list COMMA enumerator_definition // {} // ; //enumerator_list_opt // : enumerator_list {} // | /* Empty */ {} // ; //enumerator_definition // : enumerator // {} // | enumerator EQUAL constant_expression // {} // ; //enumerator // : any_identifier {} // ; //namespace_definition // : named_namespace_definition {} // | unnamed_namespace_definition {} // ; //named_namespace_definition // : original_namespace_definition {} // | extension_namespace_definition {} // ; //original_namespace_definition // : KW_namespace any_identifier // {} // LEFTBRACK namespace_body RIGHTBRACK // {} // ; //extension_namespace_definition // : KW_namespace original_namespace_name // {} // LEFTBRACK namespace_body RIGHTBRACK // {} // ; //unnamed_namespace_definition // : KW_namespace // {} // LEFTBRACK namespace_body RIGHTBRACK // {} // ; //namespace_body // : declaration_seq_opt {} // ; //namespace_alias_definition // : KW_namespace any_identifier EQUAL qualified_namespace_specifier SEMI // {} // ; //qualified_namespace_specifier // : colcol_opt nested_name_specifier_opt namespace_name // {/* $$ = $3; */} // ; //using_declaration // : KW_using KW_typename colcol_opt nested_name_specifier any_unqualified_id // SEMI // {} // | KW_using colcol_opt nested_name_specifier any_unqualified_id // SEMI // {} // | KW_using COLCOL any_unqualified_id // SEMI // {} // ; using_directive : KW_using KW_namespace //colcol_opt nested_name_specifier_opt namespace_name SEMI { } ; //asm_definition // : KW_asm LEFTPAREN STRING_LITERAL RIGHTPAREN SEMI // {} // ; //linkage_specification // : KW_extern STRING_LITERAL LEFTBRACK declaration_seq_opt RIGHTBRACK // {} // | KW_extern STRING_LITERAL declaration // {} // ; // ********** 1.7 Declarators [gram.dcl.decl] ********** init_declarator_list : init_declarator {} | init_declarator_list COMMA init_declarator {} ; init_declarator_list_opt : init_declarator_list {} | /* Empty */ {} ; init_declarator : declarator initializer_opt {} ; parameter_declarator : direct_parameter_declarator {$$=$1;} | ptr_operator parameter_declarator { $$=$2; $$->ptr_ops.push_back($1); } ; direct_parameter_declarator : declarator_id { $$ = new param_declarator; $$->decl_id = $1->c_str(); } | direct_parameter_declarator LEFTARRAY constant_expression_opt RIGHTARRAY { $$ = $1; if ($3 != 0) { $$->arr_dim.push_back($3); } } ; declarator : direct_declarator {$$ = $1;} | ptr_operator declarator { $$ = $2; $$->ptr_ops.push_back($1); } ; direct_declarator : declarator_id { $$ = new member_declarator; $$->method = false; $$->declarator_id = $1; } | direct_declarator LEFTPAREN parameter_declaration_clause RIGHTPAREN // cv_qualifier_seq_opt // exception_specification_opt { $$->params = $3; $$->method = true; } | direct_declarator LEFTARRAY constant_expression_opt RIGHTARRAY { $$->array_indexes.push_back($3); } // | LEFTPAREN declarator RIGHTPAREN // {} ; ptr_operator : STAR cv_qualifier_seq_opt {$$ = STAR;} | AND {$$ = AND;} // | colcol_opt nested_name_specifier STAR cv_qualifier_seq_opt // {} ; cv_qualifier_seq : cv_qualifier cv_qualifier_seq_opt {/* $$ = $1 + $2; */} ; cv_qualifier_seq_opt : cv_qualifier_seq {} | /* Empty */ {/* $$ = 0; */} ; cv_qualifier : KW_const { } // | KW_volatile // {} ; declarator_id : id_expression {$$ = $1;} // | colcol_opt nested_name_specifier_opt type_name // {/* $$ = $3; */} ; //type_id // : type_specifier_seq abstract_declarator_opt // {} // ; type_specifier_seq_opt : type_specifier_seq {} | /* Empty */ {} ; type_specifier_seq : type_specifier type_specifier_seq_opt {} ; //abstract_declarator // : ptr_operator abstract_declarator_opt // {} // | direct_abstract_declarator {} // ; //abstract_declarator_opt //: abstract_declarator {} // | /* Empty */ {} // ; //direct_abstract_declarator // : direct_abstract_declarator_opt LEFTPAREN // {} // parameter_declaration_clause RIGHTPAREN cv_qualifier_seq_opt // exception_specification_opt // {} // | direct_abstract_declarator_opt LEFTARRAY constant_expression_opt RIGHTARRAY // {} // | LEFTPAREN abstract_declarator RIGHTPAREN // {} // ; //direct_abstract_declarator_opt // : direct_abstract_declarator {} // | /* Empty */ {} // ; parameter_declaration_clause : parameter_declaration_list_opt // ellipses_opt //we probably never support this - Susantha {$$ = $1;} // | parameter_declaration_list COMMA ELLIPSES //{} ; ellipses_opt : ELLIPSES {} | /* Empty */ {} ; parameter_declaration_list_opt : parameter_declaration_list {} | /* Empty */ {$$ = NULL;} ; parameter_declaration_list : parameter_declaration { $$ = new param_decl_list; $$->push_back($1); } | parameter_declaration_list COMMA parameter_declaration { $$ = $1; $$->push_back($3); } ; parameter_declaration : decl_specifier_seq parameter_declarator { $$ = new param_decl; $$->decl_specs = $1; $$->param = $2; $$->bdef = false; } | decl_specifier_seq parameter_declarator EQUAL assignment_expression { $$ = new param_decl; $$->decl_specs = $1; $$->param = $2; $$->bdef = true; $$->defval = $4; } // | decl_specifier_seq abstract_declarator_opt // {} // | decl_specifier_seq abstract_declarator_opt EQUAL assignment_expression // {} ; //function_definition // : decl_specifier_seq_opt // declarator // {} // ctor_initializer_opt // {} // function_body // {} // | decl_specifier_seq_opt // declarator // {} // function_try_block // {} // ; //function_body // : compound_statement {/*$$ = $1; */} // ; initializer : EQUAL initializer_clause {} | LEFTPAREN expression_list RIGHTPAREN {} ; initializer_opt : initializer {} | /* Empty */ {} ; initializer_clause : assignment_expression {} | LEFTBRACK initializer_list comma_opt RIGHTBRACK {/* $$ = $3; */} | LEFTBRACK RIGHTBRACK {} ; comma_opt : COMMA {/* $$ = 1; */} | /* Empty */ {/* $$ = 0; */} ; initializer_list : initializer_clause {} | initializer_list COMMA initializer_clause {} ; /********** 1.8 Classes [gram.class] **********/ class_specifier : class_head //add to defined classes list { if (!is_defined_class($1->class_name->c_str())) { //check if this class should be wrapped or not depending on wsdd information if (!is_webservice_class($1->class_name->c_str())) //bean class { BeanClass* pBeanClass = new BeanClass(); pBeanClass->SetClassName(*($1->class_name)); g_pTranslationUnit->AddBeanClass(pBeanClass); g_pCurrentBeanClass = pBeanClass; g_currentclasstype = BEANCLASS; // g_baccessbeanmacrofound = false; //following line adds default namespace for this complex type. //This should be removed when we get the namespace from the wsdd. string defns = "http://www.opensource.lk/" + (*($1->class_name)); g_ClassNamespaces[*($1->class_name)] = defns; } else // this is the webservice class - there cannot be 2 web service classes { WSClass* pWSClass = new WSClass(); pWSClass->SetClassName(*($1->class_name)); g_pTranslationUnit->SetWSClass(pWSClass); g_pCurrentWSClass = pWSClass; g_currentclasstype = WSCLASS; // g_baccessbeanmacrofound = false; //following line adds default namespace for this web service. //This should be removed when we get the namespace from the wsdd. string defns = "http://www.opensource.lk/" + (*($1->class_name)); g_ClassNamespaces[*($1->class_name)] = defns; } g_classesfound.push_back(g_classname); } } LEFTBRACK member_specification_opt RIGHTBRACK { g_classname = ""; //end of class scope } ; class_head : class_key any_identifier base_clause_opt { g_classname = $2->c_str(); $$ = new class_head; $$->class_name = $2; $$->baselist = $3; //may be NULL } // | class_key nested_name_specifier any_identifier // {} // base_clause_opt {} // | class_key nested_name_specifier_opt template_id // {} // base_clause_opt {} ; class_key : KW_class {} // We dont support structs and unions for the moment - Susantha. // | KW_struct {} // | KW_union {} ; member_specification : member_declaration member_specification_opt {} | access_specifier COLON member_specification_opt {} ; member_specification_opt : member_specification {} | /* Empty */ {} ; member_declaration : { g_bdestructor_seen = false;} decl_specifier_seq_opt member_declarator_list SEMI { add_member_declaration($2, $3); } // | function_definition // {} // semi_opt // | colcol_opt nested_name_specifier template_opt unqualified_id SEMI // {} // | using_declaration // {} // | template_declaration // {} // ************** Axis Specific ************* // | ACCESSBEAN_MACRO // { g_baccessbeanmacrofound = true;} ; semi_opt : SEMI | ; member_declarator_list : member_declarator { $$ = new member_declarator_list; $$->push_back($1); } | member_declarator_list COMMA member_declarator { $$ = $1; $$->push_back($3); } ; //member_declarator_list_opt // : member_declarator_list {} // | /* Empty */ {} // ; member_declarator : declarator pure_specifier_opt { $$ = $1; if ($1 != 0) //there is a pure specifier { $$->bpure = true; } } | declarator constant_initializer_opt { $$ = $1; if ($2 != NULL) { $$->expr = $2; } } // | identifier_opt COLON constant_expression // {} ; pure_specifier : EQUAL INTEGER_LITERAL /* Should be "0" */ {$$ = 1;} ; pure_specifier_opt : pure_specifier {$$ = $1;} | /* Empty */ {$$ = 0;} ; constant_initializer : EQUAL constant_expression {$$ = $2;} ; constant_initializer_opt : constant_initializer {$$ = $1;} | /* Empty */ {$$ = NULL;} ; /********** 1.9 Derived classes [gram.class.derived] **********/ base_clause_opt : base_clause {$$ = $1;} | /* Empty */ {$$ = NULL;} ; base_clause : COLON base_specifier_list {$$ = $2;} ; base_specifier_list : base_specifier { $$ = new base_specifier_list; $$->push_back($1); } | base_specifier_list COMMA base_specifier { $$->push_back($3); } ; base_specifier : // colcol_opt nested_name_specifier_opt class_name // {} // | KW_virtual access_specifier_opt colcol_opt nested_name_specifier_opt // class_name // {} // | access_specifier // virtual_opt colcol_opt nested_name_specifier_opt class_name { $$ = new base_specifier; $$->access = $1; $$->class_name = $2; } ; virtual_opt : KW_virtual {/*$$ = 1; */} | /* Empty */ {/* $$ = 0; */} ; access_specifier : KW_public {$$ = $1; g_currentaccessspecifier = $1;} | KW_protected {$$ = $1; g_currentaccessspecifier = $1;} | KW_private {$$ = $1; g_currentaccessspecifier = $1;} ; access_specifier_opt : access_specifier {$$=$1;} | /* Empty */ {$$ = 0;} ; /********** 1.10 Special member functions [gram.special] **********/ //conversion_function_id // : KW_operator conversion_type_id // {} // ; //conversion_type_id // : type_specifier_seq conversion_declarator_opt // {} // ; //conversion_declarator // : ptr_operator conversion_declarator_opt // {} // ; //conversion_declarator_opt // : conversion_declarator {} // | /* Empty */ {} // ; //ctor_initializer // : COLON mem_initializer_list // {} // ; //ctor_initializer_opt // : ctor_initializer {} // | /* Empty */ {} // ; //mem_initializer_list // : mem_initializer // {} // | mem_initializer COMMA mem_initializer_list // {} // ; //mem_initializer // : mem_initializer_id LEFTPAREN expression_list_opt RIGHTPAREN // {} // ; //mem_initializer_id // : colcol_opt nested_name_specifier_opt class_name // {} // | any_identifier // {} // ; colcol_opt : COLCOL {} | /* Empty */ {} ; // ********** 1.11 Overloading [gram.over] ********** //operator_function_id // : KW_operator an_operator // {} // ; //an_operator // : KW_new {/* $$ = new string("new"); */} // | KW_delete {/* $$ = new string("delete"); */} // | KW_new LEFTARRAY RIGHTARRAY {/* $$ = new string("new[]"); */} // | KW_delete LEFTARRAY RIGHTARRAY {/* $$ = new string("delete[]"); */} // | PLUS {/* $$ = new string("+"); */} // | MINUS {/* $$ = new string("-"); */} // | STAR {/* $$ = new string("*"); */} // | DIVIDE {/* $$ = new string("/"); */} // | MOD {/* $$ = new string("%"); */} // | XOR {/* $$ = new string("^"); */} // | AND {/* $$ = new string("&"); */} // | OR {/* $$ = new string("|"); */} // | COMPLEMENT {/* $$ = new string("~"); */} // | NOT {/* $$ = new string("!"); */} // | EQUAL {/* $$ = new string("="); */} // | LESS {/* $$ = new string("<"); */} // | GREATER {/* $$ = new string(">"); */} // | PLUSEQ {/* $$ = new string("+="); */} // | MINUSEQ {/* $$ = new string("-="); */} // | STAREQ {/* $$ = new string("*="); */} // | DIVEQ {/* $$ = new string("/="); */} // | MODEQ {/* $$ = new string("%="); */} // | XOREQ {/* $$ = new string("^="); */} // | ANDEQ {/* $$ = new string("&="); */} // | OREQ {/* $$ = new string("|="); */} // | LTLT {/* $$ = new string("<<"); */} // | GTGT {/* $$ = new string(">>"); */} // | GTGTEQ {/* $$ = new string(">>="); */} // | LTLTEQ {/* $$ = new string("<<="); */} // | EQEQ {/* $$ = new string("=="); */} // | NOTEQ {/* $$ = new string("!="); */} // | LEQ {/* $$ = new string("<="); */} // | GEQ {/* $$ = new string(">="); */} // | ANDAND {/* $$ = new string("&&"); */} // | OROR {/* $$ = new string("||"); */} // | PLUSPLUS {/* $$ = new string("++"); */} // | MINUSMINUS {/* $$ = new string("--"); */} // | COMMA {/* $$ = new string(","); */} // | ARROWSTAR {/* $$ = new string("->*"); */} // | ARROW {/* $$ = new string("->"); */} // | LEFTPAREN RIGHTPAREN {/* $$ = new string("()"); */} // | LEFTARRAY RIGHTARRAY {/* $$ = new string("[]"); */} // ; // ********** 1.12 Templates [gram.temp] ********** //template_declaration // : export_opt KW_template LESS // {} // template_parameter_list GREATER // {} // declaration // {} // ; //export_opt //: KW_export {} //| /* Empty */ {} // ; //template_parameter_list // : template_parameter // {} // | template_parameter_list COMMA template_parameter // {} // ; //template_parameter // : type_parameter {} // | parameter_declaration // {} // ; //template_opt //: KW_template {} //| /* Empty */ {} // ; //type_parameter // : KW_class identifier_opt // {} // | KW_class identifier_opt EQUAL type_id // {} // | KW_typename identifier_opt // {} // | KW_typename identifier_opt EQUAL type_id // {} // | KW_template LESS template_parameter_list GREATER KW_class identifier_opt // {} // | KW_template LESS template_parameter_list GREATER KW_class // identifier_opt EQUAL any_id_expression // {} // ; identifier_opt : any_identifier {} | /* Empty */ {} ; //template_id // : template_name LESS // template_argument_list_opt GREATER // {} // ; //template_argument_list // : template_argument // {} // | template_argument_list COMMA template_argument // {} // ; //template_argument_list_opt // : template_argument_list {} // | /* Empty */ {} // ; //template_argument // : assignment_expression {} // | type_id {} // | id_expression {} // ; //explicit_instantiation // : KW_template declaration {} // ; //explicit_specialization // : KW_template LESS GREATER declaration {} // ; // ********** 1.13 Exception handling [gram.except] ********** //try_block // : KW_try compound_statement handler_seq // {} // ; // // : KW_try ctor_initializer_opt function_body handler_seq // {} // ; //handler_seq // : handler handler_seq_opt // {} // ; //handler_seq_opt // : handler_seq {} // | /* Empty */ {} // ; //handler // : KW_catch LEFTPAREN exception_declaration RIGHTPAREN compound_statement // {} // ; //exception_declaration // : type_specifier_seq declarator // {} // | type_specifier_seq abstract_declarator // {} // | type_specifier_seq // {} // | ELLIPSES // {} // ; //throw_expression //: KW_throw assignment_expression_opt // {} // ; assignment_expression_opt : assignment_expression {} | /* Empty */ {} ; //exception_specification // : KW_throw LEFTPAREN type_id_list_opt RIGHTPAREN // {} // ; //exception_specification_opt // : exception_specification {} // | /* Empty */ {} // ; //type_id_list // : type_id // {} // | type_id_list COMMA type_id // {} // ; //type_id_list_opt // : type_id_list {} // | /* Empty */ {} // ; // ********** Our hack ********** //any_id_expression // : any_unqualified_id {} // | any_qualified_id {} // ; //any_unqualified_id // : any_identifier {} // | operator_function_id {} // | conversion_function_id {} // | COMPLEMENT class_name // { // } // | template_id {} // ; //any_qualified_id // : colcol_opt nested_name_specifier template_opt any_unqualified_id // {} // | COLCOL any_identifier {} // | COLCOL operator_function_id {} // | COLCOL template_id {} // ; // ********** 1.14 Preprocessing directives [gram.cpp] ********** %%