/**
 *  MICO --- a free CORBA implementation<br>
 *<p>
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *<p>
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *<p>
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *<p>
 *  Send comments and/or bug reports to:
 * @author	<a href="mailto:mico@informatik.uni-frankfurt.de">mico@informatik.uni-frankfurt.de</a>
 * @copyright 1997-98 &copy; Kay Roemer & Arno Puder
 */

%token AMPERSAND
%token ANY
%token ASTERISK
%token ATTRIBUTE
%token BOOLEAN
%token CASE
%token CHAR
%token CHARACTER_LITERAL
%token CIRCUMFLEX
%token COLON
%token COMMA
%token CONST
%token CONTEXT
%token DEFAULT
%token DOUBLE
%token ENUM
%token EQUAL
%token EXCEPTION
%token FALSE
%token FIXED
%token FIXED_PLITERAL
%token FLOAT
%token FLOATING_PLITERAL
%token GREATER_THAN_SIGN
%token IDENTIFIER
%token IN
%token INOUT
%token INTEGER_LITERAL
%token INTERFACE
%token LEFT_CURLY_BRACKET
%token LEFT_PARENTHESIS
%token LEFT_SQUARE_BRACKET
%token LESS_THAN_SIGN
%token LONG
%token MINUS_SIGN
%token MODULE
%token OCTET
%token ONEWAY
%token OUT
%token PERCENT_SIGN
%token PLUS_SIGN
%token PRINCIPAL
%token RAISES
%token READONLY
%token RIGHT_CURLY_BRACKET
%token RIGHT_PARENTHESIS
%token RIGHT_SQUARE_BRACKET
%token SCOPE
%token SEMICOLON
%token SEQUENCE
%token LEFT_SHIFT
%token RIGHT_SHIFT
%token SHORT
%token SOLIDUS
%token STRING
%token STRING_LITERAL
%token PRAGMA
%token STRUCT
%token SWITCH
%token TILDE
%token TRUE
%token OBJECT
%token TYPEDEF
%token UNION
%token UNSIGNED
%token VERTICAL_LINE
%token VOID
%token WCHAR
%token WSTRING
  //%token UNKNOWN
%token ABSTRACT
%token VALUETYPE
%token TRUNCATABLE
%token SUPPORTS
%token CUSTOM
%token PUBLIC
%token PRIVATE
%token FACTORY
%token NATIVE
%token VALUEBASE


%%

/*1*/
specification
        : /*empty*/
        | definitions
        ;

        
definitions
        : definition
        | definition definitions
        ;

/*2*/
definition
        : type_dcl SEMICOLON
        | const_dcl SEMICOLON
        | except_dcl SEMICOLON
        | interface SEMICOLON
        | module SEMICOLON
        | value SEMICOLON
        ;

/*3*/
module
        : MODULE IDENTIFIER LEFT_CURLY_BRACKET
                   definitions RIGHT_CURLY_BRACKET
        ;

/*4*/
interface
        : interface_dcl
        | forward_dcl
        ;

/*5*/
interface_dcl
        : interface_header LEFT_CURLY_BRACKET interface_body
                                         RIGHT_CURLY_BRACKET
        ;

/*6*/
forward_dcl
        : INTERFACE IDENTIFIER
        | ABSTRACT INTERFACE IDENTIFIER
        ;

/*7*/
interface_header
        : INTERFACE IDENTIFIER
        | INTERFACE IDENTIFIER interface_inheritance_spec
        | ABSTRACT INTERFACE IDENTIFIER
        | ABSTRACT INTERFACE IDENTIFIER interface_inheritance_spec
        ; 

/*8*/
interface_body
        : /*empty*/
        | exports
        ;

exports
        : export
        | export exports
        ;

/*9*/
export
        : type_dcl SEMICOLON
        | const_dcl SEMICOLON 
        | except_dcl SEMICOLON
        | attr_dcl SEMICOLON
        | op_dcl SEMICOLON 
        ;

/*10*/
interface_inheritance_spec
        : COLON interface_names
        ;

