compiler.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,269 行 · 第 1/3 页

JAVA
1,269
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999 The Apache Software Foundation.  All rights  * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment:   *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xalan" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written  *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, Lotus * Development Corporation., http://www.lotus.com.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package org.apache.xpath.compiler;import org.apache.xpath.operations.And;import org.apache.xpath.operations.Bool;import org.apache.xpath.operations.Div;import org.apache.xpath.operations.Equals;import org.apache.xpath.operations.Gt;import org.apache.xpath.operations.Gte;import org.apache.xpath.operations.Lt;import org.apache.xpath.operations.Lte;import org.apache.xpath.operations.Minus;import org.apache.xpath.operations.Mod;import org.apache.xpath.operations.Mult;import org.apache.xpath.operations.Neg;import org.apache.xpath.operations.NotEquals;import org.apache.xpath.operations.Operation;import org.apache.xpath.operations.Or;import org.apache.xpath.operations.Plus;import org.apache.xpath.operations.UnaryOperation;import org.apache.xpath.operations.Variable;import org.apache.xpath.objects.*;import org.apache.xpath.axes.*;import org.apache.xpath.patterns.*;import org.apache.xpath.functions.Function;import org.apache.xpath.functions.FuncExtFunction;import org.apache.xpath.functions.WrongNumberArgsException;import org.apache.xpath.*;import org.apache.xpath.res.XPATHErrorResources;import org.apache.xalan.res.XSLMessages;import org.apache.xml.utils.QName;import org.apache.xml.utils.PrefixResolver;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.SourceLocator;import org.apache.xml.utils.SAXSourceLocator;import org.apache.xml.dtm.DTMFilter;import org.apache.xml.dtm.DTMIterator;import org.apache.xml.dtm.Axis;import javax.xml.transform.ErrorListener;import javax.xml.transform.TransformerException;/** * <meta name="usage" content="advanced"/> * An instance of this class compiles an XPath string expression into  * a Expression object.  This class compiles the string into a sequence  * of operation codes (op map) and then builds from that into an Expression  * tree. */public class Compiler extends OpMap{  /**   * Construct a Compiler object with a specific ErrorListener and    * SourceLocator where the expression is located.   *   * @param errorHandler Error listener where messages will be sent, or null    *                     if messages should be sent to System err.   * @param locator The location object where the expression lives, which    *                may be null, but which, if not null, must be valid over    *                the long haul, in other words, it will not be cloned.   */  public Compiler(ErrorListener errorHandler, SourceLocator locator)  {    m_errorHandler = errorHandler;    m_locator = locator;  }  /**   * Construct a Compiler instance that has a null error listener and a    * null source locator.   */  public Compiler()  {    m_errorHandler = null;    m_locator = null;  }  /**   * <meta name="usage" content="advanced"/>   * Execute the XPath object from a given opcode position.   * @param xctxt The execution context.   * @param context The current source tree context node.   * @param opPos The current position in the xpath.m_opMap array.   * @param callback Interface that implements the processLocatedNode method.   * @param callbackInfo Object that will be passed to the processLocatedNode method.   * @return The result of the XPath.   *   * @throws TransformerException if there is a syntax or other error.   */  public Expression compile(int opPos) throws TransformerException  {    int op = getOp(opPos);    Expression expr = null;    // System.out.println(getPatternString()+"op: "+op);    switch (op)    {    case OpCodes.OP_XPATH :      expr = compile(opPos + 2); break;    case OpCodes.OP_OR :      expr = or(opPos); break;    case OpCodes.OP_AND :      expr = and(opPos); break;    case OpCodes.OP_NOTEQUALS :      expr = notequals(opPos); break;    case OpCodes.OP_EQUALS :      expr = equals(opPos); break;    case OpCodes.OP_LTE :      expr = lte(opPos); break;    case OpCodes.OP_LT :      expr = lt(opPos); break;    case OpCodes.OP_GTE :      expr = gte(opPos); break;    case OpCodes.OP_GT :      expr = gt(opPos); break;    case OpCodes.OP_PLUS :      expr = plus(opPos); break;    case OpCodes.OP_MINUS :      expr = minus(opPos); break;    case OpCodes.OP_MULT :      expr = mult(opPos); break;    case OpCodes.OP_DIV :      expr = div(opPos); break;    case OpCodes.OP_MOD :      expr = mod(opPos); break;//    case OpCodes.OP_QUO ://      expr = quo(opPos); break;    case OpCodes.OP_NEG :      expr = neg(opPos); break;    case OpCodes.OP_STRING :      expr = string(opPos); break;    case OpCodes.OP_BOOL :      expr = bool(opPos); break;    case OpCodes.OP_NUMBER :      expr = number(opPos); break;    case OpCodes.OP_UNION :      expr = union(opPos); break;    case OpCodes.OP_LITERAL :      expr = literal(opPos); break;    case OpCodes.OP_VARIABLE :      expr = variable(opPos); break;    case OpCodes.OP_GROUP :      expr = group(opPos); break;    case OpCodes.OP_NUMBERLIT :      expr = numberlit(opPos); break;    case OpCodes.OP_ARGUMENT :      expr = arg(opPos); break;    case OpCodes.OP_EXTFUNCTION :      expr = compileExtension(opPos); break;    case OpCodes.OP_FUNCTION :      expr = compileFunction(opPos); break;    case OpCodes.OP_LOCATIONPATH :      expr = locationPath(opPos); break;    case OpCodes.OP_PREDICATE :      expr = null; break;  // should never hit this here.    case OpCodes.OP_MATCHPATTERN :      expr = matchPattern(opPos + 2); break;    case OpCodes.OP_LOCATIONPATHPATTERN :      expr = locationPathPattern(opPos); break;    case OpCodes.OP_QUO:      error(XPATHErrorResources.ER_UNKNOWN_OPCODE,            new Object[]{ "quo" });  //"ERROR! Unknown op code: "+m_opMap[opPos]);      break;    default :      error(XPATHErrorResources.ER_UNKNOWN_OPCODE,            new Object[]{ Integer.toString(getOp(opPos)) });  //"ERROR! Unknown op code: "+m_opMap[opPos]);    }//    if(null != expr)//      expr.setSourceLocator(m_locator);    return expr;  }  /**   * Bottle-neck compilation of an operation with left and right operands.   *   * @param operation non-null reference to parent operation.   * @param opPos The op map position of the parent operation.   *   * @return reference to {@link org.apache.xpath.operations.Operation} instance.   *   * @throws TransformerException if there is a syntax or other error.   */  private Expression compileOperation(Operation operation, int opPos)          throws TransformerException  {    int leftPos = getFirstChildPos(opPos);    int rightPos = getNextOpPos(leftPos);    operation.setLeftRight(compile(leftPos), compile(rightPos));    return operation;  }  /**   * Bottle-neck compilation of a unary operation.   *   * @param unary The parent unary operation.   * @param opPos The position in the op map of the parent operation.   *   * @return The unary argument.   *   * @throws TransformerException if syntax or other error occurs.   */  private Expression compileUnary(UnaryOperation unary, int opPos)          throws TransformerException  {    int rightPos = getFirstChildPos(opPos);    unary.setRight(compile(rightPos));    return unary;  }  /**   * Compile an 'or' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Or} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression or(int opPos) throws TransformerException  {    return compileOperation(new Or(), opPos);  }  /**   * Compile an 'and' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.And} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression and(int opPos) throws TransformerException  {    return compileOperation(new And(), opPos);  }  /**   * Compile a '!=' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.NotEquals} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression notequals(int opPos) throws TransformerException  {    return compileOperation(new NotEquals(), opPos);  }  /**   * Compile a '=' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Equals} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression equals(int opPos) throws TransformerException  {    return compileOperation(new Equals(), opPos);  }  /**   * Compile a '<=' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Lte} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression lte(int opPos) throws TransformerException  {    return compileOperation(new Lte(), opPos);  }  /**   * Compile a '<' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Lt} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression lt(int opPos) throws TransformerException  {    return compileOperation(new Lt(), opPos);  }  /**   * Compile a '>=' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Gte} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression gte(int opPos) throws TransformerException  {    return compileOperation(new Gte(), opPos);  }  /**   * Compile a '>' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Gt} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression gt(int opPos) throws TransformerException  {    return compileOperation(new Gt(), opPos);  }  /**   * Compile a '+' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Plus} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression plus(int opPos) throws TransformerException  {    return compileOperation(new Plus(), opPos);  }  /**   * Compile a '-' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Minus} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression minus(int opPos) throws TransformerException  {    return compileOperation(new Minus(), opPos);  }  /**   * Compile a '*' operation.   *    * @param opPos The current position in the m_opMap array.   *   * @return reference to {@link org.apache.xpath.operations.Mult} instance.   *   * @throws TransformerException if a error occurs creating the Expression.   */  protected Expression mult(int opPos) throws TransformerException

⌨️ 快捷键说明

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