⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpathreader.java

📁 XML的解析、编译、查询等技术的JAVA源代码。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                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 + -