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

📄 xpathparser.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        }        else        {          insertOp(addPos, 2, OpCodes.OP_GT);        }        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        addPos = RelationalExpr(addPos);        m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);        addPos += 2;      }    }    return addPos;  }  /**   * This has to handle construction of the operations so that they are evaluated   * in pre-fix order.  So, for 9+7-6, instead of |+|9|-|7|6|, this needs to be   * evaluated as |-|+|9|7|6|.   *   * AdditiveExpr  ::=  MultiplicativeExpr   * | AdditiveExpr '+' MultiplicativeExpr   * | AdditiveExpr '-' MultiplicativeExpr   *   *   * @param addPos Position where expression is to be added, or -1 for append.   *   * @return the position at the end of the equality expression.   *   * @throws javax.xml.transform.TransformerException   */  protected int AdditiveExpr(int addPos) throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    if (-1 == addPos)      addPos = opPos;    MultiplicativeExpr(-1);    if (null != m_token)    {      if (tokenIs('+'))      {        nextToken();        insertOp(addPos, 2, OpCodes.OP_PLUS);        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        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);        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        addPos = AdditiveExpr(addPos);        m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,           m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);        addPos += 2;      }    }    return addPos;  }  /**   * This has to handle construction of the operations so that they are evaluated   * in pre-fix order.  So, for 9+7-6, instead of |+|9|-|7|6|, this needs to be   * evaluated as |-|+|9|7|6|.   *   * MultiplicativeExpr  ::=  UnaryExpr   * | MultiplicativeExpr MultiplyOperator UnaryExpr   * | MultiplicativeExpr 'div' UnaryExpr   * | MultiplicativeExpr 'mod' UnaryExpr   * | MultiplicativeExpr 'quo' UnaryExpr   *   * @param addPos Position where expression is to be added, or -1 for append.   *   * @return the position at the end of the equality expression.   *   * @throws javax.xml.transform.TransformerException   */  protected int MultiplicativeExpr(int addPos) throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    if (-1 == addPos)      addPos = opPos;    UnaryExpr();    if (null != m_token)    {      if (tokenIs('*'))      {        nextToken();        insertOp(addPos, 2, OpCodes.OP_MULT);        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        addPos = MultiplicativeExpr(addPos);        m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);        addPos += 2;      }      else if (tokenIs("div"))      {        nextToken();        insertOp(addPos, 2, OpCodes.OP_DIV);        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        addPos = MultiplicativeExpr(addPos);        m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);        addPos += 2;      }      else if (tokenIs("mod"))      {        nextToken();        insertOp(addPos, 2, OpCodes.OP_MOD);        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        addPos = MultiplicativeExpr(addPos);        m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);        addPos += 2;      }      else if (tokenIs("quo"))      {        nextToken();        insertOp(addPos, 2, OpCodes.OP_QUO);        int opPlusLeftHandLen = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;        addPos = MultiplicativeExpr(addPos);        m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(addPos + opPlusLeftHandLen + 1) + opPlusLeftHandLen);        addPos += 2;      }    }    return addPos;  }  /**   *   * UnaryExpr  ::=  UnionExpr   * | '-' UnaryExpr   *   *   * @throws javax.xml.transform.TransformerException   */  protected void UnaryExpr() throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    boolean isNeg = false;    if (m_tokenChar == '-')    {      nextToken();      appendOp(2, OpCodes.OP_NEG);      isNeg = true;    }    UnionExpr();    if (isNeg)      m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,        m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);  }  /**   *   * 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);  }  /**   *   *   * NumberExpr  ::=  Expr   *   *   * @throws javax.xml.transform.TransformerException   */  protected void NumberExpr() throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    appendOp(2, OpCodes.OP_NUMBER);    Expr();    m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,      m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);  }  /**   * The context of the right hand side expressions is the context of the   * left hand side expression. The results of the right hand side expressions   * are node sets. The result of the left hand side UnionExpr is the union   * of the results of the right hand side expressions.   *   *   * UnionExpr    ::=    PathExpr   * | UnionExpr '|' PathExpr   *   *   * @throws javax.xml.transform.TransformerException   */  protected void UnionExpr() throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    boolean continueOrLoop = true;    boolean foundUnion = false;    do    {      PathExpr();      if (tokenIs('|'))      {        if (false == foundUnion)        {          foundUnion = true;          insertOp(opPos, 2, OpCodes.OP_UNION);        }        nextToken();      }      else      {        break;      }      // this.m_testForDocOrder = true;    }    while (continueOrLoop);    m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);  }  /**   * PathExpr  ::=  LocationPath   * | FilterExpr   * | FilterExpr '/' RelativeLocationPath   * | FilterExpr '//' RelativeLocationPath   *   * @throws XSLProcessorException thrown if the active ProblemListener and XPathContext decide   * the error condition is severe enough to halt processing.   *   * @throws javax.xml.transform.TransformerException   */  protected void PathExpr() throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    int filterExprMatch = FilterExpr();    if (filterExprMatch != FILTER_MATCH_FAILED)    {      // If FilterExpr had Predicates, a OP_LOCATIONPATH opcode would already      // have been inserted.      boolean locationPathStarted = (filterExprMatch==FILTER_MATCH_PREDICATES);      if (tokenIs('/'))      {        nextToken();        if (!locationPathStarted)        {          // int locationPathOpPos = opPos;          insertOp(opPos, 2, OpCodes.OP_LOCATIONPATH);          locationPathStarted = true;        }        if (!RelativeLocationPath())        {          // "Relative location path expected following '/' or '//'"          error(XPATHErrorResources.ER_EXPECTED_REL_LOC_PATH, null);        }      }      // Terminate for safety.      if (locationPathStarted)      {        m_ops.setOp(m_ops.getOp(OpMap.MAPINDEX_LENGTH), OpCodes.ENDOP);        m_ops.setOp(OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) + 1);        m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,          m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);      }    }    else    {      LocationPath();    }  }  /**   *   *   * FilterExpr  ::=  PrimaryExpr   * | FilterExpr Predicate   *   * @throws XSLProcessorException thrown if the active ProblemListener and XPathContext decide   * the error condition is severe enough to halt processing.   *   * @return  FILTER_MATCH_PREDICATES, if this method successfully matched a   *          FilterExpr with one or more Predicates;   *          FILTER_MATCH_PRIMARY, if this method successfully matched a   *          FilterExpr that was just a PrimaryExpr; or   *          FILTER_MATCH_FAILED, if this method did not match a FilterExpr   *   * @throws javax.xml.transform.TransformerException   */  protected int FilterExpr() throws javax.xml.transform.TransformerException  {    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    int filterMatch;    if (PrimaryExpr())    {      if (tokenIs('['))      {        // int locationPathOpPos = opPos;        insertOp(opPos, 2, OpCodes.OP_LOCATIONPATH);        while (tokenIs('['))        {          Predicate();        }        filterMatch = FILTER_MATCH_PREDICATES;      }      else      {        filterMatch = FILTER_MATCH_PRIMARY;      }    }    else    {      filterMatch = FILTER_MATCH_FAILED;    }    return filterMatch;    /*     * if(tokenIs('['))     * {     *   Predicate();     *   m_ops.m_opMap[opPos + OpMap.MAPINDEX_LENGTH] = m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] - opPos;     * }     */  }  /**   *   * PrimaryExpr  ::=  VariableReference   * | '(' Expr ')'   * | Literal   * | Number   * | FunctionCall   *   * @return true if this method successfully matched a PrimaryExpr   *   * @throws javax.xml.transform.TransformerException   *   */  protected boolean PrimaryExpr() throws javax.xml.transform.TransformerException  {    boolean matchFound;    int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);    if ((m_tokenChar == '\'') || (m_tokenChar == '"'))    {      appendOp(2, OpCodes.OP_LITERAL);      Literal();      m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,         m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);      matchFound = true;    }    else if (m_tokenChar == '$')    {      nextToken();  // consume '$'      appendOp(2, OpCodes.OP_VARIABLE);      QName();            m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,        m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);      matchFound = true;    }    else if (m_tokenChar == '(')    {      nextToken();      appendOp(2, OpCodes.OP_GROUP);      Expr();      consumeExpected(')');      m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,        m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);      matchFound = true;    }    else if ((null != m_token) && ((('.' == m_tokenChar) && (m_token.length() > 1) && Character.isDigit(            m_token.charAt(1))) || Character.isDigit(m_tokenChar)))    {      appendOp(2, OpCodes.OP_NUMBERLIT);      Number();      m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,        m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);      matchFound = true;

⌨️ 快捷键说明

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