📄 xpath.java
字号:
// // Data // /** Symbol table. */ private SymbolTable fSymbolTable; // symbols private static final String fAndSymbol = "and".intern(); private static final String fOrSymbol = "or".intern(); private static final String fModSymbol = "mod".intern(); private static final String fDivSymbol = "div".intern(); private static final String fCommentSymbol = "comment".intern(); private static final String fTextSymbol = "text".intern(); private static final String fPISymbol = "processing-instruction".intern(); private static final String fNodeSymbol = "node".intern(); private static final String fAncestorSymbol = "ancestor".intern(); private static final String fAncestorOrSelfSymbol = "ancestor-or-self".intern(); private static final String fAttributeSymbol = "attribute".intern(); private static final String fChildSymbol = "child".intern(); private static final String fDescendantSymbol = "descendant".intern(); private static final String fDescendantOrSelfSymbol = "descendant-or-self".intern(); private static final String fFollowingSymbol = "following".intern(); private static final String fFollowingSiblingSymbol = "following-sibling".intern(); private static final String fNamespaceSymbol = "namespace".intern(); private static final String fParentSymbol = "parent".intern(); private static final String fPrecedingSymbol = "preceding".intern(); private static final String fPrecedingSiblingSymbol = "preceding-sibling".intern(); private static final String fSelfSymbol = "self".intern(); // // Constructors // /** Constructs an XPath expression scanner. */ public Scanner(SymbolTable symbolTable) { // save pool and tokens fSymbolTable = symbolTable; } // <init>(SymbolTable) /** * */ public boolean scanExpr(SymbolTable symbolTable, XPath.Tokens tokens, String data, int currentOffset, int endOffset) throws XPathException { int nameOffset; String nameHandle, prefixHandle; boolean starIsMultiplyOperator = false; int ch; while (true) { if (currentOffset == endOffset) { break; } ch = data.charAt(currentOffset); // // [39] ExprWhitespace ::= S // while (ch == ' ' || ch == 0x0A || ch == 0x09 || ch == 0x0D) { if (++currentOffset == endOffset) { break; } ch = data.charAt(currentOffset); } if (currentOffset == endOffset) { break; } // // [28] ExprToken ::= '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::' // | NameTest | NodeType | Operator | FunctionName // | AxisName | Literal | Number | VariableReference // byte chartype = (ch >= 0x80) ? CHARTYPE_NONASCII : fASCIICharMap[ch]; switch (chartype) { case CHARTYPE_OPEN_PAREN: // '(' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPEN_PAREN); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_CLOSE_PAREN: // ')' addToken(tokens, XPath.Tokens.EXPRTOKEN_CLOSE_PAREN); starIsMultiplyOperator = true; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_OPEN_BRACKET: // '[' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPEN_BRACKET); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_CLOSE_BRACKET: // ']' addToken(tokens, XPath.Tokens.EXPRTOKEN_CLOSE_BRACKET); starIsMultiplyOperator = true; if (++currentOffset == endOffset) { break; } break; // // [30] Number ::= Digits ('.' Digits?)? | '.' Digits // ^^^^^^^^^^ // case CHARTYPE_PERIOD: // '.', '..' or '.' Digits if (currentOffset + 1 == endOffset) { addToken(tokens, XPath.Tokens.EXPRTOKEN_PERIOD); starIsMultiplyOperator = true; currentOffset++; break; } ch = data.charAt(currentOffset + 1); if (ch == '.') { // '..' addToken(tokens, XPath.Tokens.EXPRTOKEN_DOUBLE_PERIOD); starIsMultiplyOperator = true; currentOffset += 2; } else if (ch >= '0' && ch <= '9') { addToken(tokens, XPath.Tokens.EXPRTOKEN_NUMBER); starIsMultiplyOperator = true; currentOffset = scanNumber(tokens, data, endOffset, currentOffset/*, encoding*/); } else if (ch == '/') { addToken(tokens, XPath.Tokens.EXPRTOKEN_PERIOD); starIsMultiplyOperator = true; currentOffset++; } else if (ch == '|') { addToken(tokens, XPath.Tokens.EXPRTOKEN_PERIOD); starIsMultiplyOperator = true; currentOffset++; break; } else if (ch == ' ' || ch == 0x0A || ch == 0x09 || ch == 0x0D) { // this is legal if the next token is non-existent or | do { if (++currentOffset == endOffset) { break; } ch = data.charAt(currentOffset); } while (ch == ' ' || ch == 0x0A || ch == 0x09 || ch == 0x0D); if (currentOffset == endOffset || ch == '|') { addToken(tokens, XPath.Tokens.EXPRTOKEN_PERIOD); starIsMultiplyOperator = true; break; } throw new XPathException ("c-general-xpath"); } else { // '.' throw new XPathException ("c-general-xpath"); } if (currentOffset == endOffset) { break; } break; case CHARTYPE_ATSIGN: // '@' addToken(tokens, XPath.Tokens.EXPRTOKEN_ATSIGN); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_COMMA: // ',' addToken(tokens, XPath.Tokens.EXPRTOKEN_COMMA); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_COLON: // '::' if (++currentOffset == endOffset) { // System.out.println("abort 1a"); return false; // REVISIT } ch = data.charAt(currentOffset); if (ch != ':') { // System.out.println("abort 1b"); return false; // REVISIT } addToken(tokens, XPath.Tokens.EXPRTOKEN_DOUBLE_COLON); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_SLASH: // '/' and '//' if (++currentOffset == endOffset) { addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_SLASH); starIsMultiplyOperator = false; break; } ch = data.charAt(currentOffset); if (ch == '/') { // '//' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_DOUBLE_SLASH); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } } else { addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_SLASH); starIsMultiplyOperator = false; } break; case CHARTYPE_UNION: // '|' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_UNION); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_PLUS: // '+' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_PLUS); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_MINUS: // '-' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_MINUS); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_EQUAL: // '=' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_EQUAL); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_EXCLAMATION: // '!=' if (++currentOffset == endOffset) { // System.out.println("abort 2a"); return false; // REVISIT } ch = data.charAt(currentOffset); if (ch != '=') { // System.out.println("abort 2b"); return false; // REVISIT } addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_NOT_EQUAL); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } break; case CHARTYPE_LESS: // '<' and '<=' if (++currentOffset == endOffset) { addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_LESS); starIsMultiplyOperator = false; break; } ch = data.charAt(currentOffset); if (ch == '=') { // '<=' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_LESS_EQUAL); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } } else { addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_LESS); starIsMultiplyOperator = false; } break; case CHARTYPE_GREATER: // '>' and '>=' if (++currentOffset == endOffset) { addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_GREATER); starIsMultiplyOperator = false; break; } ch = data.charAt(currentOffset); if (ch == '=') { // '>=' addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_GREATER_EQUAL); starIsMultiplyOperator = false; if (++currentOffset == endOffset) { break; } } else { addToken(tokens, XPath.Tokens.EXPRTOKEN_OPERATOR_GREATER); starIsMultiplyOperator = false; } break; // // [29] Literal ::= '"' [^"]* '"' | "'" [^']* "'" // case CHARTYPE_QUOTE: // '\"' or '\'' int qchar = ch; if (++currentOffset == endOffset) { // System.out.println("abort 2c"); return false; // REVISIT } ch = data.charAt(currentOffset); int litOffset = currentOffset; while (ch != qchar) { if (++currentOffset == endOffset) { // System.out.println("abort 2d"); return false; // REVISIT } ch = data.charAt(currentOffset); } int litLength = currentOffset - litOffset; addToken(tokens, XPath.Tokens.EXPRTOKEN_LITERAL); starIsMultiplyOperator = true; tokens.addToken(symbolTable.addSymbol(data.substring(litOffset, litOffset + litLength))); if (++currentOffset == endOffset) { break; } break; // // [30] Number ::= Digits ('.' Digits?)? | '.' Digits // [31] Digits ::= [0-9]+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -