📄 selector.g
字号:
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 + -