You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ne...@apache.org on 2002/03/28 00:09:51 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/impl/xpath XPath.java

neilg       02/03/27 15:09:51

  Modified:    java/src/org/apache/xerces/impl/xpath XPath.java
  Log:
  getting rid of dead, commented-out code.  Hopefully this will make this lengthy class easier to understnnd; if we ever want the commented-out sections, we have no further to look than version 1.3 of this file.
  
  Revision  Changes    Path
  1.4       +4 -1645   xml-xerces/java/src/org/apache/xerces/impl/xpath/XPath.java
  
  Index: XPath.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xpath/XPath.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XPath.java	29 Jan 2002 01:15:13 -0000	1.3
  +++ XPath.java	27 Mar 2002 23:09:51 -0000	1.4
  @@ -66,7 +66,7 @@
    * Bare minimum XPath parser.
    *
    * @author Andy Clark, IBM
  - * @version $Id: XPath.java,v 1.3 2002/01/29 01:15:13 lehors Exp $
  + * @version $Id: XPath.java,v 1.4 2002/03/27 23:09:51 neilg Exp $
    */
   public class XPath {
   
  @@ -201,7 +201,7 @@
           };
   
           int length = fExpression.length();
  -        /***/
  +        
           boolean success = scanner.scanExpr(fSymbolTable,
                                              xtokens, fExpression, 0, length);
           //fTokens.dumpTokens();
  @@ -571,9 +571,6 @@
   
           /** Returns a string representation of this object. */
           public String toString() {
  -            /***
  -            return axis.toString() + "::" + nodeTest.toString();
  -            /***/
               if (axis.type == Axis.SELF) {
                   return ".";
               }
  @@ -587,7 +584,6 @@
                   return "//";
               }
               return "??? ("+axis.type+')';
  -            /***/
           } // toString():String
   
           /** Returns a clone of this object. */
  @@ -780,7 +776,7 @@
        * @author Glenn Marcy, IBM
        * @author Andy Clark, IBM
        *
  -     * @version $Id: XPath.java,v 1.3 2002/01/29 01:15:13 lehors Exp $
  +     * @version $Id: XPath.java,v 1.4 2002/03/27 23:09:51 neilg Exp $
        */
       private static final class Tokens {
   
  @@ -1031,13 +1027,6 @@
           // Public methods
           //
   
  -        /*** // REVISIT: What is this doing here? -Ac ***
  -        public int addSymbol(byte[] data, int offset, int length, EncodingMap encoding) {
  -            //return fSymbolTable.addSymbol(data, offset, length, encoding);
  -            return fSymbolTable.addSymbol(new String(data, offset, length));
  -        }
  -        /***/
  -
           public String getTokenName(int token) {
               if (token < 0 || token >= fgTokenNames.length)
                   return null;
  @@ -1262,7 +1251,7 @@
        * @author Glenn Marcy, IBM
        * @author Andy Clark, IBM
        *
  -     * @version $Id: XPath.java,v 1.3 2002/01/29 01:15:13 lehors Exp $
  +     * @version $Id: XPath.java,v 1.4 2002/03/27 23:09:51 neilg Exp $
        */
       private static class Scanner {
   
  @@ -1321,57 +1310,6 @@
           /**
            * Symbol literals
            */
  -        /***
  -        private static int fgAndSymbol = -1;                // 'and'
  -        private static int fgOrSymbol = -1;                 // 'or'
  -        private static int fgModSymbol = -1;                // 'mod'
  -        private static int fgDivSymbol = -1;                // 'div'
  -
  -        private static int fgCommentSymbol = -1;            // 'comment'
  -        private static int fgTextSymbol = -1;               // 'text'
  -        private static int fgPISymbol = -1;                 // 'processing-instruction'
  -        private static int fgNodeSymbol = -1;               // 'node'
  -
  -        private static int fgAncestorSymbol = -1;           // 'ancestor'
  -        private static int fgAncestorOrSelfSymbol = -1;     // 'ancestor-or-self'
  -        private static int fgAttributeSymbol = -1;          // 'attribute'
  -        private static int fgChildSymbol = -1;              // 'child'
  -        private static int fgDescendantSymbol = -1;         // 'descendant'
  -        private static int fgDescendantOrSelfSymbol = -1;   // 'descendant-or-self'
  -        private static int fgFollowingSymbol = -1;          // 'following'
  -        private static int fgFollowingSiblingSymbol = -1;   // 'following-sibling'
  -        private static int fgNamespaceSymbol = -1;          // 'namespace'
  -        private static int fgParentSymbol = -1;             // 'parent'
  -        private static int fgPrecedingSymbol = -1;          // 'preceding'
  -        private static int fgPrecedingSiblingSymbol = -1;   // 'preceding-sibling'
  -        private static int fgSelfSymbol = -1;               // 'self'
  -
  -        private static SymbolTable fgSymbolTable = new SymbolTable();
  -
  -        static {
  -            fgAndSymbol = fgSymbolTable.addSymbol("and");
  -            fgOrSymbol = fgSymbolTable.addSymbol("or");
  -            fgModSymbol = fgSymbolTable.addSymbol("mod");
  -            fgDivSymbol = fgSymbolTable.addSymbol("div");
  -            fgCommentSymbol = fgSymbolTable.addSymbol("comment");
  -            fgTextSymbol = fgSymbolTable.addSymbol("text");
  -            fgPISymbol = fgSymbolTable.addSymbol("processing-instruction");
  -            fgNodeSymbol = fgSymbolTable.addSymbol("node");
  -            fgAncestorSymbol = fgSymbolTable.addSymbol("ancestor");
  -            fgAncestorOrSelfSymbol = fgSymbolTable.addSymbol("ancestor-or-self");
  -            fgAttributeSymbol = fgSymbolTable.addSymbol("attribute");
  -            fgChildSymbol = fgSymbolTable.addSymbol("child");
  -            fgDescendantSymbol = fgSymbolTable.addSymbol("descendant");
  -            fgDescendantOrSelfSymbol = fgSymbolTable.addSymbol("descendant-or-self");
  -            fgFollowingSymbol = fgSymbolTable.addSymbol("following");
  -            fgFollowingSiblingSymbol = fgSymbolTable.addSymbol("following-sibling");
  -            fgNamespaceSymbol = fgSymbolTable.addSymbol("namespace");
  -            fgParentSymbol = fgSymbolTable.addSymbol("parent");
  -            fgPrecedingSymbol = fgSymbolTable.addSymbol("preceding");
  -            fgPrecedingSiblingSymbol = fgSymbolTable.addSymbol("preceding-sibling");
  -            fgSelfSymbol = fgSymbolTable.addSymbol("self");
  -        }
  -        /***/
   
           //
           // Data
  @@ -1455,14 +1393,6 @@
               int ch;
               final String emptySymbol = fSymbolTable.addSymbol("");
   
  -            /***
  -            if (XPath.Tokens.DUMP_TOKENS) {
  -                System.out.println("  <test>");
  -                System.out.println("    <expression>");
  -                System.out.println("      " + encoding.createString(data, currentOffset, endOffset - currentOffset));
  -                System.out.println("    </expression>");
  -            }
  -            /***/
               while (true) {
                   if (currentOffset == endOffset) {
                       break;
  @@ -2046,59 +1976,6 @@
               }
               return currentOffset;
           }
  -        /*
  -        void allocateProducer(byte[] data, int offset, int length, EncodingSupport encoding) {
  -            XPathStringProducer sp = fStringProducers[fStringProducerCount];
  -            if (sp != null) {
  -                sp = sp.setState(data, offset, length, encoding);
  -            } else {
  -                sp = new XPathStringProducer(data, offset, length, encoding);
  -            }
  -            fStringProducers[fStringProducerCount++] = sp;
  -        }
  -        void finalizeProducer(byte[] data) {
  -            fStringProducerCount--;
  -        }
  -        private class XPathStringProducer {
  -            byte[] fData = null;
  -            int fOffset = -1;
  -            int fLength = -1;
  -            String fEncoding = null;
  -            XPathStringProducer(byte[] data, int offset, int length, EncodingSupport encoding) {
  -                init(data, offset, length, encoding);
  -            }
  -            XPathStringProducer setState(byte[] bytes, int offset, int length, EncodingSupport encoding) {
  -                init(bytes, offset, length, encoding);
  -                return this;
  -            }
  -            void init(byte[] data, int offset, int length, EncodingSupport encoding) {
  -                fData = data;
  -                fOffset = offset;
  -                fLength = length;
  -                fEncoding = encoding;
  -            }
  -            String getEncoding() {
  -                return fEncoding;
  -            }
  -            void finalizeProducer() {
  -                // do nothing
  -            }
  -            int addSymbol(int offset, int length) {
  -                return fSymbolTable.addSymbol(fData, offset, length, fEncoding);
  -            }
  -        }
  -        private XPathStringProducer[] fStringProducers = new XPathStringProducer[8];
  -        private int fStringProducerCount = 0;
  -        private XPathStringProducer getStringProducer(byte[] data) {
  -            XPathStringProducer sp = null;
  -            for (int i = 0; i < fStringProducerCount; i++) {
  -                if (fStringProducers[i].fData == data) {
  -                    return fStringProducers[i];
  -                }
  -            }
  -            throw new RuntimeException("No StringProducer");
  -        }
  -        */
           //
           // [30] Number ::= Digits ('.' Digits?)? | '.' Digits
           // [31] Digits ::= [0-9]+
  @@ -2140,74 +2017,6 @@
               return currentOffset;
           }
   
  -        /***
  -        public static SymbolTable getGlobalTokens() {
  -            return fgSymbolTable;
  -        }
  -
  -        public static void main(String argv[]) {
  -            try {
  -                SymbolTable symbols = new SymbolTable(XPathExprScanner.getGlobalTokens());
  -                XPath.Tokens tokens = new XPath.Tokens(symbols);
  -                byte[] bytes = new byte[1 << 8]; // 256
  -                int i = 0;
  -                if (XPath.Tokens.DUMP_TOKENS) {
  -                    System.out.println("<output>");
  -                    System.out.println();
  -                }
  -                while (i < argv.length) {
  -                    String uri = argv[i++];
  -                    // System.out.println("uri: "+uri);
  -                    FileInputStream is = new FileInputStream(uri);
  -                    int lineOffset = 0;
  -                    int offset = 0;
  -                    while (true) {
  -                        int avail = bytes.length - offset;
  -                        if (avail == 0) {
  -                            avail = bytes.length;
  -                            byte[] newBytes = new byte[avail << 1];
  -                            System.arraycopy(bytes, 0, newBytes, 0, avail);
  -                            bytes = newBytes;
  -                        }
  -                        int result = is.read(bytes, offset, avail);
  -                        if (result == -1) {
  -                            bytes[offset] = 0;
  -                            break;
  -                        }
  -                        result += offset;
  -                        for (int j = offset; j < result; j++) {
  -                            int ch = bytes[j];
  -                            if (ch == 0x0A || ch == 0x0D) {
  -                                if (lineOffset < offset) {
  -                                    XPathExprScanner.scanExpr(tokens, bytes, lineOffset, offset, UTF8EncodingSupport.getInstance());
  -                                }
  -                                while (ch == 0x0A || ch == 0x0D) {
  -                                    if (++j == result) {
  -                                        j = result;
  -                                        break;
  -                                    }
  -                                    ch = bytes[j];
  -                                }
  -                                lineOffset = offset;
  -                                if (j == result) {
  -                                    break;
  -                                }
  -                            }
  -                            bytes[offset++] = (byte)ch;
  -                        }
  -                    }
  -                    is.close();
  -                }
  -                if (XPath.Tokens.DUMP_TOKENS) {
  -                    System.out.println("</output>");
  -                }
  -            }
  -            catch (Exception e) {
  -                e.printStackTrace();
  -            }
  -        }
  -        /***/
  -
           //
           // Protected methods
           //
  @@ -2226,1456 +2035,6 @@
           } // addToken(int)
   
       } // class Scanner
  -
  -    /**
  -     * @author Glenn Marcy, IBM
  -     * @author Andy Clark, IBM
  -     *
  -     * @version $Id: XPath.java,v 1.3 2002/01/29 01:15:13 lehors Exp $
  -     */
  -    /***
  -    public static class XPathExprParser {
  -
  -        //
  -        // Constants
  -        //
  -
  -        private static final boolean DUMP_PARSE_TREE = false;
  -
  -        private static final boolean DEBUG_PUSH_PARSEOPS = false;
  -
  -        /** Parse Tree operations * /
  -        public static final int
  -            PARSEOP_OR                              = -5000,
  -            PARSEOP_AND                             = -5001,
  -            PARSEOP_EQUAL                           = -5002,
  -            PARSEOP_NOT_EQUAL                       = -5003,
  -            PARSEOP_PLUS                            = -5004,
  -            PARSEOP_MINUS                           = -5005,
  -            PARSEOP_MULT                            = -5006,
  -            PARSEOP_DIV                             = -5007,
  -            PARSEOP_MOD                             = -5008,
  -            PARSEOP_LESS                            = -5009,
  -            PARSEOP_GREATER                         = -5010,
  -            PARSEOP_LESS_EQUAL                      = -5011,
  -            PARSEOP_GREATER_EQUAL                   = -5012,
  -            PARSEOP_NEGATE                          = -5013,
  -            PARSEOP_UNION                           = -5014,
  -            PARSEOP_SELECT_ROOT                     = -5015,
  -            PARSEOP_STEPS                           = -5016,
  -            PARSEOP_STEP                            = -5017,
  -            PARSEOP_AXIS_ANCESTOR                   = -5018,
  -            PARSEOP_AXIS_ANCESTOR_OR_SELF           = -5019,
  -            PARSEOP_AXIS_ATTRIBUTE                  = -5020,
  -            PARSEOP_AXIS_CHILD                      = -5021,
  -            PARSEOP_AXIS_DESCENDANT                 = -5022,
  -            PARSEOP_AXIS_DESCENDANT_OR_SELF         = -5023,
  -            PARSEOP_AXIS_FOLLOWING                  = -5024,
  -            PARSEOP_AXIS_FOLLOWING_SIBLING          = -5025,
  -            PARSEOP_AXIS_NAMESPACE                  = -5026,
  -            PARSEOP_AXIS_PARENT                     = -5027,
  -            PARSEOP_AXIS_PRECEDING                  = -5028,
  -            PARSEOP_AXIS_PRECEDING_SIBLING          = -5029,
  -            PARSEOP_AXIS_SELF                       = -5030,
  -            PARSEOP_NODETEST_ANY                    = -5031,
  -            PARSEOP_NODETEST_NAMESPACE              = -5032,
  -            PARSEOP_NODETEST_QNAME                  = -5033,
  -            PARSEOP_NODETEST_COMMENT                = -5034,
  -            PARSEOP_NODETEST_TEXT                   = -5035,
  -            PARSEOP_NODETEST_PI                     = -5036,
  -            PARSEOP_NODETEST_PI_TARGET              = -5037,
  -            PARSEOP_NODETEST_NODE                   = -5038,
  -            PARSEOP_FILTER                          = -5039,
  -            PARSEOP_PREDICATES                      = -5040,
  -            PARSEOP_PREDICATE                       = -5041,
  -            PARSEOP_VARIABLE_REFERENCE              = -5042,
  -            PARSEOP_GROUPING                        = -5043,
  -            PARSEOP_LITERAL                         = -5044,
  -            PARSEOP_NUMBER                          = -5045,
  -            PARSEOP_FUNCTION                        = -5046,
  -            PARSEOP_FUNCTION_NAME                   = -5047,
  -            PARSEOP_FUNCTION_ARGUMENTS              = -5048;
  -
  -        //
  -        // Data
  -        //
  -
  -        private int fTokenCount = 0;  // for reading
  -        private int fCurrentToken = 0;  // for reading
  -
  -        private static final int INITIAL_PARSEOP_COUNT = 1 << 8;
  -        private int[] fParseTree = new int[INITIAL_PARSEOP_COUNT];
  -        private int fParseOpCount = 0;    // for writing
  -        private int fCurrentParseOp = 0;  // for reading
  -
  -        /** Symbol table. * /
  -        private SymbolTable fSymbolTable;
  -
  -        /** Tokens. * /
  -        private XPath.Tokens fTokens;
  -
  -        /** Scanner. * /
  -        private XPathExprScanner fScanner;
  -
  -        //
  -        // Constructors
  -        //
  -
  -        public XPathExprParser() {
  -            this(new SymbolTable());
  -        }
  -
  -        public XPathExprParser(SymbolTable symbolTable) {
  -            this(symbolTable, new XPathExprScanner(symbolTable));
  -        }
  -
  -        public XPathExprParser(SymbolTable symbolTable, XPathExprScanner scanner) {
  -
  -            fSymbolTable = symbolTable;
  -            fScanner = scanner;
  -
  -        } // <init>(SymbolTable,XPathExprScanner)
  -
  -        //
  -        // Public methods
  -        //
  -
  -        // init
  -
  -        public void reset() {
  -            fParseOpCount = 0;
  -            fCurrentParseOp = 0;
  -        }
  -
  -        // parsing
  -
  -        public int parseExpr(String data) throws XPathException {
  -            return parseExpr(data, 0, data.length());
  -        }
  -
  -        public int parseExpr(String data, int currentOffset, int endOffset)
  -            throws XPathException {
  -            return parseExprOrPattern(data, currentOffset, endOffset, false);
  -        }
  -
  -        public int parsePattern(String data, int currentOffset, int endOffset)
  -            throws XPathException {
  -            return parseExprOrPattern(data, currentOffset, endOffset, true);
  -        }
  -
  -        public int parseExprOrPattern(String data, int currentOffset,
  -                                      int endOffset, boolean isPattern)
  -            throws XPathException {
  -            fTokenCount = 0;
  -
  -            if (DUMP_PARSE_TREE) {
  -                System.out.println("  <test>");
  -                System.out.println("    <expression>");
  -                System.out.println("      " + data.substring(currentOffset, endOffset));
  -                System.out.println("    </expression>");
  -            }
  -            fTokens = new XPath.Tokens(fSymbolTable);
  -            fScanner.scanExpr(fTokens, data, currentOffset, endOffset);
  -            //
  -            // Build parse tree
  -            //
  -            fTokenCount = fTokens.getTokenCount();
  -            fCurrentToken = 0;
  -            if (!parseExpr()) {
  -                // System.out.println("abort 12");
  -                return -1; // REVISIT
  -            }
  -            if (fCurrentToken < fTokenCount) {
  -                // System.out.println("abort 13");
  -                return -1; // REVISIT
  -            }
  -            if (DUMP_PARSE_TREE) {
  -                dumpParseTree(fCurrentParseOp, 4);
  -            }
  -            if (DUMP_PARSE_TREE) {
  -                System.out.println("  </test>");
  -                System.out.println();
  -            }
  -            return fCurrentParseOp;
  -        }
  -
  -        // parse tree ops
  -
  -        public int getCurrentParseOp() {
  -            return fCurrentParseOp;
  -        }
  -
  -        public int getParseTreeOp(int handle) {
  -            return fParseTree[handle];
  -        }
  -
  -        public int getParseTreeSubHandle(int handle, int subHandleIndex) {
  -            return fParseTree[handle - 1 - subHandleIndex];
  -        }
  -
  -        public String getParseTreeSymbol(int handle, int subHandleIndex) {
  -            int symHandle = fParseTree[handle - 1 - subHandleIndex];
  -            return fTokens.getTokenString(symHandle);
  -        }
  -
  -        public int getParseTreeIntValue(int handle, int subHandleIndex) {
  -            return fParseTree[handle - 1 - subHandleIndex];
  -        }
  -
  -        // debugging
  -
  -        public void dumpParseTree(int rootParseOp, int indent) {
  -                indentPrint(indent);
  -                System.out.println("<parse-tree>");
  -                dumpParseTreeNode(rootParseOp, indent + 2);
  -                indentPrint(indent);
  -                System.out.println("</parse-tree>");
  -        }
  -
  -        public String getParseOpName(int parseOp) {
  -            switch (parseOp) {
  -                case PARSEOP_OR: return "PARSEOP_OR";
  -                case PARSEOP_AND: return "PARSEOP_AND";
  -                case PARSEOP_EQUAL: return "PARSEOP_EQUAL";
  -                case PARSEOP_NOT_EQUAL: return "PARSEOP_NOT_EQUAL";
  -                case PARSEOP_PLUS: return "PARSEOP_PLUS";
  -                case PARSEOP_MINUS: return "PARSEOP_MINUS";
  -                case PARSEOP_MULT: return "PARSEOP_MULT";
  -                case PARSEOP_DIV: return "PARSEOP_DIV";
  -                case PARSEOP_MOD: return "PARSEOP_MOD";
  -                case PARSEOP_LESS: return "PARSEOP_LESS";
  -                case PARSEOP_GREATER: return "PARSEOP_GREATER";
  -                case PARSEOP_LESS_EQUAL: return "PARSEOP_LESS_EQUAL";
  -                case PARSEOP_GREATER_EQUAL: return "PARSEOP_GREATER_EQUAL";
  -                case PARSEOP_NEGATE: return "PARSEOP_NEGATE";
  -                case PARSEOP_UNION: return "PARSEOP_UNION";
  -                case PARSEOP_SELECT_ROOT: return "PARSEOP_SELECT_ROOT";
  -                case PARSEOP_STEPS: return "PARSEOP_STEPS";
  -                case PARSEOP_STEP: return "PARSEOP_STEP";
  -                case PARSEOP_AXIS_ANCESTOR: return "PARSEOP_AXIS_ANCESTOR";
  -                case PARSEOP_AXIS_ANCESTOR_OR_SELF: return "PARSEOP_AXIS_ANCESTOR_OR_SELF";
  -                case PARSEOP_AXIS_ATTRIBUTE: return "PARSEOP_AXIS_ATTRIBUTE";
  -                case PARSEOP_AXIS_CHILD: return "PARSEOP_AXIS_CHILD";
  -                case PARSEOP_AXIS_DESCENDANT: return "PARSEOP_AXIS_DESCENDANT";
  -                case PARSEOP_AXIS_DESCENDANT_OR_SELF: return "PARSEOP_AXIS_DESCENDANT_OR_SELF";
  -                case PARSEOP_AXIS_FOLLOWING: return "PARSEOP_AXIS_FOLLOWING";
  -                case PARSEOP_AXIS_FOLLOWING_SIBLING: return "PARSEOP_AXIS_FOLLOWING_SIBLING";
  -                case PARSEOP_AXIS_NAMESPACE: return "PARSEOP_AXIS_NAMESPACE";
  -                case PARSEOP_AXIS_PARENT: return "PARSEOP_AXIS_PARENT";
  -                case PARSEOP_AXIS_PRECEDING: return "PARSEOP_AXIS_PRECEDING";
  -                case PARSEOP_AXIS_PRECEDING_SIBLING: return "PARSEOP_AXIS_PRECEDING_SIBLING";
  -                case PARSEOP_AXIS_SELF: return "PARSEOP_AXIS_SELF";
  -                case PARSEOP_NODETEST_ANY: return "PARSEOP_NODETEST_ANY";
  -                case PARSEOP_NODETEST_NAMESPACE: return "PARSEOP_NODETEST_NAMESPACE";
  -                case PARSEOP_NODETEST_QNAME: return "PARSEOP_NODETEST_QNAME";
  -                case PARSEOP_NODETEST_COMMENT: return "PARSEOP_NODETEST_COMMENT";
  -                case PARSEOP_NODETEST_TEXT: return "PARSEOP_NODETEST_TEXT";
  -                case PARSEOP_NODETEST_PI: return "PARSEOP_NODETEST_PI";
  -                case PARSEOP_NODETEST_PI_TARGET: return "PARSEOP_NODETEST_PI_TARGET";
  -                case PARSEOP_NODETEST_NODE: return "PARSEOP_NODETEST_NODE";
  -                case PARSEOP_FILTER: return "PARSEOP_FILTER";
  -                case PARSEOP_PREDICATES: return "PARSEOP_PREDICATES";
  -                case PARSEOP_PREDICATE: return "PARSEOP_PREDICATE";
  -                case PARSEOP_VARIABLE_REFERENCE: return "PARSEOP_VARIABLE_REFERENCE";
  -                case PARSEOP_GROUPING: return "PARSEOP_GROUPING";
  -                case PARSEOP_LITERAL: return "PARSEOP_LITERAL";
  -                case PARSEOP_NUMBER: return "PARSEOP_NUMBER";
  -                case PARSEOP_FUNCTION: return "PARSEOP_FUNCTION";
  -                case PARSEOP_FUNCTION_NAME: return "PARSEOP_FUNCTION_NAME";
  -                case PARSEOP_FUNCTION_ARGUMENTS: return "PARSEOP_FUNCTION_ARGUMENTS";
  -            }
  -            return "??? ("+parseOp+')';
  -        }
  -
  -        //
  -        // Protected methods
  -        //
  -
  -        protected void checkParseOp(int parseOp) throws XPathException {
  -            // do nothing; all parse ops allowed in the class
  -        }
  -
  -        //
  -        // Private methods
  -        //
  -
  -        private void pushParseOp(int parseOp) throws XPathException {
  -            if (DEBUG_PUSH_PARSEOPS) {
  -                System.out.println("pushParseOp: "+getParseOpName(parseOp));
  -            }
  -            checkParseOp(parseOp);
  -            try {
  -                fParseTree[fParseOpCount] = parseOp;
  -            } catch (ArrayIndexOutOfBoundsException ex) {
  -                int[] oldList = fParseTree;
  -                fParseTree = new int[fParseOpCount << 1];
  -                System.arraycopy(oldList, 0, fParseTree, 0, fParseOpCount);
  -                fParseTree[fParseOpCount] = parseOp;
  -            }
  -            fCurrentParseOp = fParseOpCount++;
  -        }
  -
  -        private void pushParseOp2(int parseOp, int arg) throws XPathException {
  -            if (DEBUG_PUSH_PARSEOPS) {
  -                System.out.println("pushParseOp2: "+getParseOpName(parseOp)+", "+arg);
  -            }
  -            checkParseOp(parseOp);
  -            try {
  -                fParseTree[fParseOpCount + 1] = parseOp;
  -            } catch (ArrayIndexOutOfBoundsException ex) {
  -                int[] oldList = fParseTree;
  -                fParseTree = new int[fParseOpCount << 1];
  -                System.arraycopy(oldList, 0, fParseTree, 0, fParseOpCount);
  -                fParseTree[fParseOpCount + 1] = parseOp;
  -            }
  -            fParseTree[fParseOpCount++] = arg;
  -            fCurrentParseOp = fParseOpCount++;
  -        }
  -
  -        private void pushParseOp3(int parseOp, int arg1, int arg2)
  -            throws XPathException {
  -            if (DEBUG_PUSH_PARSEOPS) {
  -                System.out.println("pushParseOp3: "+getParseOpName(parseOp)+", "+arg1+", "+arg2);
  -            }
  -            checkParseOp(parseOp);
  -            try {
  -                fParseTree[fParseOpCount + 2] = parseOp;
  -            } catch (ArrayIndexOutOfBoundsException ex) {
  -                int[] oldList = fParseTree;
  -                fParseTree = new int[fParseOpCount << 1];
  -                System.arraycopy(oldList, 0, fParseTree, 0, fParseOpCount);
  -                fParseTree[fParseOpCount + 2] = parseOp;
  -            }
  -            fParseTree[fParseOpCount++] = arg2;
  -            fParseTree[fParseOpCount++] = arg1;
  -            fCurrentParseOp = fParseOpCount++;
  -        }
  -
  -        private void indentPrint(int indent) {
  -            for (int i = 0; i < indent; i++) {
  -                System.out.print(" ");
  -            }
  -        }
  -
  -        private void dumpParseTreeNode(int parseOp, int indent) {
  -                switch (fParseTree[parseOp]) {
  -                case PARSEOP_OR:
  -                    indentPrint(indent);
  -                    System.out.println("<or>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</or>");
  -                    break;
  -                case PARSEOP_AND:
  -                    indentPrint(indent);
  -                    System.out.println("<and>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</and>");
  -                    break;
  -                case PARSEOP_EQUAL:
  -                    indentPrint(indent);
  -                    System.out.println("<equal>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</equal>");
  -                    break;
  -                case PARSEOP_NOT_EQUAL:
  -                    indentPrint(indent);
  -                    System.out.println("<not-equal>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</not-equal>");
  -                    break;
  -                case PARSEOP_PLUS:
  -                    indentPrint(indent);
  -                    System.out.println("<plus>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</plus>");
  -                    break;
  -                case PARSEOP_MINUS:
  -                    indentPrint(indent);
  -                    System.out.println("<minus>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</minus>");
  -                    break;
  -                case PARSEOP_MULT:
  -                    indentPrint(indent);
  -                    System.out.println("<mult>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</mult>");
  -                    break;
  -                case PARSEOP_DIV:
  -                    indentPrint(indent);
  -                    System.out.println("<div>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</div>");
  -                    break;
  -                case PARSEOP_MOD:
  -                    indentPrint(indent);
  -                    System.out.println("<mod>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</mod>");
  -                    break;
  -                case PARSEOP_LESS:
  -                    indentPrint(indent);
  -                    System.out.println("<less>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</less>");
  -                    break;
  -                case PARSEOP_GREATER:
  -                    indentPrint(indent);
  -                    System.out.println("<greater>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</greater>");
  -                    break;
  -                case PARSEOP_LESS_EQUAL:
  -                    indentPrint(indent);
  -                    System.out.println("<less-equal>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</less-equal>");
  -                    break;
  -                case PARSEOP_GREATER_EQUAL:
  -                    indentPrint(indent);
  -                    System.out.println("<greater-equal>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</greater-equal>");
  -                    break;
  -                case PARSEOP_NEGATE:
  -                    indentPrint(indent);
  -                    System.out.println("<negate>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</negate>");
  -                    break;
  -                case PARSEOP_UNION:
  -                    indentPrint(indent);
  -                    System.out.println("<union>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</union>");
  -                    break;
  -                case PARSEOP_SELECT_ROOT:
  -                    indentPrint(indent);
  -                    if (fParseTree[parseOp - 1] == -1) {
  -                        System.out.println("<select-root/>");
  -                    } else {
  -                        System.out.println("<select-root>");
  -                        dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                        indentPrint(indent);
  -                        System.out.println("</select-root>");
  -                    }
  -                    break;
  -                case PARSEOP_STEPS:
  -                    indentPrint(indent);
  -                    System.out.println("<relative-location-path>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</relative-location-path>");
  -                    break;
  -                case PARSEOP_STEP:
  -                    indentPrint(indent);
  -                    System.out.println("<step>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</step>");
  -                    break;
  -                case PARSEOP_AXIS_ANCESTOR:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"ancestor\"/>");
  -                    break;
  -                case PARSEOP_AXIS_ANCESTOR_OR_SELF:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"ancestor-or-self\"/>");
  -                    break;
  -                case PARSEOP_AXIS_ATTRIBUTE:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"attribute\"/>");
  -                    break;
  -                case PARSEOP_AXIS_CHILD:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"child\"/>");
  -                    break;
  -                case PARSEOP_AXIS_DESCENDANT:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"descendant\"/>");
  -                    break;
  -                case PARSEOP_AXIS_DESCENDANT_OR_SELF:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"descendant-or-self\"/>");
  -                    break;
  -                case PARSEOP_AXIS_FOLLOWING:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"following\"/>");
  -                    break;
  -                case PARSEOP_AXIS_FOLLOWING_SIBLING:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"following-sibling\"/>");
  -                    break;
  -                case PARSEOP_AXIS_NAMESPACE:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"namespace\"/>");
  -                    break;
  -                case PARSEOP_AXIS_PARENT:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"parent\"/>");
  -                    break;
  -                case PARSEOP_AXIS_PRECEDING:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"preceding\"/>");
  -                    break;
  -                case PARSEOP_AXIS_PRECEDING_SIBLING:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"preceding-sibling\"/>");
  -                    break;
  -                case PARSEOP_AXIS_SELF:
  -                    indentPrint(indent);
  -                    System.out.println("<axis name=\"self\"/>");
  -                    break;
  -                case PARSEOP_NODETEST_ANY:
  -                    indentPrint(indent);
  -                    System.out.println("<nodetest type=\"any\"/>");
  -                    break;
  -                case PARSEOP_NODETEST_NAMESPACE:
  -                    indentPrint(indent);
  -                    System.out.print("<nodetest type=\"namespace\"");
  -                    System.out.print(" prefix=\"" + fParseTree[parseOp - 1] + "\"");
  -                    System.out.println("/>");
  -                    break;
  -                case PARSEOP_NODETEST_QNAME:
  -                    indentPrint(indent);
  -                    System.out.print("<nodetest type=\"qname\"");
  -                    if (fParseTree[parseOp - 1] != -1) {
  -                        System.out.print(" prefix=\"" + fParseTree[parseOp - 1] + "\"");
  -                    }
  -                    System.out.print(" localpart=\"" + fParseTree[parseOp - 2] + "\"");
  -                    System.out.println("/>");
  -                    break;
  -                case PARSEOP_NODETEST_COMMENT:
  -                    indentPrint(indent);
  -                    System.out.println("<nodetest type=\"comment\"/>");
  -                    break;
  -                case PARSEOP_NODETEST_TEXT:
  -                    indentPrint(indent);
  -                    System.out.println("<nodetest type=\"text\"/>");
  -                    break;
  -                case PARSEOP_NODETEST_PI:
  -                    indentPrint(indent);
  -                    System.out.println("<nodetest type=\"processing-instruction\"/>");
  -                    break;
  -                case PARSEOP_NODETEST_PI_TARGET:
  -                    indentPrint(indent);
  -                    System.out.print("<nodetest type=\"processing-instruction\" target=\"");
  -                    System.out.print(fParseTree[parseOp - 1]);
  -                    System.out.println("\"/>");
  -                    break;
  -                case PARSEOP_NODETEST_NODE:
  -                    indentPrint(indent);
  -                    System.out.println("<nodetest type=\"node\"/>");
  -                    break;
  -                case PARSEOP_FILTER:
  -                    indentPrint(indent);
  -                    System.out.println("<step-with-predicate>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</step-with-predicate>");
  -                    break;
  -                case PARSEOP_PREDICATES:
  -                    indentPrint(indent);
  -                    System.out.println("<predicates>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</predicates>");
  -                    break;
  -                case PARSEOP_PREDICATE:
  -                    indentPrint(indent);
  -                    System.out.println("<predicate>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</predicate>");
  -                    break;
  -                case PARSEOP_VARIABLE_REFERENCE:
  -                    indentPrint(indent);
  -                    System.out.print("<variable-reference");
  -                    if (fParseTree[parseOp - 1] != -1) {
  -                        System.out.print(" prefix=\"" + fParseTree[parseOp - 1] + "\"");
  -                    }
  -                    System.out.print(" localpart=\"" + fParseTree[parseOp - 2] + "\"");
  -                    System.out.println("/>");
  -                    break;
  -                case PARSEOP_GROUPING:
  -                    indentPrint(indent);
  -                    System.out.println("<grouping>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</grouping>");
  -                    break;
  -                case PARSEOP_LITERAL:
  -                    indentPrint(indent);
  -                    System.out.print("<literal");
  -                    System.out.print(" value=\"" + fParseTree[parseOp - 1] + "\"");
  -                    System.out.println("/>");
  -                    break;
  -                case PARSEOP_NUMBER:
  -                    indentPrint(indent);
  -                    System.out.print("<number");
  -                    System.out.print(" whole=\"" + fParseTree[parseOp - 1] + "\"");
  -                    System.out.print(" part=\"" + fParseTree[parseOp - 2] + "\"");
  -                    System.out.println("/>");
  -                    break;
  -                case PARSEOP_FUNCTION:
  -                    indentPrint(indent);
  -                    System.out.println("<function-call>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    if (fParseTree[parseOp - 2] != -1) {
  -                        dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    }
  -                    indentPrint(indent);
  -                    System.out.println("</function-call>");
  -                    break;
  -                case PARSEOP_FUNCTION_NAME:
  -                    indentPrint(indent);
  -                    System.out.print("<function-name");
  -                    if (fParseTree[parseOp - 1] != -1) {
  -                        System.out.print(" prefix=\"" + fParseTree[parseOp - 1] + "\"");
  -                    }
  -                    System.out.print(" localpart=\"" + fParseTree[parseOp - 2] + "\"");
  -                    System.out.println("/>");
  -                    break;
  -                case PARSEOP_FUNCTION_ARGUMENTS:
  -                    indentPrint(indent);
  -                    System.out.println("<function-args>");
  -                    dumpParseTreeNode(fParseTree[parseOp - 1], indent + 2);
  -                    dumpParseTreeNode(fParseTree[parseOp - 2], indent + 2);
  -                    indentPrint(indent);
  -                    System.out.println("</function-args>");
  -                    break;
  -                default:
  -                    throw new RuntimeException("dumpParseTreeNode("+parseOp+")");
  -                }
  -        }
  -
  -        //
  -        // Package methods
  -        //
  -
  -        /**
  -         * [14] Expr ::= OrExpr
  -         * /
  -        boolean parseExpr() throws XPathException {
  -            return parseOrExpr();
  -        }
  -
  -        /**
  -         * [21] OrExpr ::= AndExpr | OrExpr 'or' AndExpr
  -         *
  -         * also: OrExpr ::= (AndExpr 'or')* AndExpr
  -         * /
  -        boolean parseOrExpr() throws XPathException {
  -            if (!parseAndExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPERATOR_OR) {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseAndExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(PARSEOP_OR, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [22] AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr
  -         * /
  -        boolean parseAndExpr() throws XPathException {
  -            if (!parseEqualityExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPERATOR_AND) {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseEqualityExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(PARSEOP_AND, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [23] EqualityExpr ::= RelationalExpr
  -         *                     | EqualityExpr '=' RelationalExpr
  -         *                     | EqualityExpr '!=' RelationalExpr
  -         * /
  -        boolean parseEqualityExpr() throws XPathException {
  -            if (!parseRelationalExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                int parseOp;
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_EQUAL) {
  -                    parseOp = PARSEOP_EQUAL;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_NOT_EQUAL) {
  -                    parseOp = PARSEOP_NOT_EQUAL;
  -                } else {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseRelationalExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(parseOp, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [24] RelationalExpr ::= AdditiveExpr
  -         *                       | RelationalExpr '<' AdditiveExpr
  -         *                       | RelationalExpr '>' AdditiveExpr
  -         *                       | RelationalExpr '<=' AdditiveExpr
  -         *                       | RelationalExpr '>=' AdditiveExpr
  -         * /
  -        boolean parseRelationalExpr() throws XPathException {
  -            if (!parseAdditiveExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                int parseOp;
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_LESS) {
  -                    parseOp = PARSEOP_LESS;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_GREATER) {
  -                    parseOp = PARSEOP_GREATER;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_LESS_EQUAL) {
  -                    parseOp = PARSEOP_LESS_EQUAL;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_GREATER_EQUAL) {
  -                    parseOp = PARSEOP_GREATER_EQUAL;
  -                } else {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseAdditiveExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(parseOp, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [25] AdditiveExpr ::= MultiplicativeExpr
  -         *                     | AdditiveExpr '+' MultiplicativeExpr
  -         *                     | AdditiveExpr '-' MultiplicativeExpr
  -         * /
  -        boolean parseAdditiveExpr() throws XPathException {
  -            if (!parseMultiplicativeExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                int parseOp;
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_PLUS) {
  -                    parseOp = PARSEOP_PLUS;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_MINUS) {
  -                    parseOp = PARSEOP_MINUS;
  -                } else {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseMultiplicativeExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(parseOp, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [26] MultiplicativeExpr ::= UnaryExpr
  -         *                           | MultiplicativeExpr MultiplyOperator UnaryExpr
  -         *                           | MultiplicativeExpr 'div' UnaryExpr
  -         *                           | MultiplicativeExpr 'mod' UnaryExpr
  -         * [34] MultiplyOperator ::= '*'
  -         * /
  -        boolean parseMultiplicativeExpr() throws XPathException {
  -            if (!parseUnaryExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                int parseOp;
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_MULT) {
  -                    parseOp = PARSEOP_MULT;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_DIV) {
  -                    parseOp = PARSEOP_DIV;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_MOD) {
  -                    parseOp = PARSEOP_MOD;
  -                } else {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseUnaryExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(parseOp, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [27] UnaryExpr ::= UnionExpr | '-' UnaryExpr
  -         *
  -         * Note: "--UnionExpr" == "-(-UnionExpr)"
  -         * /
  -        boolean parseUnaryExpr() throws XPathException {
  -            if (parseUnionExpr()) {
  -                return true;
  -            }
  -            int saveToken = fCurrentToken;
  -            boolean negate = false;
  -            while (fCurrentToken < fTokenCount) {
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPERATOR_MINUS) {
  -                    break;
  -                }
  -                fCurrentToken++;
  -                negate = !negate;
  -            }
  -            if (fCurrentToken == fTokenCount) {
  -                fCurrentToken = saveToken;
  -                return false;
  -            }
  -            if (!parseUnionExpr()) {
  -                fCurrentToken = saveToken;
  -                return false;
  -            }
  -            if (negate) {
  -                pushParseOp2(PARSEOP_NEGATE, fCurrentParseOp);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [18] UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
  -         * /
  -        boolean parseUnionExpr() throws XPathException {
  -            if (!parsePathExpr()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPERATOR_UNION) {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parsePathExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                int right = fCurrentParseOp;
  -                pushParseOp3(PARSEOP_UNION, left, right);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [19] PathExpr ::= RelativeLocationPath
  -         *                 | '/' RelativeLocationPath?
  -         *                 | '//' RelativeLocationPath
  -         *                 | PrimaryExpr Predicate*
  -         *                 | PrimaryExpr Predicate* '/' RelativeLocationPath
  -         *                 | PrimaryExpr Predicate* '//' RelativeLocationPath
  -         * /
  -        boolean parsePathExpr() throws XPathException {
  -            if (parseRelativeLocationPath()) {
  -                return true;
  -            } else {
  -                if (fCurrentToken == fTokenCount) {
  -                    return false;
  -                }
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_SLASH) {
  -                    if (++fCurrentToken < fTokenCount && parseRelativeLocationPath()) {
  -                        pushParseOp2(PARSEOP_SELECT_ROOT, fCurrentParseOp);
  -                    } else {
  -                        pushParseOp2(PARSEOP_SELECT_ROOT, -1);
  -                    }
  -                    return true;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_DOUBLE_SLASH) {
  -                    if (++fCurrentToken == fTokenCount) {
  -                        return false; // REVISIT - backup index
  -                    }
  -                    if (!parseRelativeLocationPath()) {
  -                        return false;
  -                    }
  -                    int left = fCurrentParseOp;
  -                    pushParseOp(PARSEOP_AXIS_DESCENDANT_OR_SELF);
  -                    int left2 = fCurrentParseOp;
  -                    pushParseOp(PARSEOP_NODETEST_NODE);
  -                    pushParseOp3(PARSEOP_STEP, left2, fCurrentParseOp);
  -                    pushParseOp3(PARSEOP_STEPS, fCurrentParseOp, left);
  -                    pushParseOp2(PARSEOP_SELECT_ROOT, fCurrentParseOp);
  -                    return true;
  -                }
  -            }
  -            if (!parsePrimaryExpr()) {
  -                return false;
  -            }
  -            int left = fCurrentParseOp;
  -            if (parsePredicates()) {
  -                pushParseOp3(PARSEOP_FILTER, left, fCurrentParseOp);
  -            }
  -            if (fCurrentToken == fTokenCount) {
  -                return true;
  -            }
  -            left = fCurrentParseOp;
  -            if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_SLASH) {
  -                if (++fCurrentToken == fTokenCount) {
  -                    return false; // REVISIT
  -                }
  -                if (!parseRelativeLocationPath()) {
  -                    return false; // REVISIT
  -                }
  -                pushParseOp3(PARSEOP_STEPS, left, fCurrentParseOp);
  -            } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_DOUBLE_SLASH) {
  -                if (++fCurrentToken == fTokenCount) {
  -                    return false;
  -                }
  -                if (!parseRelativeLocationPath()) {
  -                    return false;
  -                }
  -                int left2 = fCurrentParseOp;
  -                pushParseOp(PARSEOP_AXIS_DESCENDANT_OR_SELF);
  -                int left3 = fCurrentParseOp;
  -                pushParseOp(PARSEOP_NODETEST_NODE);
  -                pushParseOp3(PARSEOP_STEP, left3, fCurrentParseOp);
  -                pushParseOp3(PARSEOP_STEPS, fCurrentParseOp, left2);
  -                pushParseOp3(PARSEOP_STEPS, left, fCurrentParseOp);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [3] RelativeLocationPath ::= Step
  -         *                            | RelativeLocationPath '/' Step
  -         *                            | RelativeLocationPath '//' Step
  -         * /
  -        boolean parseRelativeLocationPath() throws XPathException {
  -            if (!parseStep()) {
  -                return false;
  -            }
  -            while (fCurrentToken < fTokenCount) {
  -                boolean descendantOrSelf;
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_SLASH) {
  -                    descendantOrSelf = false;
  -                } else if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_OPERATOR_DOUBLE_SLASH) {
  -                    descendantOrSelf = true;
  -                } else {
  -                    break;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                int left = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (!parseStep()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return true;
  -                }
  -                if (descendantOrSelf) {
  -                    int left2 = fCurrentParseOp;
  -                    pushParseOp(PARSEOP_AXIS_DESCENDANT_OR_SELF);
  -                    int left3 = fCurrentParseOp;
  -                    pushParseOp(PARSEOP_NODETEST_NODE);
  -                    pushParseOp3(PARSEOP_STEP, left3, fCurrentParseOp);
  -                    pushParseOp3(PARSEOP_STEPS, left, fCurrentParseOp);
  -                    pushParseOp3(PARSEOP_STEPS, fCurrentParseOp, left2);
  -                } else {
  -                    pushParseOp3(PARSEOP_STEPS, left, fCurrentParseOp);
  -                }
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [4] Step ::=  (AxisName '::' | '@'?) NodeTest Predicate* | '.' | '..'
  -         * [6] AxisName ::= 'ancestor' | 'ancestor-or-self'
  -         *                | 'attribute'
  -         *                | 'child'
  -         *                | 'descendant' | 'descendant-or-self'
  -         *                | 'following' | 'following-sibling'
  -         *                | 'namespace'
  -         *                | 'parent'
  -         *                | 'preceding' | 'preceding-sibling'
  -         *                | 'self'
  -         * /
  -        boolean parseStep() throws XPathException {
  -            int parseOp;
  -            int left;
  -            boolean checkDoubleColon = true;
  -            int saveToken = fCurrentToken;
  -            int saveParseOp = fCurrentParseOp;
  -            if (fCurrentToken == fTokenCount) {
  -                return false;
  -            }
  -            switch (fTokens.getToken(fCurrentToken)) {
  -            case XPath.Tokens.EXPRTOKEN_PERIOD:
  -                fCurrentToken++;
  -                pushParseOp(PARSEOP_AXIS_SELF);
  -                left = fCurrentParseOp;
  -                pushParseOp(PARSEOP_NODETEST_NODE);
  -                pushParseOp3(PARSEOP_STEP, left, fCurrentParseOp);
  -                return true;
  -            case XPath.Tokens.EXPRTOKEN_DOUBLE_PERIOD:
  -                fCurrentToken++;
  -                pushParseOp(PARSEOP_AXIS_PARENT);
  -                left = fCurrentParseOp;
  -                pushParseOp(PARSEOP_NODETEST_NODE);
  -                pushParseOp3(PARSEOP_STEP, left, fCurrentParseOp);
  -                return true;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_ANCESTOR:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_ANCESTOR;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_ANCESTOR_OR_SELF:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_ANCESTOR_OR_SELF;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_ATSIGN:
  -                checkDoubleColon = false;
  -                // fall through
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_ATTRIBUTE:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_ATTRIBUTE;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_DESCENDANT:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_DESCENDANT;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_DESCENDANT_OR_SELF:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_DESCENDANT_OR_SELF;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_FOLLOWING:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_FOLLOWING;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_FOLLOWING_SIBLING:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_FOLLOWING_SIBLING;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_NAMESPACE:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_NAMESPACE;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_PARENT:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_PARENT;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_PRECEDING:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_PRECEDING;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_PRECEDING_SIBLING:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_PRECEDING_SIBLING;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_SELF:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_SELF;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_AXISNAME_CHILD:
  -                fCurrentToken++;
  -                parseOp = PARSEOP_AXIS_CHILD;
  -                break;
  -            default:
  -                checkDoubleColon = false;
  -                parseOp = PARSEOP_AXIS_CHILD;
  -                break;
  -            }
  -            pushParseOp(parseOp);
  -            left = fCurrentParseOp;
  -            if (checkDoubleColon) {
  -                if (fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_DOUBLE_COLON) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                fCurrentToken++;
  -            }
  -            if (fCurrentToken == fTokenCount) {
  -                fCurrentToken = saveToken;
  -                fCurrentParseOp = saveParseOp;
  -                return false;
  -            }
  -            if (!parseNodeTest()) {
  -                fCurrentToken = saveToken;
  -                fCurrentParseOp = saveParseOp;
  -                return false;
  -            }
  -            pushParseOp3(PARSEOP_STEP, left, fCurrentParseOp);
  -            left = fCurrentParseOp;
  -            if (parsePredicates()) {
  -                pushParseOp3(PARSEOP_FILTER, left, fCurrentParseOp);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [7] NodeTest ::= '*'
  -         *                | NCName ':' '*'
  -         *                | QName
  -         *                | 'comment' '(' ')'
  -         *                | 'text' '(' ')'
  -         *                | 'processing-instruction' '(' Literal? ')'
  -         *                | 'node' '(' ')'
  -         * [29] Literal ::= '"' [^"]* '"' | "'" [^']* "'"
  -         * /
  -        boolean parseNodeTest() throws XPathException {
  -            int parseOp;
  -            int prefix;
  -            int name;
  -            if (fCurrentToken == fTokenCount) {
  -                return false;
  -            }
  -            switch (fTokens.getToken(fCurrentToken)) {
  -            case XPath.Tokens.EXPRTOKEN_NAMETEST_ANY:
  -                fCurrentToken++;
  -                pushParseOp(PARSEOP_NODETEST_ANY);
  -                return true;
  -            case XPath.Tokens.EXPRTOKEN_NAMETEST_NAMESPACE:
  -                prefix = fTokens.getToken(++fCurrentToken);
  -                fCurrentToken++;
  -                pushParseOp2(PARSEOP_NODETEST_NAMESPACE, prefix);
  -                return true;
  -            case XPath.Tokens.EXPRTOKEN_NAMETEST_QNAME:
  -                prefix = fTokens.getToken(++fCurrentToken);
  -                name = fTokens.getToken(++fCurrentToken);
  -                fCurrentToken++;
  -                pushParseOp3(PARSEOP_NODETEST_QNAME, prefix, name);
  -                return true;
  -            case XPath.Tokens.EXPRTOKEN_NODETYPE_COMMENT:
  -                parseOp = PARSEOP_NODETEST_COMMENT;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_NODETYPE_TEXT:
  -                parseOp = PARSEOP_NODETEST_TEXT;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_NODETYPE_PI:
  -                parseOp = PARSEOP_NODETEST_PI;
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_NODETYPE_NODE:
  -                parseOp = PARSEOP_NODETEST_NODE;
  -                break;
  -            default:
  -                return false;
  -            }
  -            int saveToken = fCurrentToken;
  -            int saveParseOp = fCurrentParseOp;
  -            int left = fCurrentParseOp;
  -            if (++fCurrentToken == fTokenCount) {
  -                fCurrentToken = saveToken;
  -                fCurrentParseOp = saveParseOp;
  -                return false;
  -            }
  -            if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPEN_PAREN) {
  -                fCurrentToken = saveToken;
  -                fCurrentParseOp = saveParseOp;
  -                return false;
  -            }
  -            if (++fCurrentToken == fTokenCount) {
  -                fCurrentToken = saveToken;
  -                fCurrentParseOp = saveParseOp;
  -                return false;
  -            }
  -            if (parseOp == PARSEOP_NODETEST_PI && fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_LITERAL) {
  -                int target = fTokens.getToken(++fCurrentToken);
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_CLOSE_PAREN) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                fCurrentToken++;
  -                pushParseOp2(PARSEOP_NODETEST_PI_TARGET, target);
  -            } else {
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_CLOSE_PAREN) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                fCurrentToken++;
  -                pushParseOp(parseOp);
  -            }
  -            return true;
  -        }
  -
  -        /**
  -         * [8] Predicate ::= '[' PredicateExpr ']'
  -         * [9] PredicateExpr ::= Expr
  -         * [4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
  -         * [20] FilterExpr ::= PrimaryExpr Predicate*
  -         * /
  -        boolean parsePredicates() throws XPathException {
  -            int left = -1;
  -            boolean found = false;
  -            while (true) {
  -                if (fCurrentToken == fTokenCount || fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPEN_BRACKET) {
  -                    return found;
  -                }
  -                int saveToken = fCurrentToken;
  -                int saveParseOp = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount || !parseExpr() ||
  -                    fCurrentToken == fTokenCount || fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_CLOSE_BRACKET) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return found;
  -                }
  -                fCurrentToken++;
  -                found = true;
  -                pushParseOp2(PARSEOP_PREDICATE, fCurrentParseOp);
  -                if (left != -1) {
  -                    pushParseOp3(PARSEOP_PREDICATES, left, fCurrentParseOp);
  -                }
  -                left = fCurrentParseOp;
  -            }
  -        }
  -
  -        /**
  -         * [15] PrimaryExpr ::= '$' QName
  -         *                    | '(' Expr ')'
  -         *                    | '"' [^"]* '"' | "'" [^']* "'"
  -         *                    | ([0-9]+) ('.' ([0-9]+)?)? | '.' Digits
  -         *                    | (QName - NodeType) '(' ( Expr ( ',' Expr )* )? ')'
  -         * /
  -        boolean parsePrimaryExpr() throws XPathException {
  -            int prefix;
  -            int handle;
  -            int saveToken;
  -            int saveParseOp;
  -            if (fCurrentToken == fTokenCount) {
  -                return false;
  -            }
  -            switch (fTokens.getToken(fCurrentToken)) {
  -            case XPath.Tokens.EXPRTOKEN_VARIABLE_REFERENCE:
  -                prefix = fTokens.getToken(++fCurrentToken);
  -                handle = fTokens.getToken(++fCurrentToken); // localpart
  -                fCurrentToken++;
  -                pushParseOp3(PARSEOP_VARIABLE_REFERENCE, prefix, handle);
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_OPEN_PAREN:
  -                saveToken = fCurrentToken;
  -                saveParseOp = fCurrentParseOp;
  -                if (++fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                if (!parseExpr()) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                if (fCurrentToken == fTokenCount) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_CLOSE_PAREN) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                fCurrentToken++;
  -                pushParseOp2(PARSEOP_GROUPING, fCurrentParseOp);
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_LITERAL:
  -                handle = fTokens.getToken(++fCurrentToken);
  -                fCurrentToken++;
  -                pushParseOp2(PARSEOP_LITERAL, handle);
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_NUMBER:
  -                int whole = fTokens.getToken(++fCurrentToken);
  -                int part = fTokens.getToken(++fCurrentToken);
  -                fCurrentToken++;
  -                pushParseOp3(PARSEOP_NUMBER, whole, part);
  -                break;
  -            case XPath.Tokens.EXPRTOKEN_FUNCTION_NAME:
  -                saveToken = fCurrentToken;
  -                saveParseOp = fCurrentParseOp;
  -                prefix = fTokens.getToken(++fCurrentToken);
  -                handle = fTokens.getToken(++fCurrentToken); // localpart
  -                fCurrentToken++;
  -                pushParseOp3(PARSEOP_FUNCTION_NAME, prefix, handle);
  -                if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_OPEN_PAREN) {
  -                    fCurrentToken = saveToken;
  -                    fCurrentParseOp = saveParseOp;
  -                    return false;
  -                }
  -                fCurrentToken++;
  -                int funcName = fCurrentParseOp;
  -                int nextArg = -1;
  -                if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_CLOSE_PAREN) {
  -                    fCurrentToken++;
  -                } else {
  -                    while (true) {
  -                        if (!parseExpr()) {
  -                            fCurrentToken = saveToken;
  -                            fCurrentParseOp = saveParseOp;
  -                            return false;
  -                        }
  -                        if (nextArg != -1) {
  -                            pushParseOp3(PARSEOP_FUNCTION_ARGUMENTS, nextArg, fCurrentParseOp);
  -                        }
  -                        nextArg = fCurrentParseOp;
  -                        if (fTokens.getToken(fCurrentToken) == XPath.Tokens.EXPRTOKEN_CLOSE_PAREN) {
  -                            fCurrentToken++;
  -                            break;
  -                        }
  -                        if (fTokens.getToken(fCurrentToken) != XPath.Tokens.EXPRTOKEN_COMMA) {
  -                            fCurrentToken = saveToken;
  -                            fCurrentParseOp = saveParseOp;
  -                            return false;
  -                        }
  -                        fCurrentToken++;
  -                    }
  -                }
  -                pushParseOp3(PARSEOP_FUNCTION, funcName, nextArg);
  -                break;
  -            default:
  -                return false;
  -            }
  -            return true;
  -        }
  -
  -        //
  -        // MAIN
  -        //
  -
  -        public static void main(String argv[]) {
  -            for (int i = 0; i < argv.length; i++) {
  -                String expression = argv[i];
  -                System.out.println("# XPath expression: "+expression);
  -                XPathExprParser parser = new XPathExprParser();
  -                try {
  -                    parser.parseExpr(expression);
  -                }
  -                catch (Exception e) {
  -                    e.printStackTrace();
  -                }
  -            }
  -        }
  -
  -    } // class XPathExprParser
  -    /***/
   
       //
       // MAIN
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org