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