interface_names
        : scoped_names
        ;

scoped_names
        : scoped_name
        | scoped_name COMMA scoped_names
        ;

/*11
interface_name
        : scoped_name
        ;
*/
/*12*/
scoped_name
        : IDENTIFIER
        | SCOPE IDENTIFIER
        | scoped_name SCOPE IDENTIFIER
        ;

/*13*/
value
        : value_dcl
        | value_abs_dcl
        | value_box_dcl
        | value_forward_dcl
        ;

/*14*/
value_forward_dcl
        : VALUETYPE IDENTIFIER
        | ABSTRACT VALUETYPE IDENTIFIER
        ;

/*15*/
value_box_dcl
        : VALUETYPE IDENTIFIER type_spec
        ;

/*16*/
value_abs_dcl
        : ABSTRACT VALUETYPE IDENTIFIER
                LEFT_CURLY_BRACKET value_body RIGHT_CURLY_BRACKET
        | ABSTRACT VALUETYPE IDENTIFIER value_inheritance_spec
                LEFT_CURLY_BRACKET value_body RIGHT_CURLY_BRACKET
        ;

value_body
        : /*empty*/
        | exports
        ;

/*17*/
value_dcl
        : value_header LEFT_CURLY_BRACKET value_elements
                RIGHT_CURLY_BRACKET
        | value_header LEFT_CURLY_BRACKET RIGHT_CURLY_BRACKET
        ;

value_elements
        : value_element
        | value_element value_elements
        ;

/*18*/
value_header
        : VALUETYPE IDENTIFIER value_inheritance_spec
        | CUSTOM VALUETYPE IDENTIFIER value_inheritance_spec
        | VALUETYPE IDENTIFIER
        | CUSTOM VALUETYPE IDENTIFIER
        ;

/*19*/
value_inheritance_spec
        : COLON value_inheritance_bases
        | COLON value_inheritance_bases SUPPORTS interface_names
        | SUPPORTS interface_names
        ;

value_inheritance_bases
        : value_name
        | value_name COMMA value_names
        | TRUNCATABLE value_name
        | TRUNCATABLE value_name COMMA value_names
        ;

value_names
        : scoped_names
        ;

/*20*/
value_name
        : scoped_name
        ;

/*21*/
value_element
        : export
        | state_member
        | init_dcl
        ;

/*22*/
state_member
        : PUBLIC type_spec declarators SEMICOLON
        | PRIVATE type_spec declarators SEMICOLON
        ;

/*23*/
init_dcl
        : FACTORY IDENTIFIER
                LEFT_PARENTHESIS init_param_decls RIGHT_PARENTHESIS
                SEMICOLON
        ;

/*24*/
init_param_decls
        : init_param_decl
        | init_param_decl COMMA init_param_decls
        ;

/*25*/
init_param_decl
        : init_param_attribute param_type_spec simple_declarator
        ;

/*26*/
init_param_attribute
        : IN
        ;

/*27*/
const_dcl
        : CONST const_type IDENTIFIER EQUAL const_exp
        ;

/*28*/
const_type
        : integer_type
        | char_type
        | wide_char_type
        | boolean_type
        | floating_pt_type
        | string_type
        | wide_string_type
        | fixed_pt_const_type
        | scoped_name 
        | octet_type
        ;

/*29*/
const_exp
        : or_expr
        ;

/*30*/
or_expr
        : xor_expr
        | or_expr VERTICAL_LINE xor_expr
        ;

/*31*/
xor_expr
        : and_expr
        | xor_expr CIRCUMFLEX and_expr
        ;

/*32*/
and_expr
        : shift_expr
        | and_expr AMPERSAND shift_expr
        ;

/*33*/
shift_expr
        : add_expr
        | shift_expr RIGHT_SHIFT add_expr
        | shift_expr LEFT_SHIFT add_expr
        ;

/*34*/
add_expr
        : mult_expr
        | add_expr PLUS_SIGN mult_expr
        | add_expr MINUS_SIGN mult_expr
        ;

/*35*/
mult_expr
        : unary_expr
        | mult_expr ASTERISK unary_expr
        | mult_expr SOLIDUS unary_expr
        | mult_expr PERCENT_SIGN unary_expr
        ;

/*36*/
/*37*/
unary_expr
        : MINUS_SIGN primary_expr
        | PLUS_SIGN primary_expr
        | TILDE primary_expr
        | primary_expr
        ;

/*38*/
primary_expr
        : scoped_name
        | literal
        | LEFT_PARENTHESIS const_exp RIGHT_PARENTHESIS
        ;

/*39*/
/*40*/
literal
        : INTEGER_LITERAL
        | string_literal
        | CHARACTER_LITERAL
        | FIXED_PLITERAL
        | FLOATING_PLITERAL
        | TRUE  /*boolean_literal*/
        | FALSE /*boolean_literal*/
        ;

/*41*/
positive_int_const
        : const_exp
        ;

/*42*/
/*43*/
type_dcl
        : TYPEDEF type_spec declarators
        | struct_type
        | union_type
        | enum_type
        | NATIVE simple_declarator
        ;

/*44*/
type_spec
        : simple_type_spec
        | constr_type_spec 
        ;

/*45*/
simple_type_spec
        : base_type_spec
        | template_type_spec
        | scoped_name
        ;

/*46*/
base_type_spec
        : floating_pt_type
        | integer_type
        | char_type
        | wide_char_type
        | boolean_type
        | octet_type
        | any_type
        | object_type
        | value_base_type
        | principal_type  /*New*/
        ;

/*47*/
template_type_spec
        : sequence_type
        | string_type
        | wide_string_type
        | fixed_pt_type
        ;

/*48*/
constr_type_spec
        : struct_type
        | union_type
        | enum_type
        ;

/*49*/
declarators
        : declarator
        | declarator COMMA declarators
        ;

/*50*/
declarator
        : simple_declarator
        | complex_declarator
        ;

/*51*/
simple_declarator
        : IDENTIFIER
        ;

/*52*/
complex_declarator
        : array_declarator
        ;

/*53*/
floating_pt_type
        : FLOAT
        | DOUBLE
        | LONG DOUBLE
        ;

/*54*/
integer_type
        : signed_int
        | unsigned_int
        ;

/*55*/
signed_int
        : signed_long_int
        | signed_short_int
        | signed_longlong_int
        ;

/*56*/
signed_short_int
        : SHORT
        ;

/*57*/
signed_long_int
        : LONG
        ;

/*58*/
signed_longlong_int
        : LONG LONG
        ;

/*59*/
unsigned_int
        : unsigned_long_int
        | unsigned_short_int
        | unsigned_longlong_int
        ;

/*60*/
unsigned_short_int
        : UNSIGNED SHORT
        ;

/*61*/
unsigned_long_int
        : UNSIGNED LONG
        ;

/*62*/
unsigned_longlong_int
        : UNSIGNED LONG LONG
        ;

/*63*/
char_type
        : CHAR
        ;

/*64*/
wide_char_type
        : WCHAR
        ;

/*65*/
boolean_type
        : BOOLEAN
        ;

/*66*/
octet_type
        : OCTET
        ;

/*67*/
any_type
        : ANY
        ;

/*68*/
object_type
        : OBJECT
        ;

/*69*/
struct_type
        : STRUCT IDENTIFIER LEFT_CURLY_BRACKET member_list 
                                               RIGHT_CURLY_BRACKET
        ;

/*70*/
member_list
        : member
        | member member_list
        ;

/*71*/
member
        : type_spec declarators SEMICOLON
        ;

/*72*/
union_type
        : UNION IDENTIFIER SWITCH LEFT_PARENTHESIS
          switch_type_spec RIGHT_PARENTHESIS LEFT_CURLY_BRACKET
          switch_body RIGHT_CURLY_BRACKET
        ; 

/*73*/
switch_type_spec
        : integer_type
        | char_type
        | boolean_type
        | enum_type
        | scoped_name
        ;

