%%--------------------------------------------------------------------
%% %CopyrightBegin%
%% 
%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
%% 
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%% 
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%% 
%% %CopyrightEnd%
%%
%%--------------------------------------------------------------------
%% File    : cosNotification_Grammar.yrl
%% Purpose : Implement the constraint grammar for CosNotification filters.
%%--------------------------------------------------------------------

Nonterminals  
	'<toplevel>' '<constraint>' '<expr>' '<bool>' '<bool_or>' '<Ident>'
	'<bool_and>' '<bool_compare>' '<expr_in>' '<expr_twiddle>' '<term>' 
	'<factor_not>' '<factor>' '<Component>' '<CompExt>' '<CompDot>' '<UnionVal>'.

Terminals 
%	'dbslsh' 'bslshd' 
	'bslsh' 'ident' 'string'
	'_length' '_d''_type_id' '_repos_id' 
	'not' 'or' 'and' 'num'
	'in' '~' '.' 'dollar'
	'ADDOP' 'RELOP' 'MULOP' 'default' 'exist'
	'TRUE' 'FALSE'
	'(' ')' '[' ']' 'int'.

Left 100 'or'.
Left 200 'and'.
%Nonassoc 300 'RELOP'.          % '==', '!=', '<', '>', '<=', '=>'
Left 300 'RELOP'.
%Nonassoc 400 'in'.
Left 400 'in'.
%Nonassoc 500 '~'.
Left 500 '~'.
Left 600 'ADDOP'.               % '+', '-'
Left 700 'MULOP'.               % '*', '/'
Unary 800 'not'.
Unary 900 'exist'.
Unary 900 'default'.
%Unary 900 'u-'.                 % unary minus

Rootsymbol    '<toplevel>'.
Endsymbol     '$end'.

'<toplevel>' -> '$empty' : '$empty'.
'<toplevel>' -> '<constraint>' : '$1'.

'<constraint>' -> '<bool>' : '$1'.
  
'<bool>' -> '<bool_or>' : '$1'.

'<bool_or>' -> '<bool_or>' 'or' '<bool_and>' : {'or', '$1', '$3'}.
'<bool_or>' -> '<bool_and>' : '$1'.

'<bool_and>' -> '<bool_and>' 'and' '<bool_compare>' : {'and', '$1', '$3'}. 
'<bool_and>' -> '<bool_compare>' : '$1'.

'<bool_compare>' -> '<expr_in>' 'RELOP' '<expr_in>' : {element(2, '$2'), '$1', '$3'}. 
'<bool_compare>' -> '<expr_in>' : '$1'.

'<expr_in>' -> '<expr_twiddle>' : '$1'.
'<expr_in>' -> '<expr_twiddle>' 'in' '<Ident>' : {'in', '$1', '$3'}.
'<expr_in>' -> '<expr_twiddle>' 'in' 'dollar' '<Component>' : {'in', '$1', examin_comp({'component', '$4'})}.

'<expr_twiddle>' -> '<expr>' : '$1'. 
'<expr_twiddle>' -> '<expr>' '~' '<expr>' : {'~', '$1', '$3'}.

'<expr>' -> '<term>' : '$1'.
'<expr>' -> '<expr>' 'ADDOP' '<term>' : {element(2, '$2'), '$1', '$3'}.

'<term>' -> '<factor_not>' : '$1'.
'<term>' -> '<term>' 'MULOP' '<factor_not>' : {element(2, '$2'), '$1', '$3'}.

'<factor_not>' -> '<factor>' : '$1'.
'<factor_not>' -> 'not' '<factor>' : {'not', '$2'}.

'<factor>' -> '(' '<bool_or>' ')' : '$2'. 
'<factor>' -> 'num' : element(2, '$1').
'<factor>' -> 'int' : element(2, '$1').
'<factor>' -> 'string' : element(2, '$1').
'<factor>' -> 'TRUE' : 'true'.
'<factor>' -> 'FALSE' : 'false'.
'<factor>' -> 'ADDOP' 'num' : create_unary(element(2, '$1'), element(2, '$2')).
'<factor>' -> 'ADDOP' 'int' : create_unary(element(2, '$1'), element(2, '$2')).
'<factor>' -> '<Ident>' : list_to_atom('$1').
'<factor>' -> 'dollar' '<Component>' : examin_comp({component, '$2'}).
'<factor>' -> 'default' 'dollar' '<Component>' : examin_comp({'default_component', '$3'}).
'<factor>' -> 'exist' 'dollar' '<Component>' : examin_comp({'exist_component', '$3'}).

%% The following rules are used to create Components. The format used is:
%% [...]
'<Component>' -> '.' '<CompDot>' : '$2'.
'<Component>' -> '[' 'int' ']' '<CompExt>' : [{'arrindex', element(2, '$2')} | '$4']. %% CompArray
'<Component>' -> '(' '<Ident>' ')' '<CompExt>' : [{'associd', '$2'} | '$4']. %%CompAssoc
'<Component>' ->  '<Ident>' '<CompExt>' : [{'varid', '$1'} | '$2']. %% run-time variable
'<Component>' ->  '$empty' : [].

'<CompExt>' ->  '.' '<CompDot>' : '$2'.
'<CompExt>' ->  '[' 'int' ']' '<CompExt>' : [{'arrindex', element(2, '$2')} | '$4']. %% CompArray
'<CompExt>' ->  '(' '<Ident>' ')' '<CompExt>' : [{'associd', '$2'} | '$4']. %%CompAssoc
'<CompExt>' ->  '$empty' : [].

'<CompDot>' -> '<Ident>' '<CompExt>' : [{'dotid', '$1'} | '$2']. 
'<CompDot>' -> 'int' '<CompExt>' : [{'dotint', element(2, '$1')} | '$2']. %% ComPos
'<CompDot>' -> '(' '<UnionVal>' ')' '<CompExt>' : ['$2' | '$4']. %% UnionPos
'<CompDot>' -> '_length'           : ['_length'].   %% arrays or sequences ONLY
'<CompDot>' -> '_d'                : ['_d'].        %% discriminated unions ONLY
'<CompDot>' -> '_type_id'          : ['_type_id'].  %% ok if info can be obtained
'<CompDot>' -> '_repos_id'         : ['_repos_id']. %% ok if info can be obtained

'<Ident>' -> 'ident' : element(2, '$1').
'<Ident>' -> 'bslsh' 'ident' : element(2, '$2').

'<UnionVal>' ->  'int' : {'uint', element(2, '$1')}.
'<UnionVal>' ->  'ADDOP' 'int' : {'uint', create_unary(element(2, '$1'), element(2, '$2'))}.
'<UnionVal>' ->  'string' : {'ustr', element(2, '$1')}.
'<UnionVal>' ->   '$empty': 'default'.

Erlang code.
%%--------------------------------------------------------------------
%%
%% %CopyrightBegin%
%% 
%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
%% 
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%% 
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%% 
%% %CopyrightEnd%
%%
%%----------------------------------------------------------------------
%% File    : cosNotification_Grammar.erl
%% Purpose : THIS FILE HAS BEEN GENERATED. DO NOT EDIT!!!!
%%----------------------------------------------------------------------

-include("CosNotification_Definitions.hrl").

create_unary('+', Val) when is_number(Val) -> Val;
create_unary('-', Val) when is_number(Val) -> -Val;
create_unary(_, _) -> return_error(0, "syntax error").

examin_comp({T, []}) ->
	{T, '$empty'};
examin_comp(V) ->
	V.

