| %{ |
| #include "actions.h" |
| #include <iostream> |
| |
| 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 <tokenvalue> KW_class KW_struct KW_union KW_enum KW_namespace KW_template |
| %type <tokenvalue> KW_protected KW_public KW_private |
| %type <tokenvalue> KW_typename KW_operator class_key COMMA COLON |
| %type <tokenvalue> colcol_opt ptr_operator |
| %type <tokenvalue> comma_opt virtual_opt cv_qualifier cv_qualifier_seq |
| %type <tokenvalue> cv_qualifier_seq_opt |
| |
| //%type <> CHARACTER_LITERAL FLOATING_LITERAL |
| //%type <> STRING_LITERAL |
| |
| %type <tokenvalue> access_specifier access_specifier_opt |
| //%type <> declaration block_declaration |
| //%type <> simple_declaration |
| %type <member_declarator_ptr> declarator direct_declarator |
| %type <member_declarator_ptr> member_declarator init_declarator |
| %type <param_declarator_ptr> parameter_declarator direct_parameter_declarator |
| //%type <> enumerator_definition |
| %type <param_decl_ptr> parameter_declaration |
| %type <param_decl_list_ptr> parameter_declaration_list parameter_declaration_list_opt parameter_declaration_clause |
| %type <expression_ptr> initializer initializer_opt initializer_clause assignment_expression |
| %type <tokenvalue> pure_specifier pure_specifier_opt |
| %type <expression_ptr> constant_expression constant_expression_opt |
| %type <expression_ptr> constant_initializer constant_initializer_opt |
| //%type <> initializer_list |
| %type <string_ptr> unqualified_id id_expression |
| %type <string_ptr> class_name type_name declarator_id |
| %type <string_ptr> simple_type_specifier type_specifier decl_specifier function_specifier |
| %type <ctype> type_specifier_seq |
| %type <ctype> type_specifier_seq_opt |
| %type <ctype> class_specifier |
| %type <class_head_ptr> class_head |
| %type <base_specifier_ptr> base_specifier |
| //%type <> expression_list expression_list_opt |
| |
| %type <any_ptr> member_specification member_specification_opt |
| %type <any_ptr> member_declaration |
| %type <member_declarator_list_ptr> declaration_seq declaration_seq_opt |
| %type <member_declarator_list_ptr> member_declarator_list |
| //%type <> enumerator_list enumerator_list_opt |
| %type <string_list_ptr> decl_specifier_seq decl_specifier_seq_opt |
| %type <base_specifier_list_ptr> base_clause_opt base_clause base_specifier_list |
| |
| %type <string_ptr> 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] ********** |
| |
| %% |