/*74*/
switch_body
        : case
        | case switch_body
        ;

/*75*/
case    
        : case_label case
        | case_label element_spec SEMICOLON
        | case_label PRAGMA element_spec SEMICOLON   /* New */
        ;

/*76*/
case_label
        : CASE const_exp COLON 
        | DEFAULT COLON
        ;

/*77*/
element_spec
        : type_spec declarator
        ;

/*78*/
enum_type
        : ENUM IDENTIFIER LEFT_CURLY_BRACKET enumerators
                                         RIGHT_CURLY_BRACKET
        ;

enumerators
        : enumerator
        | enumerator COMMA enumerators
        ;

/*79*/
enumerator
        : IDENTIFIER
        ;

/*80*/
sequence_type
        : SEQUENCE LESS_THAN_SIGN simple_type_spec COMMA
                        positive_int_const GREATER_THAN_SIGN
        | SEQUENCE LESS_THAN_SIGN simple_type_spec GREATER_THAN_SIGN
        ;

/*81*/
string_type
        : STRING LESS_THAN_SIGN positive_int_const GREATER_THAN_SIGN
        | STRING
        ;

/*82*/
wide_string_type
        : WSTRING LESS_THAN_SIGN positive_int_const GREATER_THAN_SIGN
        | WSTRING
        ;

/*83*/
array_declarator
        : IDENTIFIER fixed_array_sizes
        ;

fixed_array_sizes
        : fixed_array_size
        | fixed_array_size fixed_array_sizes
        ;

/*84*/
fixed_array_size
        : LEFT_SQUARE_BRACKET positive_int_const RIGHT_SQUARE_BRACKET
        ;

/*85*/
attr_dcl
        : ATTRIBUTE param_type_spec simple_declarators
        | READONLY ATTRIBUTE param_type_spec simple_declarators
        ; 

simple_declarators
        : simple_declarator
        | simple_declarator COMMA simple_declarators
        ;

/*86*/
except_dcl
        : EXCEPTION IDENTIFIER LEFT_CURLY_BRACKET members
                                          RIGHT_CURLY_BRACKET
        ;

members
        : /*empty*/
        | member members
        ;

/*87*/
op_dcl
        : op_attribute op_type_spec IDENTIFIER parameter_dcls
                                       raises_expr context_expr
        ;

/*88*/
op_attribute
        : /*empty*/
        | ONEWAY
        ;

/*89*/
op_type_spec    
        : param_type_spec
        | VOID
        ;

/*90*/
parameter_dcls
        : LEFT_PARENTHESIS param_dcls RIGHT_PARENTHESIS
        | LEFT_PARENTHESIS RIGHT_PARENTHESIS
        ;

param_dcls
        : param_dcl
        | param_dcl COMMA param_dcls
        ;

/*91*/
param_dcl
        : param_attribute param_type_spec simple_declarator
        ;

/*92*/
param_attribute
        : IN
        | OUT
        | INOUT
        ;

/*93*/
raises_expr
        : /*empty*/
        | RAISES LEFT_PARENTHESIS scoped_names RIGHT_PARENTHESIS
        ;

/*94*/
context_expr
        : /*empty*/
        | CONTEXT LEFT_PARENTHESIS string_literals RIGHT_PARENTHESIS
        ;

string_literals
        : string_literal
        | string_literal COMMA string_literals
        ;

string_literal
        : STRING_LITERAL
        | STRING_LITERAL string_literal
        ;

/*95*/
param_type_spec
        : base_type_spec
        | string_type
        | wide_string_type
        | scoped_name
        ;

/*96*/
fixed_pt_type
        : FIXED LESS_THAN_SIGN positive_int_const COMMA
              INTEGER_LITERAL GREATER_THAN_SIGN
        ;

/*97*/
fixed_pt_const_type
        : FIXED
        ;

/*98*/
value_base_type
        : VALUEBASE
        ;

/* New production for Principal */
principal_type
        : PRINCIPAL
        ;

%%
