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

📄 selector.g

📁 OpenJMS是一个开源的Java Message Service API 1.0.2 规范的实现,它包含有以下特性: *. 它既支持点到点(point-to-point)(PTP)模型和发布/订
💻 G
📖 第 1 页 / 共 2 页
字号:
header{/** * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright *    statements and notices.  Redistributions must also contain a *    copy of this document. * * 2. Redistributions in binary form must reproduce the *    above copyright notice, this list of conditions and the *    following disclaimer in the documentation and/or other *    materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote *    products derived from this Software without prior written *    permission of Exoffice Technologies.  For written permission, *    please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" *    nor may "Exolab" appear in their names without prior written *    permission of Exoffice Technologies. Exolab is a registered *    trademark of Exoffice Technologies. * * 5. Due credit should be given to the Exolab Project *    (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 2000-2005 (C) Exoffice Technologies Inc. All Rights Reserved. */     package org.exolab.jms.selector.parser;    import org.exolab.jms.selector.Context;    import org.exolab.jms.selector.Identifiers;    import org.exolab.jms.selector.SelectorException;    import org.exolab.jms.selector.Type;/** * Selector parser * * @version     $Revision: 1.2 $ $Date: 2005/11/12 13:47:56 $ * @author      <a href="mailto:tma@netspace.net.au">Tim Anderson</a> * @see         SelectorLexer * @see         SelectorTreeParser */}class SelectorParser extends Parser;options {    exportVocab = Selector;         // call this vocabulary "Selector"    k = 2;                          // two token lookahead    buildAST = true;                // build tree    ASTLabelType = "SelectorAST";   // cast nodes to SelectorAST    defaultErrorHandler = false;    // abort parsing on error}tokens {    // tokens used in tree generation    UNARY_MINUS;}{    public void initialise() {        setASTFactory(new SelectorASTFactory());        // construct SelectorAST nodes        setASTNodeClass(SelectorAST.class.getName());    }    private void rethrow(String msg, AST node, Token token)        throws SelectorException {        if (node != null) {            throw new SelectorException(((SelectorAST) node).getContext(),                 msg);        } else {            Context context = new Context(token.getLine(), token.getColumn());            throw new SelectorException(context, msg);        }    }}selector    :   orExpression        EOF!    ;    exception    catch [NoViableAltException error]     {        rethrow(error.getMessage(), error.node, error.token);    }    catch [MismatchedTokenException error]    {        rethrow(error.getMessage(), error.node, error.token);    }orExpression    :   andExpression         ( "or"^             {                 ##.setReturnType(Type.BOOLEAN);             }             andExpression         )*    ;andExpression    :   notExpression         ( "and"^             {                 ##.setReturnType(Type.BOOLEAN);             }             notExpression         )*    ;notExpression    :   ( "not"^             {                 ##.setReturnType(Type.BOOLEAN);             }         ) ?         expression    ;expression!    :   expr:sumExpression         (            bool:booleanExpression[#expr] { #expr = #bool; }        |   comp:comparisonExpression[#expr] { #expr = #comp; }        )?        {            ## = #expr;        }    ;comparisonExpression![SelectorAST lhs]    :   (   EQUAL eq:sumExpression             {                 ## = #(EQUAL, lhs, #eq);             }        |   NOT_EQUAL ne:sumExpression             {                 ## = #(NOT_EQUAL, lhs, #ne);             }        |   LT lt:sumExpression             {                 ## = #(LT, lhs, #lt);             }        |   GT gt:sumExpression             {                 ## = #(GT, lhs, #gt);             }        |   LE le:sumExpression             {                 ## = #(LE, lhs, #le);             }        |   GE ge:sumExpression             {                 ## = #(GE, lhs, #ge);             }        )        {            ##.setReturnType(Type.BOOLEAN);        }    ;sumExpression    :   productExpression         (            ( PLUS^ | MINUS^ )             {                 ##.setReturnType(Type.NUMERIC);             }            productExpression         )*    ;productExpression    :   unaryExpression         (( MULTIPLY^ | DIVIDE^ )             {                 ##.setReturnType(Type.NUMERIC);             }            unaryExpression )*    ;unaryExpression    :   MINUS^         {             ##.setType(UNARY_MINUS);             ##.setReturnType(Type.NUMERIC);        }         unaryExpression    |   PLUS! unaryExpression    |   term    ;term    :   LPAREN orExpression RPAREN    |   literal    |   ident:IDENT        {            String name = ident.getText();            if (Identifiers.isJMSIdentifier(name)) {                if (Identifiers.isNumeric(name)) {                    #ident.setReturnType(Type.NUMERIC);                } else if (Identifiers.isString(name)) {                    #ident.setReturnType(Type.STRING);                } else {                    String msg = "invalid message header identifier: " + name;                    throw new SelectorException(#ident.getContext(), msg);                }            }        }    ;booleanExpression[SelectorAST lhs]    :   isExpression[lhs]    |   ( "not"^ ) ?         (   betweenExpression[lhs]        |   likeExpression[lhs]        |   inExpression[lhs]        )    ;isExpression![SelectorAST lhs]    :   is:"is" ( not:"not" )? nul:"null"        {            ## = #(#is, lhs, #nul);            if (not != null)            {                ## = #(#not, ##);                ##.setReturnType(Type.BOOLEAN);            }            ##.setReturnType(Type.BOOLEAN);        }    ;betweenExpression![SelectorAST lhs]    :   btw:"between" sum1:sumExpression "and" sum2:sumExpression        {             ## = #(#btw, lhs, #sum1, #sum2);            ##.setReturnType(Type.BOOLEAN);        }    ;inExpression![SelectorAST lhs]    :   in:"in" LPAREN values:valueList RPAREN        {            ## = #(#in, lhs, LPAREN, #values, RPAREN);            ##.setReturnType(Type.BOOLEAN);        }    ;likeExpression![SelectorAST lhs]    :   like:"like" pattern:STRING_LITERAL             ( esc:"escape" escape:STRING_LITERAL )?        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -