15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright 2005 Maksim Orlovich <maksim@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Computer, Inc.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
1502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathParser.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XPathGrammar.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathEvaluator.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathNSResolver.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathPath.h"
37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "wtf/StdLibExtras.h"
38e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "wtf/text/StringHash.h"
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace Unicode;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace XPath;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Parser* Parser::currentParser = 0;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum XMLCat { NameStart, NameCont, NotPartOfName };
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<String, Step::Axis> AxisNamesMap;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static XMLCat charCat(UChar aChar)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // might need to add some special cases from the XML spec.
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (aChar == '_')
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NameStart;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (aChar == '.' || aChar == '-')
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NameCont;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CharCategory category = Unicode::category(aChar);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (category & (Letter_Uppercase | Letter_Lowercase | Letter_Other | Letter_Titlecase | Number_Letter))
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NameStart;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (category & (Mark_NonSpacing | Mark_SpacingCombining | Mark_Enclosing | Letter_Modifier | Number_DecimalDigit))
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NameCont;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return NotPartOfName;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void setUpAxisNamesMap(AxisNamesMap& axisNames)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct AxisName {
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const char* name;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Step::Axis axis;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AxisName axisNameList[] = {
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "ancestor", Step::AncestorAxis },
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "ancestor-or-self", Step::AncestorOrSelfAxis },
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "attribute", Step::AttributeAxis },
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "child", Step::ChildAxis },
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "descendant", Step::DescendantAxis },
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "descendant-or-self", Step::DescendantOrSelfAxis },
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "following", Step::FollowingAxis },
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "following-sibling", Step::FollowingSiblingAxis },
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "namespace", Step::NamespaceAxis },
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "parent", Step::ParentAxis },
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "preceding", Step::PrecedingAxis },
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "preceding-sibling", Step::PrecedingSiblingAxis },
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        { "self", Step::SelfAxis }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < sizeof(axisNameList) / sizeof(axisNameList[0]); ++i)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        axisNames.set(axisNameList[i].name, axisNameList[i].axis);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isAxisName(const String& name, Step::Axis& type)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AxisNamesMap, axisNames, ());
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (axisNames.isEmpty())
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setUpAxisNamesMap(axisNames);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AxisNamesMap::iterator it = axisNames.find(name);
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (it == axisNames.end())
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = it->value;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isNodeTypeName(const String& name)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(HashSet<String>, nodeTypeNames, ());
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (nodeTypeNames.isEmpty()) {
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        nodeTypeNames.add("comment");
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        nodeTypeNames.add("text");
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        nodeTypeNames.add("processing-instruction");
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        nodeTypeNames.add("node");
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return nodeTypeNames.contains(name);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns whether the current token can possibly be a binary operator, given
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the previous token. Necessary to disambiguate some of the operators
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (* (multiply), div, and, or, mod) in the [32] Operator rule
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (check http://www.w3.org/TR/xpath#exprlex).
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Parser::isBinaryOperatorContext() const
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_lastTokenType) {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 0:
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '@': case AXISNAME: case '(': case '[': case ',':
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case AND: case OR: case MULOP:
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '/': case SLASHSLASH: case '|': case PLUS: case MINUS:
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case EQOP: case RELOP:
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::skipWS()
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (m_nextPos < m_data.length() && isSpaceOrNewline(m_data[m_nextPos]))
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++m_nextPos;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::makeTokenAndAdvance(int code, int advance)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nextPos += advance;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Token(code);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::makeTokenAndAdvance(int code, NumericOp::Opcode val, int advance)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nextPos += advance;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Token(code, val);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::makeTokenAndAdvance(int code, EqTestOp::Opcode val, int advance)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nextPos += advance;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Token(code, val);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns next char if it's there and interesting, 0 otherwise
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)char Parser::peekAheadHelper()
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nextPos + 1 >= m_data.length())
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar next = m_data[m_nextPos + 1];
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (next >= 0xff)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return next;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)char Parser::peekCurHelper()
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nextPos >= m_data.length())
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar next = m_data[m_nextPos];
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (next >= 0xff)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return next;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::lexString()
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar delimiter = m_data[m_nextPos];
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int startPos = m_nextPos + 1;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (m_nextPos = startPos; m_nextPos < m_data.length(); ++m_nextPos) {
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_data[m_nextPos] == delimiter) {
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            String value = m_data.substring(startPos, m_nextPos - startPos);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (value.isNull())
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                value = "";
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ++m_nextPos; // Consume the char.
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(LITERAL, value);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ouch, went off the end -- report error.
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Token(XPATH_ERROR);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::lexNumber()
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int startPos = m_nextPos;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool seenDot = false;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Go until end or a non-digits character.
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (; m_nextPos < m_data.length(); ++m_nextPos) {
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UChar aChar = m_data[m_nextPos];
2095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (aChar >= 0xff)
2105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            break;
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (aChar < '0' || aChar > '9') {
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (aChar == '.' && !seenDot)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                seenDot = true;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Token(NUMBER, m_data.substring(startPos, m_nextPos - startPos));
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Parser::lexNCName(String& name)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int startPos = m_nextPos;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nextPos >= m_data.length())
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (charCat(m_data[m_nextPos]) != NameStart)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Keep going until we get a character that's not good for names.
2335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (; m_nextPos < m_data.length(); ++m_nextPos) {
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (charCat(m_data[m_nextPos]) == NotPartOfName)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    name = m_data.substring(startPos, m_nextPos - startPos);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Parser::lexQName(String& name)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String n1;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!lexNCName(n1))
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    skipWS();
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the next character is :, what we just got it the prefix, if not,
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it's the whole thing.
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (peekAheadHelper() != ':') {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        name = n1;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String n2;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!lexNCName(n2))
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    name = n1 + ":" + n2;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::nextTokenInternal()
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    skipWS();
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nextPos >= m_data.length())
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Token(0);
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char code = peekCurHelper();
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (code) {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '(': case ')': case '[': case ']':
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '@': case ',': case '|':
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return makeTokenAndAdvance(code);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '\'':
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '\"':
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lexString();
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '0': case '1': case '2': case '3': case '4':
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '5': case '6': case '7': case '8': case '9':
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lexNumber();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '.': {
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char next = peekAheadHelper();
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (next == '.')
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return makeTokenAndAdvance(DOTDOT, 2);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (next >= '0' && next <= '9')
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return lexNumber();
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return makeTokenAndAdvance('.');
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '/':
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (peekAheadHelper() == '/')
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return makeTokenAndAdvance(SLASHSLASH, 2);
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return makeTokenAndAdvance('/');
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '+':
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return makeTokenAndAdvance(PLUS);
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '-':
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return makeTokenAndAdvance(MINUS);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '=':
3005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return makeTokenAndAdvance(EQOP, EqTestOp::OpcodeEqual);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '!':
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (peekAheadHelper() == '=')
3035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return makeTokenAndAdvance(EQOP, EqTestOp::OpcodeNotEqual, 2);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Token(XPATH_ERROR);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '<':
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (peekAheadHelper() == '=')
3075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeLessOrEqual, 2);
3085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeLessThan);
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '>':
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (peekAheadHelper() == '=')
3115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeGreaterOrEqual, 2);
3125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeGreaterThan);
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '*':
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isBinaryOperatorContext())
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return makeTokenAndAdvance(MULOP, NumericOp::OP_Mul);
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++m_nextPos;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Token(NAMETEST, "*");
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case '$': { // $ QName
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_nextPos++;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String name;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!lexQName(name))
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(XPATH_ERROR);
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Token(VARIABLEREFERENCE, name);
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String name;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!lexNCName(name))
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Token(XPATH_ERROR);
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    skipWS();
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we're in an operator context, check for any operator names
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isBinaryOperatorContext()) {
3345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (name == "and") // ### hash?
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(AND);
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (name == "or")
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(OR);
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (name == "mod")
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(MULOP, NumericOp::OP_Mod);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (name == "div")
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(MULOP, NumericOp::OP_Div);
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // See whether we are at a :
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (peekCurHelper() == ':') {
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_nextPos++;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Any chance it's an axis name?
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (peekCurHelper() == ':') {
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_nextPos++;
35002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            // It might be an axis name.
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Step::Axis axis;
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (isAxisName(name, axis))
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return Token(AXISNAME, axis);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Ugh, :: is only valid in axis names -> error
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(XPATH_ERROR);
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // Seems like this is a fully qualified qname, or perhaps the * modified
3605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // one from NameTest
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        skipWS();
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (peekCurHelper() == '*') {
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_nextPos++;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(NAMETEST, name + ":*");
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
36602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make a full qname.
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String n2;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!lexNCName(n2))
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(XPATH_ERROR);
37102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        name = name + ":" + n2;
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    skipWS();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (peekCurHelper() == '(') {
3775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // Note: we don't swallow the ( here!
37802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // Either node type of function name
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isNodeTypeName(name)) {
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (name == "processing-instruction")
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return Token(PI, name);
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Token(NODETYPE, name);
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // Must be a function name.
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Token(FUNCTIONNAME, name);
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // At this point, it must be NAMETEST.
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Token(NAMETEST, name);
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::nextToken()
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Token toRet = nextTokenInternal();
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastTokenType = toRet.type;
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return toRet;
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Parser::Parser()
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset(String());
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Parser::~Parser()
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::reset(const String& data)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nextPos = 0;
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_data = data;
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastTokenType = 0;
41502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
416d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_topExpr = nullptr;
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_gotNamespaceError = false;
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int Parser::lex(void* data)
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    YYSTYPE* yylval = static_cast<YYSTYPE*>(data);
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Token tok = nextToken();
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (tok.type) {
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case AXISNAME:
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        yylval->axis = tok.axis;
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MULOP:
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        yylval->numop = tok.numop;
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RELOP:
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case EQOP:
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        yylval->eqop = tok.eqop;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NODETYPE:
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PI:
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FUNCTIONNAME:
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LITERAL:
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case VARIABLEREFERENCE:
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NUMBER:
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NAMETEST:
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        yylval->str = new String(tok.str);
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        registerString(yylval->str);
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return tok.type;
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
451a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool Parser::expandQName(const String& qName, AtomicString& localName, AtomicString& namespaceURI)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t colon = qName.find(':');
45406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (colon != kNotFound) {
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_resolver)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        namespaceURI = m_resolver->lookupNamespaceURI(qName.left(colon));
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (namespaceURI.isNull())
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
460a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        localName = AtomicString(qName.substring(colon + 1));
461a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    } else {
462a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        localName = AtomicString(qName);
463a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
46402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
468d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassOwnPtrWillBeRawPtr<Expression> Parser::parseStatement(const String& statement, PassRefPtrWillBeRawPtr<XPathNSResolver> resolver, ExceptionState& exceptionState)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reset(statement);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_resolver = resolver;
47302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Parser* oldParser = currentParser;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    currentParser = this;
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int parseError = xpathyyparse(this);
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    currentParser = oldParser;
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parseError) {
480d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
481d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        while (!m_parseNodes.isEmpty())
482d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            delete m_parseNodes.takeAny();
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
484bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        HashSet<Vector<OwnPtr<Predicate> >*>::iterator pend = m_predicateVectors.end();
485bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        for (HashSet<Vector<OwnPtr<Predicate> >*>::iterator it = m_predicateVectors.begin(); it != pend; ++it)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete *it;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_predicateVectors.clear();
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
489bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        HashSet<Vector<OwnPtr<Expression> >*>::iterator eend = m_expressionVectors.end();
490bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        for (HashSet<Vector<OwnPtr<Expression> >*>::iterator it = m_expressionVectors.begin(); it != eend; ++it)
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete *it;
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_expressionVectors.clear();
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_nodeTests.clear();
495d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
497d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_strings.clear();
498d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
499d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_topExpr = nullptr;
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_gotNamespaceError)
502a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            exceptionState.throwDOMException(NamespaceError, "The string '" + statement + "' contains unresolvable namespaces.");
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
504a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            exceptionState.throwDOMException(SyntaxError, "The string '" + statement + "' is not a valid XPath expression.");
505d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return nullptr;
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
507d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT(m_strings.size() == 0);
508d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_parseNodes.size() == 1);
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(*m_parseNodes.begin() == m_topExpr);
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_expressionVectors.size() == 0);
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_predicateVectors.size() == 0);
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_nodeTests.size() == 0);
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parseNodes.clear();
515d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
516d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Expression* result = m_topExpr;
518d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_topExpr = nullptr;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
520d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return adoptPtrWillBeNoop(result);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::registerParseNode(ParseNode* node)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
525d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node == 0)
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
52802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_parseNodes.contains(node));
53002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parseNodes.add(node);
532d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::unregisterParseNode(ParseNode* node)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
537d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node == 0)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
54002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_parseNodes.contains(node));
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parseNodes.remove(node);
544d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
547d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::registerPredicateVector(WillBeHeapVector<OwnPtrWillBeMember<Predicate> >* vector)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
549d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (vector == 0)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_predicateVectors.contains(vector));
55402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_predicateVectors.add(vector);
556d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
559d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::deletePredicateVector(WillBeHeapVector<OwnPtrWillBeMember<Predicate> >* vector)
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
561d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (vector == 0)
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_predicateVectors.contains(vector));
56602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_predicateVectors.remove(vector);
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete vector;
569d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
573d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::registerExpressionVector(WillBeHeapVector<OwnPtrWillBeMember<Expression> >* vector)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
575d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (vector == 0)
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_expressionVectors.contains(vector));
58002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
58102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    m_expressionVectors.add(vector);
582d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::deleteExpressionVector(WillBeHeapVector<OwnPtrWillBeMember<Expression> >* vector)
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
587d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (vector == 0)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_expressionVectors.contains(vector));
59202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_expressionVectors.remove(vector);
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete vector;
595d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::registerString(String* s)
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (s == 0)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
60202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_strings.contains(s));
60402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
605f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_strings.add(adoptPtr(s));
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::deleteString(String* s)
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (s == 0)
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
61202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_strings.contains(s));
61402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_strings.remove(s);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::registerNodeTest(Step::NodeTest* t)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
620d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (t == 0)
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
62302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_nodeTests.contains(t));
62502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
626f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_nodeTests.add(adoptPtr(t));
627d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::deleteNodeTest(Step::NodeTest* t)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
632d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (t == 0)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
63502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_nodeTests.contains(t));
63702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeTests.remove(t);
639d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
642