%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2003-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% %CopyrightEnd% %% %% Description : Yecc spec for XPATH grammar %% This version of the parser is based on the XPATH spec: %% http://www.w3.org/TR/1999/REC-xpath-19991116 (XPATH version 1.0) Nonterminals 'LocationPath' 'AbsoluteLocationPath' 'RelativeLocationPath' 'Step' %% 'AxisSpecifier' 'NodeTest' 'Predicate' 'PredicateExpr' 'AbbreviatedAbsoluteLocationPath' 'AbbreviatedRelativeLocationPath' 'AbbreviatedStep' %% 'AbbreviatedAxisSpecifier' 'Expr' 'PrimaryExpr' 'FunctionCall' 'Argument' 'UnionExpr' 'PathExpr' 'FilterExpr' 'OrExpr' 'AndExpr' 'EqualityExpr' 'RelationalExpr' 'AdditiveExpr' 'MultiplicativeExpr' 'UnaryExpr' %% 'Operator' %% 'OperatorName' 'MultiplyOperator' 'NameTest' '' '' '' '' . Terminals 'number' 'axis' 'node_type' 'literal' 'prefix_test' 'var_reference' 'function_name' 'name' 'processing-instruction' 'wildcard' '(' ')' '[' ']' '.' '..' '@' ',' '::' 'and' 'or' 'mod' 'div' '/' '//' '|' '+' '-' '=' '!=' '<' '<=' '>' '>=' '*' . Rootsymbol 'Expr'. Endsymbol '$end' . Left 100 'or' . Left 200 'and' . Left 300 '=' . Left 300 '!=' . Left 400 '<' . Left 400 '>=' . Left 400 '>' . Left 400 '<=' . Unary 500 '-' . Expect 2. %%------------------------------------------------------------ %% Clauses %% %% [1] 'LocationPath' -> 'RelativeLocationPath' : {path, rel, '$1'} . 'LocationPath' -> 'AbsoluteLocationPath' : {path, abs, '$1'}. %% [2] 'AbsoluteLocationPath' -> '/' 'RelativeLocationPath' : '$2' . 'AbsoluteLocationPath' -> '/' : '/' . %% [3] 'RelativeLocationPath' -> 'AbbreviatedAbsoluteLocationPath' : '$1' . 'RelativeLocationPath' -> 'Step' : '$1' . 'RelativeLocationPath' -> 'RelativeLocationPath' '/' 'Step' : {refine, '$1', '$3'} . 'RelativeLocationPath' -> 'AbbreviatedRelativeLocationPath' : '$1' . %% [4] 'Step' -> 'axis' '::' 'NodeTest' '' : {step, {value('$1'), '$3', '$4'}} . 'Step' -> 'axis' '::' 'NodeTest' : {step, {value('$1'), '$3', []}} . 'Step' -> '@' 'name' '' : {step, {value('$1'), '$2', '$3'}} . 'Step' -> '@' 'name' : {step, {'attribute', '$2', []}} . 'Step' -> 'NodeTest' '' : {step, {'child', '$1', '$2'}} . 'Step' -> 'NodeTest' : {step, {'child', '$1', []}} . 'Step' -> 'AbbreviatedStep' : {abbrev_step, '$1'} . '' -> '' : lists:reverse('$1') . '' -> '' 'Predicate' : ['$2'|'$1'] . '' -> 'Predicate' : ['$1'] . %% [5] %% 'AxisSpecifier' -> 'axis' '::' : '$1' . %% 'AxisSpecifier' -> 'AbbreviatedAxisSpecifier' : '$1' . %% [7] 'NodeTest' -> 'NameTest' : '$1' . 'NodeTest' -> 'node_type' '(' ')' : {node_type, value('$1')} . 'NodeTest' -> 'processing-instruction' '(' ')' : {node_type, value('$1')} . 'NodeTest' -> 'processing-instruction' '(' 'literal' ')' : {processing_instruction, value('$3')} . %% [8] 'Predicate' -> '[' 'PredicateExpr' ']' : {pred, '$2'} . %% [9] 'PredicateExpr' -> 'Expr' : '$1' . %% [10] 'AbbreviatedAbsoluteLocationPath' -> '//' 'RelativeLocationPath' : {'//', '$2'} . %% [11] 'AbbreviatedRelativeLocationPath' -> 'RelativeLocationPath' '//' 'Step' : {'$1', '//', '$3'} . %% [12] 'AbbreviatedStep' -> '.' : '$1' . 'AbbreviatedStep' -> '..' : '$1' . %% [13] %% 'AbbreviatedAxisSpecifier' -> '$empty' : 'child' . %% 'AbbreviatedAxisSpecifier' -> '@' : '$1' . %% [14] 'Expr' -> 'OrExpr' : '$1' . %% [15] 'PrimaryExpr' -> 'var_reference' : {variable_reference, value('$1')} . 'PrimaryExpr' -> '(' Expr ')' : '$2' . 'PrimaryExpr' -> 'literal' : {literal, value('$1')} . 'PrimaryExpr' -> 'number' : {number, value('$1')} . 'PrimaryExpr' -> 'FunctionCall' : '$1' . %% [16] 'FunctionCall' -> 'function_name' '(' ')' : {function_call, value('$1'), []} . 'FunctionCall' -> 'function_name' '(' '' ')' : {function_call, value('$1'), '$3'} . '' -> '' : lists:reverse('$1') . '' -> '' ',' 'Argument' : ['$3'|'$1'] . '' -> 'Argument' : ['$1'] . %% [17] 'Argument' -> 'Expr' : '$1' . %% [18] 'UnionExpr' -> 'PathExpr' : '$1' . 'UnionExpr' -> 'UnionExpr' '|' 'PathExpr' : {path, union, {'$1', '$3'}} . %% [19] 'PathExpr' -> 'LocationPath' : '$1' . 'PathExpr' -> 'FilterExpr' : '$1' . 'PathExpr' -> 'FilterExpr' '/' 'RelativeLocationPath' : {refine, '$1', '$3'} . 'PathExpr' -> 'FilterExpr' '//' 'RelativeLocationPath' : {'$1', '//', '$3'} . %% [20] 'FilterExpr' -> 'PrimaryExpr' : '$1' . 'FilterExpr' -> 'FilterExpr' 'Predicate' : {path, filter, {'$1', '$2'}} . %% [21] 'OrExpr' -> 'AndExpr' : '$1' . 'OrExpr' -> 'OrExpr' 'or' 'AndExpr' : {bool, 'or', '$1', '$3'} . %% [22] 'AndExpr' -> 'EqualityExpr' : '$1' . 'AndExpr' -> 'AndExpr' 'and' 'EqualityExpr' : {bool, 'and', '$1', '$3'} . %% [23] 'EqualityExpr' -> 'RelationalExpr' : '$1' . 'EqualityExpr' -> 'EqualityExpr' '=' 'RelationalExpr' : {comp, '=', '$1', '$3'} . 'EqualityExpr' -> 'EqualityExpr' '!=' 'RelationalExpr' : {comp, '!=', '$1', '$3'} . %%[24] 'RelationalExpr' -> 'AdditiveExpr' : '$1' . 'RelationalExpr' -> 'RelationalExpr' '<' 'AdditiveExpr' : {comp, '<', '$1', '$3'} . 'RelationalExpr' -> 'RelationalExpr' '>' 'AdditiveExpr' : {comp, '>', '$1', '$3'} . 'RelationalExpr' -> 'RelationalExpr' '<=' 'AdditiveExpr' : {comp, '<=', '$1', '$3'} . 'RelationalExpr' -> 'RelationalExpr' '>=' 'AdditiveExpr' : {comp, '>=', '$1', '$3'} . %% [25] 'AdditiveExpr' -> 'MultiplicativeExpr' : '$1' . 'AdditiveExpr' -> 'AdditiveExpr' '+' 'MultiplicativeExpr' : {arith, '+', '$1', '$3'} . 'AdditiveExpr' -> 'AdditiveExpr' '-' 'MultiplicativeExpr' : {arith, '-', '$1', '$3'} . %% [26] 'MultiplicativeExpr' -> 'UnaryExpr' : '$1' . 'MultiplicativeExpr' -> 'MultiplicativeExpr' 'MultiplyOperator' 'UnaryExpr' : {arith, '$2', '$1', '$3'} . 'MultiplicativeExpr' -> 'MultiplicativeExpr' 'div' 'UnaryExpr' : {arith, 'div', '$1', '$3'} . 'MultiplicativeExpr' -> 'MultiplicativeExpr' 'mod' 'UnaryExpr' : {arith, 'mod', '$1', '$3'} . %% [27] 'UnaryExpr' -> 'UnionExpr' : '$1' . 'UnaryExpr' -> '-' UnaryExpr : {'negative', '$2'} . %% [32] %% 'Operator' -> 'OperatorName' : '$1' . %% 'Operator' -> 'MultiplyOperator' : '$1' . %% 'Operator' -> '/' : '$1' . %% 'Operator' -> '//' : '$1' . %% 'Operator' -> '|' : '$1' . %% 'Operator' -> '+' : '$1' . %% 'Operator' -> '-' : '$1' . %% 'Operator' -> '=' : '$1' . %% 'Operator' -> '!=' : '$1' . %% 'Operator' -> '<' : '$1' . %% 'Operator' -> '<=' : '$1' . %% 'Operator' -> '>' : '$1' . %% 'Operator' -> '>=' : '$1' . %% [33] %% 'OperatorName' -> 'and' : '$1' . %% 'OperatorName' -> 'mod' : '$1' . %% 'OperatorName' -> 'div' : '$1' . %% [34] 'MultiplyOperator' -> '*' : '*' . %% [37] 'NameTest' -> 'wildcard' : {wildcard, value('$1')} . 'NameTest' -> 'prefix_test' : {prefix_test, value('$1')} . 'NameTest' -> 'name' : {name, value('$1')} . Erlang code. % token({Token, _Line}) -> % Token; % token({Token, _Line, _Value}) -> % Token. value({Token, _Line}) -> Token; value({_Token, _Line, Value}) -> Value.