| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- %{
- // XPath parser
- //
- // Author - Piers Haken <[email protected]>
- //
- // TODO: FUNCTION_CALL should be a QName, not just a NCName
- // TODO: PROCESSING_INSTRUCTION's optional parameter
- // TODO: flatten argument/predicate lists in place
- using System;
- using System.Xml.XPath;
- namespace Mono.Xml.XPath
- {
- public class XPathParser
- {
- internal object yyparseSafe (Tokenizer tok)
- {
- return yyparseSafe (tok, null);
- }
- internal object yyparseSafe (Tokenizer tok, object yyDebug)
- {
- try
- {
- return yyparse (tok, yyDebug);
- }
- catch (XPathException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new XPathException ("Error during parse", e);
- }
- }
- internal object yyparseDebug (Tokenizer tok)
- {
- return yyparseSafe (tok, new yydebug.yyDebugSimple ());
- }
- %}
- %token ERROR
- %token EOF
- %token SLASH "/"
- %token SLASH2 "//"
- %token DOT "."
- %token DOT2 ".."
- %token COLON ":"
- %token COLON2 "::"
- %token COMMA ","
- %token AT "@"
- %token FUNCTION_NAME
- %token BRACKET_OPEN "["
- %token BRACKET_CLOSE "]"
- %token PAREN_OPEN "("
- %token PAREN_CLOSE ")"
- %token AND "and"
- %token OR "or"
- %token DIV "div"
- %token MOD "mod"
- %token PLUS "+"
- %token MINUS "-"
- %token ASTERISK "*"
- %token DOLLAR "$"
- %token BAR "|"
- %token EQ "="
- %token NE "!="
- %token LE "<="
- %token GE ">="
- %token LT "<"
- %token GT ">"
- %token ANCESTOR "ancestor"
- %token ANCESTOR_OR_SELF "ancstor-or-self"
- %token ATTRIBUTE "attribute"
- %token CHILD "child"
- %token DESCENDANT "descendant"
- %token DESCENDANT_OR_SELF "descendant-or-self"
- %token FOLLOWING "following"
- %token FOLLOWING_SIBLING "sibling"
- %token NAMESPACE "NameSpace"
- %token PARENT "parent"
- %token PRECEDING "preceding"
- %token PRECEDING_SIBLING "preceding-sibling"
- %token SELF "self"
- %token COMMENT "comment"
- %token TEXT "text"
- %token PROCESSING_INSTRUCTION "processing-instruction"
- %token NODE "node"
- %token MULTIPLY "*"
- %token NUMBER
- %token LITERAL
- %token NCName
- %start Expr
- %left AND
- %left OR
- %left EQ
- %left NE
- %left LE
- %left GE
- %left LT
- %left GT
- %left DIV
- %left MOD
- %left PLUS
- %left MINUS
- %%
- Expr
- : OrExpr
- ;
-
- OrExpr
- : AndExpr
- | OrExpr OR AndExpr
- {
- $$ = new ExprOR ((Expression) $1, (Expression) $3);
- }
- ;
- AndExpr
- : EqualityExpr
- | AndExpr AND EqualityExpr
- {
- $$ = new ExprAND ((Expression) $1, (Expression) $3);
- }
- ;
- EqualityExpr
- : RelationalExpr
- | EqualityExpr EQ RelationalExpr
- {
- $$ = new ExprEQ ((Expression) $1, (Expression) $3);
- }
- | EqualityExpr NE RelationalExpr
- {
- $$ = new ExprNE ((Expression) $1, (Expression) $3);
- }
- ;
- RelationalExpr
- : AdditiveExpr
- | RelationalExpr LT AdditiveExpr
- {
- $$ = new ExprLT ((Expression) $1, (Expression) $3);
- }
- | RelationalExpr GT AdditiveExpr
- {
- $$ = new ExprGT ((Expression) $1, (Expression) $3);
- }
- | RelationalExpr LE AdditiveExpr
- {
- $$ = new ExprLE ((Expression) $1, (Expression) $3);
- }
- | RelationalExpr GE AdditiveExpr
- {
- $$ = new ExprGE ((Expression) $1, (Expression) $3);
- }
- ;
- AdditiveExpr
- : MultiplicativeExpr
- | AdditiveExpr PLUS MultiplicativeExpr
- {
- $$ = new ExprPLUS ((Expression) $1, (Expression) $3);
- }
- | AdditiveExpr MINUS MultiplicativeExpr
- {
- $$ = new ExprMINUS ((Expression) $1, (Expression) $3);
- }
- ;
- MultiplicativeExpr
- : UnaryExpr
- | MultiplicativeExpr MULTIPLY UnaryExpr
- {
- $$ = new ExprMULT ((Expression) $1, (Expression) $3);
- }
- | MultiplicativeExpr DIV UnaryExpr
- {
- $$ = new ExprDIV ((Expression) $1, (Expression) $3);
- }
- | MultiplicativeExpr MOD UnaryExpr
- {
- $$ = new ExprMOD ((Expression) $1, (Expression) $3);
- }
- ;
- UnaryExpr
- : UnionExpr
- | MINUS UnaryExpr
- {
- $$ = new ExprNEG ((Expression) $2);
- }
- ;
- UnionExpr
- : PathExpr
- | UnionExpr BAR PathExpr
- {
- $$ = new ExprUNION ((NodeSet) $1, (NodeSet) $3);
- }
- ;
- PathExpr
- : RelativeLocationPath
- | SLASH
- {
- $$ = new ExprRoot ();
- }
- | SLASH RelativeLocationPath
- {
- $$ = new ExprSLASH (new ExprRoot (), (NodeSet) $2);
- }
- | SLASH2 RelativeLocationPath
- {
- ExprStep exprStep = new ExprStep (new NodeTypeTest (Axes.DescendantOrSelf, XPathNodeType.All));
- $$ = new ExprSLASH (new ExprSLASH (new ExprRoot (), exprStep), (NodeSet) $2);
- }
- | FilterExpr
- | FilterExpr SLASH RelativeLocationPath
- {
- $$ = new ExprSLASH ((Expression) $1, (NodeSet) $3);
- }
- | FilterExpr SLASH2 RelativeLocationPath
- {
- ExprStep exprStep = new ExprStep (new NodeTypeTest (Axes.DescendantOrSelf, XPathNodeType.All));
- $$ = new ExprSLASH (new ExprSLASH ((Expression) $1, exprStep), (NodeSet) $3);
- }
- ;
- RelativeLocationPath
- : Step
- | RelativeLocationPath SLASH Step
- {
- $$ = new ExprSLASH ((Expression) $1, (NodeSet) $3);
- }
- | RelativeLocationPath SLASH2 Step
- {
- ExprStep exprStep = new ExprStep (new NodeTypeTest (Axes.DescendantOrSelf, XPathNodeType.All));
- $$ = new ExprSLASH (new ExprSLASH ((Expression) $1, exprStep), (NodeSet) $3);
- }
- ;
- Step
- : AxisSpecifier QName ZeroOrMorePredicates
- {
- $$ = new ExprStep (new NodeNameTest ((Axes) $1, (QName) $2), (ExprPredicates) $3);
- }
- | AxisSpecifier ASTERISK ZeroOrMorePredicates
- {
- $$ = new ExprStep (new NodeTypeTest ((Axes) $1), (ExprPredicates) $3);
- }
- | AxisSpecifier NodeType PAREN_OPEN OptionalLiteral PAREN_CLOSE ZeroOrMorePredicates
- {
- $$ = new ExprStep (new NodeTypeTest ((Axes) $1, (XPathNodeType) $2, (String) $4), (ExprPredicates) $6);
- }
- | DOT
- {
- $$ = new ExprStep (new NodeTypeTest (Axes.Self, XPathNodeType.All));
- }
- | DOT2
- {
- $$ = new ExprStep (new NodeTypeTest (Axes.Parent, XPathNodeType.All));
- }
- ;
- AxisSpecifier
- : /* empty */
- {
- $$ = Axes.Child;
- }
- | AT
- {
- $$ = Axes.Attribute;
- }
- | AxisName COLON2
- {
- $$ = $1;
- }
- ;
- NodeType
- : COMMENT { $$ = XPathNodeType.Comment; }
- | TEXT { $$ = XPathNodeType.Text; }
- | PROCESSING_INSTRUCTION { $$ = XPathNodeType.ProcessingInstruction; }
- | NODE { $$ = XPathNodeType.All; }
- ;
- FilterExpr
- : PrimaryExpr
- | FilterExpr Predicate
- {
- $$ = new ExprFilter ((Expression) $1, (Expression) $2);
- }
- ;
- PrimaryExpr
- : DOLLAR QName
- {
- $$ = new ExprVariable ((QName) $2);
- }
- | PAREN_OPEN Expr PAREN_CLOSE
- {
- $$ = $2;
- }
- | LITERAL
- {
- $$ = new ExprLiteral ((String) $1);
- }
- | NUMBER
- {
- $$ = new ExprNumber ((double) $1);
- }
- | FunctionCall
- ;
- FunctionCall
- : FUNCTION_NAME PAREN_OPEN OptionalArgumentList PAREN_CLOSE
- {
- $$ = new ExprFunctionCall ((String) $1, (FunctionArguments) $3);
- }
- ;
- OptionalArgumentList
- : /* empty */
- | Expr OptionalArgumentListTail
- {
- $$ = new FunctionArguments ((Expression) $1, (FunctionArguments) $2);
- }
- ;
- OptionalArgumentListTail
- : /* empty */
- | COMMA Expr OptionalArgumentListTail
- {
- $$ = new FunctionArguments ((Expression) $2, (FunctionArguments) $3);
- }
- ;
- ZeroOrMorePredicates
- : /* empty */
- | Predicate ZeroOrMorePredicates
- {
- $$ = new ExprPredicates ((Expression) $1, (ExprPredicates) $2);
- }
- ;
- Predicate
- : BRACKET_OPEN Expr BRACKET_CLOSE
- {
- $$ = $2;
- }
- ;
- AxisName
- : ANCESTOR { $$ = Axes.Ancestor; }
- | ANCESTOR_OR_SELF { $$ = Axes.AncestorOrSelf; }
- | ATTRIBUTE { $$ = Axes.Attribute; }
- | CHILD { $$ = Axes.Child; }
- | DESCENDANT { $$ = Axes.Descendant; }
- | DESCENDANT_OR_SELF { $$ = Axes.DescendantOrSelf; }
- | FOLLOWING { $$ = Axes.Following; }
- | FOLLOWING_SIBLING { $$ = Axes.FollowingSibling; }
- | NAMESPACE { $$ = Axes.Namespace; }
- | PARENT { $$ = Axes.Parent; }
- | PRECEDING { $$ = Axes.Preceding; }
- | PRECEDING_SIBLING { $$ = Axes.PrecedingSibling; }
- | SELF { $$ = Axes.Self; }
- ;
- OptionalLiteral
- : /* empty */
- | LITERAL
- ;
- QName
- : NCName
- {
- $$ = new NCName ((String) $1);
- }
- | NCName COLON ASTERISK
- {
- $$ = new QName ((String) $1, null);
- }
- | NCName COLON NCName
- {
- $$ = new QName ((String) $1, (String) $3);
- }
- ;
- %%
- }
|