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

📄 selectortree.g

📁 实现了Jms的服务器源码,支持多种适配器,DB,FTP,支持多种数据库
💻 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 + -