📄 selectortree.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,2003 (C) Exoffice Technologies Inc. All Rights Reserved.
*/
package org.exolab.jms.selector.parser;
import java.util.HashSet;
import org.exolab.jms.selector.Context;
import org.exolab.jms.selector.Expression;
import org.exolab.jms.selector.ExpressionFactory;
import org.exolab.jms.selector.SelectorException;
import org.exolab.jms.selector.Type;
/**
* Selector tree parser
*
* @version $Revision: 1.4 $ $Date: 2003/08/10 07:33:39 $
* @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a>
* @see SelectorParser
* @see SelectorTreeParser
*/
}
class SelectorTreeParser extends TreeParser;
options
{
importVocab = Selector;
ASTLabelType = "SelectorAST"; // cast AST nodes to SelectorAST
defaultErrorHandler = false; // abort parsing on error
}
{
/**
* The factory for creating expressions
*/
private ExpressionFactory _factory;
public void initialise(ExpressionFactory factory) {
_factory = factory;
}
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 returns [Expression expr]
{
expr = null;
}
: expr = p:primaryExpression
{
TypeChecker.check(p, Type.BOOLEAN);
}
;
exception
catch [NoViableAltException error]
{
rethrow(error.getMessage(), error.node, error.token);
}
catch [MismatchedTokenException error]
{
rethrow(error.getMessage(), error.node, error.token);
}
primaryExpression returns [Expression expr]
{
expr = null;
AST ast = ##_in;
SelectorAST left = null;
SelectorAST right = null;
Expression lhs = null;
Expression rhs = null;
}
: #("not" expr = p:primaryExpression)
{
TypeChecker.check(ast.getText(), p, Type.BOOLEAN);
expr = _factory.unaryOperator(ast.getType(), expr);
}
|
( #("or" lhs = orl:primaryExpression rhs = orr:primaryExpression)
{
TypeChecker.check(ast.getText(), orl, orr, Type.BOOLEAN);
}
| #("and" lhs = andl:primaryExpression rhs = andr:primaryExpression)
{
TypeChecker.check(ast.getText(), andl, andr, Type.BOOLEAN);
}
)
{
expr = _factory.binaryOperator(ast.getType(), lhs, rhs);
}
|
( #(EQUAL lhs = eql:expression rhs = eqr:expression)
{
TypeChecker.checkComparison(ast.getText(), eql, eqr);
}
| #(NOT_EQUAL lhs = nel:expression rhs = ner:expression)
{
TypeChecker.checkComparison(ast.getText(), nel, ner);
}
)
{
expr = _factory.binaryOperator(ast.getType(), lhs, rhs);
}
|
( #(LT lhs = ltl:expression rhs = ltr:expression)
{
TypeChecker.check(ast.getText(), ltl, ltr, Type.NUMERIC);
}
| #(GT lhs = gtl:expression rhs = gtr:expression)
{
TypeChecker.check(ast.getText(), gtl, gtr, Type.NUMERIC);
}
| #(LE lhs = lel:expression rhs = ler:expression)
{
TypeChecker.check(ast.getText(), lel, ler, Type.NUMERIC);
}
| #(GE lhs = gel:expression rhs = ger:expression)
{
TypeChecker.check(ast.getText(), gel, ger, Type.NUMERIC);
}
)
{
expr = _factory.binaryOperator(ast.getType(), lhs, rhs);
}
| expr = expression
| expr = booleanExpression
;
expression returns [Expression expr]
{
expr = null;
AST ast = ##_in;
Expression lhs = null;
Expression rhs = null;
}
: ( #(PLUS lhs = plusl:expression rhs = plusr:expression)
{
TypeChecker.check(ast.getText(), plusl, plusr, Type.NUMERIC);
}
| #(MINUS lhs = minusl:expression rhs = minusr:expression)
{
TypeChecker.check(ast.getText(), minusl, minusr, Type.NUMERIC);
}
| #(MULTIPLY lhs = multl:expression rhs = multr:expression)
{
TypeChecker.check(ast.getText(), multl, multr, Type.NUMERIC);
}
| #(DIVIDE lhs = divl:expression rhs = divr:expression)
{
TypeChecker.check(ast.getText(), divl, divr, Type.NUMERIC);
}
)
{
expr = _factory.binaryOperator(ast.getType(), lhs, rhs);
}
| expr = term
;
booleanExpression returns [Expression expr]
{
expr = null;
}
: expr = isExpression
| expr = betweenExpression
| expr = likeExpression
| expr = inExpression
;
isExpression returns [Expression expr]
{
expr = null;
}
: #("is" id:IDENT "null")
{
Expression ident = _factory.identifier(#id.getText());
expr = _factory.isNull(ident);
}
;
betweenExpression returns [Expression expr]
{
expr = null;
Expression sum1 = null;
Expression sum2 = null;
}
: #("between" expr = e:primaryExpression
sum1 = s1:primaryExpression
sum2 = s2:primaryExpression )
{
TypeChecker.check(e, Type.NUMERIC);
TypeChecker.check(s1, Type.NUMERIC);
TypeChecker.check(s2, Type.NUMERIC);
expr = _factory.between(expr, sum1, sum2);
}
;
likeExpression returns [Expression expr]
{
expr = null;
}
: #("like" id:IDENT pat:STRING_LITERAL ( "escape" esc:STRING_LITERAL )? )
{
TypeChecker.check(id, Type.STRING);
PatternValidator.validate(pat, esc);
Expression ident = _factory.identifier(#id.getText());
String escape = (esc != null) ? esc.getText() : null;
expr = _factory.like(ident, #pat.getText(), escape);
}
;
inExpression returns [Expression expr]
{
expr = null;
HashSet set;
}
: #("in" id:IDENT LPAREN set = valueList RPAREN)
{
TypeChecker.check(id, Type.STRING);
Expression ident = _factory.identifier(#id.getText());
expr = _factory.in(ident, set);
}
;
valueList returns [HashSet set]
{
set = new HashSet();
}
: first:STRING_LITERAL { set.add(#first.getText()); }
( next:STRING_LITERAL { set.add(#next.getText()); } ) *
;
term returns [Expression expr]
{
expr = null;
}
: #(UNARY_MINUS expr = unaryTerm)
| LPAREN expr = primaryExpression RPAREN
| ident:IDENT
{
expr = _factory.identifier(ident.getText());
}
| expr = literal
;
unaryTerm returns [Expression expr]
{
expr = null;
SelectorAST ast = ##_in;
}
: #(minus:UNARY_MINUS expr = term:term)
{
TypeChecker.check(ast.getText(), term, Type.NUMERIC);
}
| LPAREN expr = primary:primaryExpression RPAREN
{
TypeChecker.check(primary.getText(), primary, Type.NUMERIC);
expr = _factory.unaryOperator(SelectorTokenTypes.UNARY_MINUS,
expr);
}
| IDENT
{
expr = _factory.identifier(ast.getText());
TypeChecker.check(ast.getText(), ast, Type.NUMERIC);
expr = _factory.unaryOperator(SelectorTokenTypes.UNARY_MINUS,
expr);
}
| ( NUM_INT | NUM_FLOAT )
{
expr = _factory.literal(ast.getType(), "-" + ast.getText());
}
;
literal returns [Expression expr]
{
expr = null;
AST ast = ##_in;
}
: ( NUM_INT
| NUM_FLOAT
| STRING_LITERAL
| "false"
| "true"
)
{
expr = _factory.literal(ast.getType(), ast.getText());
}
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -