blob: 0b29a233c83481ddcb55f6622f3d5654111ff8d2 [file] [log] [blame]
%{
#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] **********
%%