⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpathparser.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            return makeTokenAndAdvance(RELOP, EqTestOp::OP_GT);        case '*':            if (isOperatorContext())                return makeTokenAndAdvance(MULOP, NumericOp::OP_Mul);            ++m_nextPos;            return Token(NAMETEST, "*");        case '$': { // $ QName            m_nextPos++;            String name;            if (!lexQName(name))                return Token(XPATH_ERROR);            return Token(VARIABLEREFERENCE, name);        }    }    String name;    if (!lexNCName(name))        return Token(XPATH_ERROR);    skipWS();    // If we're in an operator context, check for any operator names    if (isOperatorContext()) {        if (name == "and") //### hash?            return Token(AND);        if (name == "or")            return Token(OR);        if (name == "mod")            return Token(MULOP, NumericOp::OP_Mod);        if (name == "div")            return Token(MULOP, NumericOp::OP_Div);    }    // See whether we are at a :    if (peekCurHelper() == ':') {        m_nextPos++;        // Any chance it's an axis name?        if (peekCurHelper() == ':') {            m_nextPos++;                        //It might be an axis name.            Step::Axis axis;            if (isAxisName(name, axis))                return Token(AXISNAME, axis);            // Ugh, :: is only valid in axis names -> error            return Token(XPATH_ERROR);        }        // Seems like this is a fully qualified qname, or perhaps the * modified one from NameTest        skipWS();        if (peekCurHelper() == '*') {            m_nextPos++;            return Token(NAMETEST, name + ":*");        }                // Make a full qname.        String n2;        if (!lexNCName(n2))            return Token(XPATH_ERROR);                name = name + ":" + n2;    }    skipWS();    if (peekCurHelper() == '(') {        //note: we don't swallow the (here!                //either node type of function name        if (isNodeTypeName(name)) {            if (name == "processing-instruction")                return Token(PI, name);            return Token(NODETYPE, name);        }        //must be a function name.        return Token(FUNCTIONNAME, name);    }    // At this point, it must be NAMETEST.    return Token(NAMETEST, name);}Token Parser::nextToken(){    Token toRet = nextTokenInternal();    m_lastTokenType = toRet.type;    return toRet;}Parser::Parser(){    reset(String());}void Parser::reset(const String& data){    m_nextPos = 0;    m_data = data;    m_lastTokenType = 0;        m_topExpr = 0;    m_gotNamespaceError = false;}int Parser::lex(void* data){    YYSTYPE* yylval = static_cast<YYSTYPE*>(data);    Token tok = nextToken();    switch (tok.type) {        case AXISNAME:            yylval->axis = tok.axis;            break;        case MULOP:            yylval->numop = tok.numop;            break;        case RELOP:        case EQOP:            yylval->eqop = tok.eqop;            break;        case NODETYPE:        case PI:        case FUNCTIONNAME:        case LITERAL:        case VARIABLEREFERENCE:        case NUMBER:        case NAMETEST:            yylval->str = new String(tok.str);            registerString(yylval->str);            break;    }    return tok.type;}bool Parser::expandQName(const String& qName, String& localName, String& namespaceURI){    int colon = qName.find(':');    if (colon >= 0) {        if (!m_resolver)            return false;        namespaceURI = m_resolver->lookupNamespaceURI(qName.left(colon));        if (namespaceURI.isNull())            return false;        localName = qName.substring(colon + 1);    } else        localName = qName;        return true;}Expression* Parser::parseStatement(const String& statement, PassRefPtr<XPathNSResolver> resolver, ExceptionCode& ec){    reset(statement);    m_resolver = resolver;        Parser* oldParser = currentParser;    currentParser = this;    int parseError = xpathyyparse(this);    currentParser = oldParser;    if (parseError) {        deleteAllValues(m_parseNodes);        m_parseNodes.clear();        HashSet<Vector<Predicate*>*>::iterator pend = m_predicateVectors.end();        for (HashSet<Vector<Predicate*>*>::iterator it = m_predicateVectors.begin(); it != pend; ++it) {            deleteAllValues(**it);            delete *it;        }        m_predicateVectors.clear();        HashSet<Vector<Expression*>*>::iterator eend = m_expressionVectors.end();        for (HashSet<Vector<Expression*>*>::iterator it = m_expressionVectors.begin(); it != eend; ++it) {            deleteAllValues(**it);            delete *it;        }        m_expressionVectors.clear();        deleteAllValues(m_strings);        m_strings.clear();        deleteAllValues(m_nodeTests);        m_nodeTests.clear();        m_topExpr = 0;        if (m_gotNamespaceError)            ec = NAMESPACE_ERR;        else            ec = XPathException::INVALID_EXPRESSION_ERR;        return 0;    }    ASSERT(m_parseNodes.size() == 1);    ASSERT(*m_parseNodes.begin() == m_topExpr);    ASSERT(m_expressionVectors.size() == 0);    ASSERT(m_predicateVectors.size() == 0);    ASSERT(m_strings.size() == 0);    ASSERT(m_nodeTests.size() == 0);    m_parseNodes.clear();    Expression* result = m_topExpr;    m_topExpr = 0;    return result;}void Parser::registerParseNode(ParseNode* node){    if (node == 0)        return;        ASSERT(!m_parseNodes.contains(node));        m_parseNodes.add(node);}void Parser::unregisterParseNode(ParseNode* node){    if (node == 0)        return;        ASSERT(m_parseNodes.contains(node));    m_parseNodes.remove(node);}void Parser::registerPredicateVector(Vector<Predicate*>* vector){    if (vector == 0)        return;    ASSERT(!m_predicateVectors.contains(vector));        m_predicateVectors.add(vector);}void Parser::deletePredicateVector(Vector<Predicate*>* vector){    if (vector == 0)        return;    ASSERT(m_predicateVectors.contains(vector));        m_predicateVectors.remove(vector);    delete vector;}void Parser::registerExpressionVector(Vector<Expression*>* vector){    if (vector == 0)        return;    ASSERT(!m_expressionVectors.contains(vector));        m_expressionVectors.add(vector);    }void Parser::deleteExpressionVector(Vector<Expression*>* vector){    if (vector == 0)        return;    ASSERT(m_expressionVectors.contains(vector));        m_expressionVectors.remove(vector);    delete vector;}void Parser::registerString(String* s){    if (s == 0)        return;        ASSERT(!m_strings.contains(s));        m_strings.add(s);        }void Parser::deleteString(String* s){    if (s == 0)        return;        ASSERT(m_strings.contains(s));        m_strings.remove(s);    delete s;}void Parser::registerNodeTest(Step::NodeTest* t){    if (t == 0)        return;        ASSERT(!m_nodeTests.contains(t));        m_nodeTests.add(t);        }void Parser::deleteNodeTest(Step::NodeTest* t){    if (t == 0)        return;        ASSERT(m_nodeTests.contains(t));        m_nodeTests.remove(t);    delete t;}}}#endif // ENABLE(XPATH)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -