?? 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,2001 (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.1 $ $Date: 2004/11/26 01:50:45 $
* @author <a href="mailto:tima@intalio.com">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() {
// 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 )?
{
## = (esc != null)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -