XPathParser parser = new XPathParser(errorListener, locator); Compiler compiler = new Compiler(errorListener, locator, m_funcTable); parser.initXPath(compiler, exprString, prefixResolver); else if (MATCH == type) parser.initMatchPattern(compiler, exprString, prefixResolver); else throw new RuntimeException(XSLMessages.createXPATHMessage(
/** * * StepPattern ::= AbbreviatedNodeTestStep * * @param isLeadingSlashPermitted a boolean indicating whether a slash can * appear at the start of this step * * @return boolean indicating whether a slash following the step was consumed * * @throws javax.xml.transform.TransformerException */ protected boolean StepPattern(boolean isLeadingSlashPermitted) throws javax.xml.transform.TransformerException { return AbbreviatedNodeTestStep(isLeadingSlashPermitted); }
addPos = opPos; MultiplicativeExpr(-1); if (tokenIs('+')) nextToken(); insertOp(addPos, 2, OpCodes.OP_PLUS); addPos = AdditiveExpr(addPos); m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen); addPos += 2; else if (tokenIs('-')) nextToken(); insertOp(addPos, 2, OpCodes.OP_MINUS); addPos = AdditiveExpr(addPos); m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);
/** * * * AndExpr ::= EqualityExpr * | AndExpr 'and' EqualityExpr * * * @throws javax.xml.transform.TransformerException */ protected void AndExpr() throws javax.xml.transform.TransformerException { int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH); EqualityExpr(-1); if ((null != m_token) && tokenIs("and")) { nextToken(); insertOp(opPos, 2, OpCodes.OP_AND); AndExpr(); m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos); } }
/** * * * OrExpr ::= AndExpr * | OrExpr 'or' AndExpr * * * @throws javax.xml.transform.TransformerException */ protected void OrExpr() throws javax.xml.transform.TransformerException { int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH); AndExpr(); if ((null != m_token) && tokenIs("or")) { nextToken(); insertOp(opPos, 2, OpCodes.OP_OR); OrExpr(); m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos); } }
if (lookahead(':', 1)) appendOp(4, OpCodes.OP_EXTFUNCTION); nextToken(); consumeExpected(':'); nextToken(); int funcTok = getFunctionToken(m_token); error(XPATHErrorResources.ER_COULDNOT_FIND_FUNCTION, new Object[]{ m_token }); //"Could not find function: "+m_token+"()"); appendOp(3, OpCodes.OP_FUNCTION); nextToken(); consumeExpected('('); while (!tokenIs(')') && m_token != null) if (tokenIs(',')) error(XPATHErrorResources.ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG, null); //"Found ',' but no preceding argument!"); Argument(); if (!tokenIs(')'))
boolean doubleSlash = tokenIs('/'); nextToken(); appendOp(2, OpCodes.FROM_DESCENDANTS_OR_SELF); if (tokenIs(".")) nextToken(); if (tokenIs('[')) error(XPATHErrorResources.ER_PREDICATE_ILLEGAL_SYNTAX, null); //"'..[predicate]' or '.[predicate]' is illegal syntax. Use 'self::node()[predicate]' instead."); appendOp(4, OpCodes.FROM_SELF); else if (tokenIs("..")) nextToken(); appendOp(4, OpCodes.FROM_PARENT); else if (tokenIs('*') || tokenIs('@') || tokenIs('_') || (m_token!= null && Character.isLetter(m_token.charAt(0)))) Basis(); while (tokenIs('[')) Predicate();
appendOp(2, OpCodes.OP_LITERAL); Literal(); nextToken(); // consume '$' appendOp(2, OpCodes.OP_VARIABLE); QName(); nextToken(); appendOp(2, OpCodes.OP_GROUP); Expr(); consumeExpected(')'); m_token.charAt(1))) || Character.isDigit(m_tokenChar))) appendOp(2, OpCodes.OP_NUMBERLIT); Number(); else if (lookahead('(', 1) || (lookahead(':', 1) && lookahead('(', 3))) matchFound = FunctionCall();
addPos = opPos; RelationalExpr(-1); if (tokenIs('!') && lookahead('=', 1)) nextToken(); nextToken(); insertOp(addPos, 2, OpCodes.OP_NOTEQUALS); addPos = EqualityExpr(addPos); m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen); addPos += 2; else if (tokenIs('=')) nextToken(); insertOp(addPos, 2, OpCodes.OP_EQUALS); addPos = EqualityExpr(addPos); m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);
AdditiveExpr(-1); if (tokenIs('<')) nextToken(); if (tokenIs('=')) nextToken(); insertOp(addPos, 2, OpCodes.OP_LTE); insertOp(addPos, 2, OpCodes.OP_LT); addPos = RelationalExpr(addPos); m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen); addPos += 2; else if (tokenIs('>')) nextToken(); if (tokenIs('=')) nextToken(); insertOp(addPos, 2, OpCodes.OP_GTE); insertOp(addPos, 2, OpCodes.OP_GT);
/** * Constructor. * @param exprString the XPath expression * @param locator the location of the expression, may be {@code null} * @param prefixResolver a prefix resolver to use to resolve prefixes to namespace URIs * @param errorListener the error listener, or {@code null} if default should be used * @param caseSensitive whether or not the XPath expression should be case-sensitive * @param attributeCaseSensitive whether or not the attributes should be case-sensitive * @throws TransformerException if a syntax or other error occurs */ XPathAdapter(String exprString, final SourceLocator locator, final PrefixResolver prefixResolver, ErrorListener errorListener, final boolean caseSensitive, final boolean attributeCaseSensitive) throws TransformerException { initFunctionTable(); if (errorListener == null) { errorListener = new DefaultErrorHandler(); } exprString = preProcessXPath(exprString, caseSensitive, attributeCaseSensitive); final XPathParser parser = new XPathParser(errorListener, locator); final Compiler compiler = new Compiler(errorListener, locator, funcTable_); parser.initXPath(compiler, exprString, prefixResolver); final Expression expr = compiler.compile(0); mainExp_ = expr; if (locator instanceof ExpressionNode) { expr.exprSetParent((ExpressionNode) locator); } }
/** * * StringExpr ::= Expr * * * @throws javax.xml.transform.TransformerException */ protected void StringExpr() throws javax.xml.transform.TransformerException { int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH); appendOp(2, OpCodes.OP_STRING); Expr(); m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos); }
/** * * * StringExpr ::= Expr * * * @throws javax.xml.transform.TransformerException */ protected void BooleanExpr() throws javax.xml.transform.TransformerException { int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH); appendOp(2, OpCodes.OP_BOOL); Expr(); int opLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos; if (opLen == 2) { error(XPATHErrorResources.ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL, null); //"boolean(...) argument is no longer optional with 19990709 XPath draft."); } m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH, opLen); }
if (lookahead(':', 1)) appendOp(4, OpCodes.OP_EXTFUNCTION); nextToken(); consumeExpected(':'); nextToken(); int funcTok = getFunctionToken(m_token); error(XPATHErrorResources.ER_COULDNOT_FIND_FUNCTION, new Object[]{ m_token }); //"Could not find function: "+m_token+"()"); appendOp(3, OpCodes.OP_FUNCTION); nextToken(); consumeExpected('('); while (!tokenIs(')') && m_token != null) if (tokenIs(',')) error(XPATHErrorResources.ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG, null); //"Found ',' but no preceding argument!"); Argument(); if (!tokenIs(')'))
boolean doubleSlash = tokenIs('/'); nextToken(); appendOp(2, OpCodes.FROM_DESCENDANTS_OR_SELF); if (tokenIs(".")) nextToken(); if (tokenIs('[')) error(XPATHErrorResources.ER_PREDICATE_ILLEGAL_SYNTAX, null); //"'..[predicate]' or '.[predicate]' is illegal syntax. Use 'self::node()[predicate]' instead."); appendOp(4, OpCodes.FROM_SELF); else if (tokenIs("..")) nextToken(); appendOp(4, OpCodes.FROM_PARENT); else if (tokenIs('*') || tokenIs('@') || tokenIs('_') || (m_token!= null && Character.isLetter(m_token.charAt(0)))) Basis(); while (tokenIs('[')) Predicate();
/** * * * AndExpr ::= EqualityExpr * | AndExpr 'and' EqualityExpr * * * @throws javax.xml.transform.TransformerException */ protected void AndExpr() throws javax.xml.transform.TransformerException { int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH); EqualityExpr(-1); if ((null != m_token) && tokenIs("and")) { nextToken(); insertOp(opPos, 2, OpCodes.OP_AND); AndExpr(); m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos); } }
/** * * * OrExpr ::= AndExpr * | OrExpr 'or' AndExpr * * * @throws javax.xml.transform.TransformerException */ protected void OrExpr() throws javax.xml.transform.TransformerException { int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH); AndExpr(); if ((null != m_token) && tokenIs("or")) { nextToken(); insertOp(opPos, 2, OpCodes.OP_OR); OrExpr(); m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos); } }