📄 xpathparser.cpp
字号:
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 + -