2 * Copyright 2005 Frerich Raabe <raabe@kde.org>
3 * Copyright (C) 2006 Apple Inc. All rights reserved.
4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include "XPathFunctions.h"
35 #include "XPathNSResolver.h"
36 #include "XPathParser.h"
37 #include "XPathPath.h"
38 #include "XPathPredicate.h"
39 #include "XPathVariableReference.h"
40 #include <wtf/FastMalloc.h>
42 #define YYMALLOC fastMalloc
43 #define YYFREE fastFree
45 #define YYENABLE_NLS 0
46 #define YYLTYPE_IS_TRIVIAL 1
48 #define YYMAXDEPTH 10000
49 #define YYPARSE_PARAM parserParameter
50 #define PARSER static_cast<Parser*>(parserParameter)
52 using namespace WebCore;
53 using namespace XPath;
62 Step::NodeTest* nodeTest;
63 NumericOp::Opcode numop;
64 EqTestOp::Opcode eqop;
67 Vector<Predicate*>* predList;
68 Vector<Expression*>* argList;
70 LocationPath* locationPath;
75 static int xpathyylex(YYSTYPE* yylval) { return Parser::current()->lex(yylval); }
76 static void xpathyyerror(const char*) { }
81 %left <eqop> EQOP RELOP
84 %token <axis> AXISNAME
85 %token <str> NODETYPE PI FUNCTIONNAME LITERAL
86 %token <str> VARIABLEREFERENCE NUMBER
87 %token DOTDOT SLASHSLASH
91 %type <locationPath> LocationPath
92 %type <locationPath> AbsoluteLocationPath
93 %type <locationPath> RelativeLocationPath
95 %type <axis> AxisSpecifier
96 %type <step> DescendantOrSelf
97 %type <nodeTest> NodeTest
98 %type <expr> Predicate
99 %type <predList> OptionalPredicateList
100 %type <predList> PredicateList
101 %type <step> AbbreviatedStep
103 %type <expr> PrimaryExpr
104 %type <expr> FunctionCall
105 %type <argList> ArgumentList
106 %type <expr> Argument
107 %type <expr> UnionExpr
108 %type <expr> PathExpr
109 %type <expr> FilterExpr
112 %type <expr> EqualityExpr
113 %type <expr> RelationalExpr
114 %type <expr> AdditiveExpr
115 %type <expr> MultiplicativeExpr
116 %type <expr> UnaryExpr
123 PARSER->m_topExpr = $1;
130 $$->setAbsolute(false);
135 $$->setAbsolute(true);
139 AbsoluteLocationPath:
142 $$ = new LocationPath;
143 PARSER->registerParseNode($$);
146 '/' RelativeLocationPath
151 DescendantOrSelf RelativeLocationPath
154 $$->insertFirstStep($1);
155 PARSER->unregisterParseNode($1);
159 RelativeLocationPath:
162 $$ = new LocationPath;
164 PARSER->unregisterParseNode($1);
165 PARSER->registerParseNode($$);
168 RelativeLocationPath '/' Step
171 PARSER->unregisterParseNode($3);
174 RelativeLocationPath DescendantOrSelf Step
178 PARSER->unregisterParseNode($2);
179 PARSER->unregisterParseNode($3);
184 NodeTest OptionalPredicateList
187 $$ = new Step(Step::ChildAxis, *$1, *$2);
188 PARSER->deletePredicateVector($2);
190 $$ = new Step(Step::ChildAxis, *$1);
191 PARSER->deleteNodeTest($1);
192 PARSER->registerParseNode($$);
195 NAMETEST OptionalPredicateList
199 if (!PARSER->expandQName(*$1, localName, namespaceURI)) {
200 PARSER->m_gotNamespaceError = true;
205 $$ = new Step(Step::ChildAxis, Step::NodeTest(Step::NodeTest::NameTest, localName, namespaceURI), *$2);
206 PARSER->deletePredicateVector($2);
208 $$ = new Step(Step::ChildAxis, Step::NodeTest(Step::NodeTest::NameTest, localName, namespaceURI));
209 PARSER->deleteString($1);
210 PARSER->registerParseNode($$);
213 AxisSpecifier NodeTest OptionalPredicateList
216 $$ = new Step($1, *$2, *$3);
217 PARSER->deletePredicateVector($3);
219 $$ = new Step($1, *$2);
220 PARSER->deleteNodeTest($2);
221 PARSER->registerParseNode($$);
224 AxisSpecifier NAMETEST OptionalPredicateList
228 if (!PARSER->expandQName(*$2, localName, namespaceURI)) {
229 PARSER->m_gotNamespaceError = true;
234 $$ = new Step($1, Step::NodeTest(Step::NodeTest::NameTest, localName, namespaceURI), *$3);
235 PARSER->deletePredicateVector($3);
237 $$ = new Step($1, Step::NodeTest(Step::NodeTest::NameTest, localName, namespaceURI));
238 PARSER->deleteString($2);
239 PARSER->registerParseNode($$);
250 $$ = Step::AttributeAxis;
258 $$ = new Step::NodeTest(Step::NodeTest::AnyNodeTest);
259 else if (*$1 == "text")
260 $$ = new Step::NodeTest(Step::NodeTest::TextNodeTest);
261 else if (*$1 == "comment")
262 $$ = new Step::NodeTest(Step::NodeTest::CommentNodeTest);
264 PARSER->deleteString($1);
265 PARSER->registerNodeTest($$);
270 $$ = new Step::NodeTest(Step::NodeTest::ProcessingInstructionNodeTest);
271 PARSER->deleteString($1);
272 PARSER->registerNodeTest($$);
277 $$ = new Step::NodeTest(Step::NodeTest::ProcessingInstructionNodeTest, $3->stripWhiteSpace());
278 PARSER->deleteString($1);
279 PARSER->deleteString($3);
280 PARSER->registerNodeTest($$);
284 OptionalPredicateList:
296 $$ = new Vector<Predicate*>;
297 $$->append(new Predicate($1));
298 PARSER->unregisterParseNode($1);
299 PARSER->registerPredicateVector($$);
302 PredicateList Predicate
304 $$->append(new Predicate($2));
305 PARSER->unregisterParseNode($2);
319 $$ = new Step(Step::DescendantOrSelfAxis, Step::NodeTest(Step::NodeTest::AnyNodeTest));
320 PARSER->registerParseNode($$);
327 $$ = new Step(Step::SelfAxis, Step::NodeTest(Step::NodeTest::AnyNodeTest));
328 PARSER->registerParseNode($$);
333 $$ = new Step(Step::ParentAxis, Step::NodeTest(Step::NodeTest::AnyNodeTest));
334 PARSER->registerParseNode($$);
341 $$ = new VariableReference(*$1);
342 PARSER->deleteString($1);
343 PARSER->registerParseNode($$);
353 $$ = new StringExpression(*$1);
354 PARSER->deleteString($1);
355 PARSER->registerParseNode($$);
360 $$ = new Number($1->toDouble());
361 PARSER->deleteString($1);
362 PARSER->registerParseNode($$);
371 $$ = createFunction(*$1);
374 PARSER->deleteString($1);
375 PARSER->registerParseNode($$);
378 FUNCTIONNAME '(' ArgumentList ')'
380 $$ = createFunction(*$1, *$3);
383 PARSER->deleteString($1);
384 PARSER->deleteExpressionVector($3);
385 PARSER->registerParseNode($$);
392 $$ = new Vector<Expression*>;
394 PARSER->unregisterParseNode($1);
395 PARSER->registerExpressionVector($$);
398 ArgumentList ',' Argument
401 PARSER->unregisterParseNode($3);
412 UnionExpr '|' PathExpr
415 $$->addSubExpression($1);
416 $$->addSubExpression($3);
417 PARSER->unregisterParseNode($1);
418 PARSER->unregisterParseNode($3);
419 PARSER->registerParseNode($$);
431 FilterExpr '/' RelativeLocationPath
433 $3->setAbsolute(true);
434 $$ = new Path(static_cast<Filter*>($1), $3);
435 PARSER->unregisterParseNode($1);
436 PARSER->unregisterParseNode($3);
437 PARSER->registerParseNode($$);
440 FilterExpr DescendantOrSelf RelativeLocationPath
442 $3->insertFirstStep($2);
443 $3->setAbsolute(true);
444 $$ = new Path(static_cast<Filter*>($1), $3);
445 PARSER->unregisterParseNode($1);
446 PARSER->unregisterParseNode($2);
447 PARSER->unregisterParseNode($3);
448 PARSER->registerParseNode($$);
455 PrimaryExpr PredicateList
457 $$ = new Filter($1, *$2);
458 PARSER->unregisterParseNode($1);
459 PARSER->deletePredicateVector($2);
460 PARSER->registerParseNode($$);
469 $$ = new LogicalOp(LogicalOp::OP_Or, $1, $3);
470 PARSER->unregisterParseNode($1);
471 PARSER->unregisterParseNode($3);
472 PARSER->registerParseNode($$);
479 AndExpr AND EqualityExpr
481 $$ = new LogicalOp(LogicalOp::OP_And, $1, $3);
482 PARSER->unregisterParseNode($1);
483 PARSER->unregisterParseNode($3);
484 PARSER->registerParseNode($$);
491 EqualityExpr EQOP RelationalExpr
493 $$ = new EqTestOp($2, $1, $3);
494 PARSER->unregisterParseNode($1);
495 PARSER->unregisterParseNode($3);
496 PARSER->registerParseNode($$);
503 RelationalExpr RELOP AdditiveExpr
505 $$ = new EqTestOp($2, $1, $3);
506 PARSER->unregisterParseNode($1);
507 PARSER->unregisterParseNode($3);
508 PARSER->registerParseNode($$);
515 AdditiveExpr PLUS MultiplicativeExpr
517 $$ = new NumericOp(NumericOp::OP_Add, $1, $3);
518 PARSER->unregisterParseNode($1);
519 PARSER->unregisterParseNode($3);
520 PARSER->registerParseNode($$);
523 AdditiveExpr MINUS MultiplicativeExpr
525 $$ = new NumericOp(NumericOp::OP_Sub, $1, $3);
526 PARSER->unregisterParseNode($1);
527 PARSER->unregisterParseNode($3);
528 PARSER->registerParseNode($$);
535 MultiplicativeExpr MULOP UnaryExpr
537 $$ = new NumericOp($2, $1, $3);
538 PARSER->unregisterParseNode($1);
539 PARSER->unregisterParseNode($3);
540 PARSER->registerParseNode($$);
550 $$->addSubExpression($2);
551 PARSER->unregisterParseNode($2);
552 PARSER->registerParseNode($$);