diff options
Diffstat (limited to 'lib/xmerl/src/xmerl_xpath_parse.yrl')
-rw-r--r-- | lib/xmerl/src/xmerl_xpath_parse.yrl | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/lib/xmerl/src/xmerl_xpath_parse.yrl b/lib/xmerl/src/xmerl_xpath_parse.yrl new file mode 100644 index 0000000000..37576b9e61 --- /dev/null +++ b/lib/xmerl/src/xmerl_xpath_parse.yrl @@ -0,0 +1,311 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-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% +%% + +%% 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' + '<PredicateList>' + '<PredicateMember>' + '<ArgumentList>' + '<ArgumentMember>' + . + +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' '<PredicateList>' + : {step, {value('$1'), '$3', '$4'}} . +'Step' -> 'axis' '::' 'NodeTest' + : {step, {value('$1'), '$3', []}} . +'Step' -> '@' 'name' '<PredicateList>' + : {step, {value('$1'), '$2', '$3'}} . +'Step' -> '@' 'name' + : {step, {'attribute', '$2', []}} . +'Step' -> 'NodeTest' '<PredicateList>' + : {step, {'child', '$1', '$2'}} . +'Step' -> 'NodeTest' + : {step, {'child', '$1', []}} . +'Step' -> 'AbbreviatedStep' + : {abbrev_step, '$1'} . + + +'<PredicateList>' -> '<PredicateMember>' : lists:reverse('$1') . + + +'<PredicateMember>' -> '<PredicateMember>' 'Predicate' + : ['$2'|'$1'] . +'<PredicateMember>' -> 'Predicate' : ['$1'] . + + +%% [5] +%% 'AxisSpecifier' -> 'axis' '::' : '$1' . +%% 'AxisSpecifier' -> 'AbbreviatedAxisSpecifier' : '$1' . + + +%% [7] +'NodeTest' -> 'NameTest' : '$1' . +'NodeTest' -> 'node_type' '(' ')' : {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' '(' '<ArgumentList>' ')' + : {function_call, value('$1'), '$3'} . + +'<ArgumentList>' -> '<ArgumentMember>' : lists:reverse('$1') . + +'<ArgumentMember>' -> '<ArgumentMember>' ',' 'Argument' + : ['$3'|'$1'] . +'<ArgumentMember>' -> '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. |