📄 xpathreader.java
字号:
match( TokenTypes.AT ); axis = Axis.ATTRIBUTE; break; } case TokenTypes.IDENTIFIER: { Token token = LT( 1 ); axis = Axis.lookup( token.getTokenText() ); if ( axis == Axis.INVALID_AXIS ) { throwInvalidAxis( token.getTokenText() ); } match( TokenTypes.IDENTIFIER ); match( TokenTypes.DOUBLE_COLON ); break; } } return axis; } private void nodeTest(int axis) throws SAXPathException { switch ( LA(1) ) { case TokenTypes.IDENTIFIER: { switch ( LA(2) ) { case TokenTypes.LEFT_PAREN: { nodeTypeTest( axis ); break; } default: { nameTest( axis ); break; } } break; } case TokenTypes.STAR: { nameTest( axis ); break; } default: XPathSyntaxException ex = createSyntaxException("Expected <QName> or *"); throw ex; } } private void nodeTypeTest(int axis) throws SAXPathException { Token nodeTypeToken = match( TokenTypes.IDENTIFIER ); String nodeType = nodeTypeToken.getTokenText(); match( TokenTypes.LEFT_PAREN ); if ( "processing-instruction".equals( nodeType ) ) { String piName = ""; if ( LA(1) == TokenTypes.LITERAL ) { piName = match( TokenTypes.LITERAL ).getTokenText(); } match( TokenTypes.RIGHT_PAREN ); getXPathHandler().startProcessingInstructionNodeStep( axis, piName ); predicates(); getXPathHandler().endProcessingInstructionNodeStep(); } else if ( "node".equals( nodeType ) ) { match( TokenTypes.RIGHT_PAREN ); getXPathHandler().startAllNodeStep( axis ); predicates(); getXPathHandler().endAllNodeStep(); } else if ( "text".equals( nodeType ) ) { match( TokenTypes.RIGHT_PAREN ); getXPathHandler().startTextNodeStep( axis ); predicates(); getXPathHandler().endTextNodeStep(); } else if ( "comment".equals( nodeType ) ) { match( TokenTypes.RIGHT_PAREN ); getXPathHandler().startCommentNodeStep( axis ); predicates(); getXPathHandler().endCommentNodeStep(); } else { XPathSyntaxException ex = createSyntaxException( "Expected node-type" ); throw ex; } } private void nameTest(int axis) throws SAXPathException { String prefix = null; String localName = null; switch ( LA(2) ) { case TokenTypes.COLON: { switch ( LA(1) ) { case TokenTypes.IDENTIFIER: { prefix = match( TokenTypes.IDENTIFIER ).getTokenText(); match( TokenTypes.COLON ); break; } } break; } } switch ( LA(1) ) { case TokenTypes.IDENTIFIER: { localName = match( TokenTypes.IDENTIFIER ).getTokenText(); break; } case TokenTypes.STAR: { match( TokenTypes.STAR ); localName = "*"; break; } } if ( prefix == null ) { prefix = ""; } getXPathHandler().startNameStep( axis, prefix, localName ); predicates(); getXPathHandler().endNameStep(); } private void abbrStep() throws SAXPathException { switch ( LA(1) ) { case TokenTypes.DOT: { match( TokenTypes.DOT ); getXPathHandler().startAllNodeStep( Axis.SELF ); predicates(); getXPathHandler().endAllNodeStep(); break; } case TokenTypes.DOT_DOT: { match( TokenTypes.DOT_DOT ); getXPathHandler().startAllNodeStep( Axis.PARENT ); predicates(); getXPathHandler().endAllNodeStep(); break; } } } private void predicates() throws SAXPathException { while (true ) { if ( LA(1) == TokenTypes.LEFT_BRACKET ) { predicate(); } else { break; } } } void predicate() throws SAXPathException { getXPathHandler().startPredicate(); match( TokenTypes.LEFT_BRACKET ); predicateExpr(); match( TokenTypes.RIGHT_BRACKET ); getXPathHandler().endPredicate(); } private void predicateExpr() throws SAXPathException { expr(); } private void expr() throws SAXPathException { orExpr(); } private void orExpr() throws SAXPathException { getXPathHandler().startOrExpr(); andExpr(); boolean create = false; switch ( LA(1) ) { case TokenTypes.OR: { create = true; match( TokenTypes.OR ); orExpr(); break; } } getXPathHandler().endOrExpr( create ); } private void andExpr() throws SAXPathException { getXPathHandler().startAndExpr(); equalityExpr(); boolean create = false; switch ( LA(1) ) { case TokenTypes.AND: { create = true; match( TokenTypes.AND ); andExpr(); break; } } getXPathHandler().endAndExpr( create ); } private void equalityExpr() throws SAXPathException { relationalExpr(); int la = LA(1); while (la == TokenTypes.EQUALS || la == TokenTypes.NOT_EQUALS) { switch ( la ) { case TokenTypes.EQUALS: { match( TokenTypes.EQUALS ); getXPathHandler().startEqualityExpr(); relationalExpr(); getXPathHandler().endEqualityExpr( Operator.EQUALS ); break; } case TokenTypes.NOT_EQUALS: { match( TokenTypes.NOT_EQUALS ); getXPathHandler().startEqualityExpr(); relationalExpr(); getXPathHandler().endEqualityExpr( Operator.NOT_EQUALS ); break; } } la = LA(1); } } private void relationalExpr() throws SAXPathException { additiveExpr(); int la = LA(1); // Very important: TokenTypes.LESS_THAN != Operator.LESS_THAN // TokenTypes.GREATER_THAN != Operator.GREATER_THAN // TokenTypes.GREATER_THAN_EQUALS != Operator.GREATER_THAN_EQUALS // TokenTypes.LESS_THAN_EQUALS != Operator.LESS_THAN_EQUALS while (la == TokenTypes.LESS_THAN_SIGN || la == TokenTypes.GREATER_THAN_SIGN || la == TokenTypes.LESS_THAN_OR_EQUALS_SIGN || la == TokenTypes.GREATER_THAN_OR_EQUALS_SIGN ) { switch ( la ) { case TokenTypes.LESS_THAN_SIGN: { match( TokenTypes.LESS_THAN_SIGN ); getXPathHandler().startRelationalExpr(); additiveExpr(); getXPathHandler().endRelationalExpr( Operator.LESS_THAN ); break; } case TokenTypes.GREATER_THAN_SIGN: { match( TokenTypes.GREATER_THAN_SIGN ); getXPathHandler().startRelationalExpr(); additiveExpr(); getXPathHandler().endRelationalExpr( Operator.GREATER_THAN ); break; } case TokenTypes.GREATER_THAN_OR_EQUALS_SIGN: { match( TokenTypes.GREATER_THAN_OR_EQUALS_SIGN ); getXPathHandler().startRelationalExpr(); additiveExpr(); getXPathHandler().endRelationalExpr( Operator.GREATER_THAN_EQUALS ); break; } case TokenTypes.LESS_THAN_OR_EQUALS_SIGN: { match( TokenTypes.LESS_THAN_OR_EQUALS_SIGN ); getXPathHandler().startRelationalExpr(); additiveExpr(); getXPathHandler().endRelationalExpr( Operator.LESS_THAN_EQUALS ); break; } } la = LA(1); } } private void additiveExpr() throws SAXPathException { multiplicativeExpr(); int la = LA(1); while (la == TokenTypes.PLUS || la == TokenTypes.MINUS) { switch ( la ) { case TokenTypes.PLUS: { match( TokenTypes.PLUS ); getXPathHandler().startAdditiveExpr(); multiplicativeExpr(); getXPathHandler().endAdditiveExpr( Operator.ADD ); break; } case TokenTypes.MINUS: { match( TokenTypes.MINUS ); getXPathHandler().startAdditiveExpr(); multiplicativeExpr(); getXPathHandler().endAdditiveExpr( Operator.SUBTRACT ); break; } } la = LA(1); } } private void multiplicativeExpr() throws SAXPathException { unaryExpr(); int la = LA(1); while (la == TokenTypes.STAR || la == TokenTypes.DIV || la == TokenTypes.MOD) { switch ( la ) { case TokenTypes.STAR: { match( TokenTypes.STAR ); getXPathHandler().startMultiplicativeExpr(); unaryExpr(); getXPathHandler().endMultiplicativeExpr( Operator.MULTIPLY ); break; } case TokenTypes.DIV: { match( TokenTypes.DIV ); getXPathHandler().startMultiplicativeExpr(); unaryExpr(); getXPathHandler().endMultiplicativeExpr( Operator.DIV ); break; } case TokenTypes.MOD: { match( TokenTypes.MOD ); getXPathHandler().startMultiplicativeExpr(); unaryExpr(); getXPathHandler().endMultiplicativeExpr( Operator.MOD ); break; } } la = LA(1); } } private void unaryExpr() throws SAXPathException { switch ( LA(1) ) { case TokenTypes.MINUS: { getXPathHandler().startUnaryExpr(); match( TokenTypes.MINUS ); unaryExpr(); getXPathHandler().endUnaryExpr( Operator.NEGATIVE ); break; } default: { unionExpr(); break; } } } private void unionExpr() throws SAXPathException { getXPathHandler().startUnionExpr(); pathExpr(); boolean create = false; switch ( LA(1) ) { case TokenTypes.PIPE: { match( TokenTypes.PIPE ); create = true; expr(); break; } } getXPathHandler().endUnionExpr( create ); } private Token match(int tokenType) throws XPathSyntaxException { LT(1); Token token = (Token) tokens.get( 0 ); if ( token.getTokenType() == tokenType ) { tokens.remove(0); return token; } XPathSyntaxException ex = createSyntaxException( "Expected: " + TokenTypes.getTokenText( tokenType ) ); throw ex; } private int LA(int position) { return LT(position).getTokenType(); } // XXX This method's a HotSpot; could we improve it? private Token LT(int position) { if ( tokens.size() <= ( position - 1 ) ) { for ( int i = 0 ; i < position ; ++i ) { tokens.add( lexer.nextToken() ); } } return (Token) tokens.get( position - 1 ); } private boolean isNodeTypeName(Token name) { String text = name.getTokenText(); if ( "node".equals( text ) || "comment".equals( text ) || "text".equals( text ) || "processing-instruction".equals( text ) ) { return true; } return false; } private XPathSyntaxException createSyntaxException(String message) { String xpath = this.lexer.getXPath(); int position = LT(1).getTokenBegin(); return new XPathSyntaxException( xpath, position, message ); } private void throwInvalidAxis(String invalidAxis) throws SAXPathException { String xpath = this.lexer.getXPath(); int position = LT(1).getTokenBegin(); String message = "Expected valid axis name instead of [" + invalidAxis + "]"; throw new XPathSyntaxException( xpath, position, message ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -