| /** |
| * <a href="http://activemq.org">ActiveMQ: The Open Source Message Fabric</a> |
| * |
| * Copyright 2004 Hiram Chirino |
| * Copyright 2004 Protique Ltd |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| **/ |
| |
| // ---------------------------------------------------------------------------- |
| // OPTIONS |
| // ---------------------------------------------------------------------------- |
| options { |
| STATIC = true; |
| UNICODE_INPUT = false; |
| |
| //some performance optimizations |
| OPTIMIZE_TOKEN_MANAGER = false; |
| ERROR_REPORTING = true; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // PARSER |
| // ---------------------------------------------------------------------------- |
| |
| PARSER_BEGIN(SelectorParser) |
| |
| package org.activemq.selector; |
| |
| import java.io.*; |
| import java.util.*; |
| |
| import javax.jms.InvalidSelectorException; |
| |
| import org.activemq.filter.*; |
| |
| /** |
| * JMS Selector Parser generated by JavaCC |
| * |
| * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj |
| */ |
| public class SelectorParser { |
| |
| public SelectorParser() { |
| this(new StringReader("")); |
| } |
| |
| public BooleanExpression parse(String sql) throws InvalidSelectorException { |
| this.ReInit(new StringReader(sql)); |
| |
| try { |
| return this.JmsSelector(); |
| } |
| catch (Throwable e) { |
| throw (InvalidSelectorException)new InvalidSelectorException("test").initCause(e); |
| } |
| |
| } |
| |
| private BooleanExpression asBooleanExpression(Expression value) throws ParseException { |
| if (value instanceof BooleanExpression) { |
| return (BooleanExpression) value; |
| } |
| if (value instanceof PropertyExpression) { |
| return UnaryExpression.createBooleanCast( value ); |
| } |
| throw new ParseException("Expression will not result in a boolean value: " + value); |
| } |
| |
| |
| } |
| |
| PARSER_END(SelectorParser) |
| |
| // ---------------------------------------------------------------------------- |
| // Tokens |
| // ---------------------------------------------------------------------------- |
| |
| /* White Space */ |
| SPECIAL_TOKEN : |
| { |
| " " | "\t" | "\n" | "\r" | "\f" |
| } |
| |
| /* Comments */ |
| SKIP: |
| { |
| <LINE_COMMENT: "--" (~["\n","\r"])* ("\n"|"\r"|"\r\n") > |
| } |
| |
| SKIP: |
| { |
| <BLOCK_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/"> |
| } |
| |
| /* Reserved Words */ |
| TOKEN [IGNORE_CASE] : |
| { |
| < NOT : "NOT"> |
| | < AND : "AND"> |
| | < OR : "OR"> |
| | < BETWEEN : "BETWEEN"> |
| | < LIKE : "LIKE"> |
| | < ESCAPE : "ESCAPE"> |
| | < IN : "IN"> |
| | < IS : "IS"> |
| | < TRUE : "TRUE" > |
| | < FALSE : "FALSE" > |
| | < NULL : "NULL" > |
| | < XPATH : "XPATH" > |
| | < XQUERY : "XQUERY" > |
| } |
| |
| /* Literals */ |
| TOKEN [IGNORE_CASE] : |
| { |
| |
| < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* (["l","L"])? > |
| | < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ > |
| | < OCTAL_LITERAL: "0" (["0"-"7"])* > |
| | < FLOATING_POINT_LITERAL: |
| (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? // matches: 5.5 or 5. or 5.5E10 or 5.E10 |
| | "." (["0"-"9"])+ (<EXPONENT>)? // matches: .5 or .5E10 |
| | (["0"-"9"])+ <EXPONENT> // matches: 5E10 |
| > |
| | < #EXPONENT: "E" (["+","-"])? (["0"-"9"])+ > |
| | < STRING_LITERAL: "'" ( ("''") | ~["'"] )* "'" > |
| } |
| |
| TOKEN [IGNORE_CASE] : |
| { |
| < ID : ["a"-"z", "_", "$"] (["a"-"z","0"-"9","_", "$"])* > |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Grammer |
| // ---------------------------------------------------------------------------- |
| BooleanExpression JmsSelector() : |
| { |
| Expression left=null; |
| } |
| { |
| ( |
| left = orExpression() |
| ) |
| { |
| return asBooleanExpression(left); |
| } |
| |
| } |
| |
| Expression orExpression() : |
| { |
| Expression left; |
| Expression right; |
| } |
| { |
| ( |
| left = andExpression() |
| ( |
| <OR> right = andExpression() |
| { |
| left = LogicExpression.createOR(asBooleanExpression(left), asBooleanExpression(right)); |
| } |
| )* |
| ) |
| { |
| return left; |
| } |
| |
| } |
| |
| |
| Expression andExpression() : |
| { |
| Expression left; |
| Expression right; |
| } |
| { |
| ( |
| left = equalityExpression() |
| ( |
| <AND> right = equalityExpression() |
| { |
| left = LogicExpression.createAND(asBooleanExpression(left), asBooleanExpression(right)); |
| } |
| )* |
| ) |
| { |
| return left; |
| } |
| } |
| |
| Expression equalityExpression() : |
| { |
| Expression left; |
| Expression right; |
| } |
| { |
| ( |
| left = comparisonExpression() |
| ( |
| |
| "=" right = comparisonExpression() |
| { |
| left = ComparisonExpression.createEqual(left, right); |
| } |
| | |
| "<>" right = comparisonExpression() |
| { |
| left = ComparisonExpression.createNotEqual(left, right); |
| } |
| | |
| LOOKAHEAD(2) |
| <IS> <NULL> |
| { |
| left = ComparisonExpression.createIsNull(left); |
| } |
| | |
| <IS> <NOT> <NULL> |
| { |
| left = ComparisonExpression.createIsNotNull(left); |
| } |
| )* |
| ) |
| { |
| return left; |
| } |
| } |
| |
| Expression comparisonExpression() : |
| { |
| Expression left; |
| Expression right; |
| Expression low; |
| Expression high; |
| String t, u; |
| boolean not; |
| ArrayList list; |
| } |
| { |
| ( |
| left = addExpression() |
| ( |
| |
| ">" right = addExpression() |
| { |
| left = ComparisonExpression.createGreaterThan(left, right); |
| } |
| | |
| ">=" right = addExpression() |
| { |
| left = ComparisonExpression.createGreaterThanEqual(left, right); |
| } |
| | |
| "<" right = addExpression() |
| { |
| left = ComparisonExpression.createLessThan(left, right); |
| } |
| | |
| "<=" right = addExpression() |
| { |
| left = ComparisonExpression.createLessThanEqual(left, right); |
| } |
| | |
| { |
| u=null; |
| } |
| <LIKE> t = stringLitteral() |
| [ <ESCAPE> u = stringLitteral() ] |
| { |
| left = ComparisonExpression.createLike(left, t, u); |
| } |
| | |
| LOOKAHEAD(2) |
| { |
| u=null; |
| } |
| <NOT> <LIKE> t = stringLitteral() [ <ESCAPE> u = stringLitteral() ] |
| { |
| left = ComparisonExpression.createNotLike(left, t, u); |
| } |
| | |
| <BETWEEN> low = addExpression() <AND> high = addExpression() |
| { |
| left = ComparisonExpression.createBetween(left, low, high); |
| } |
| | |
| LOOKAHEAD(2) |
| <NOT> <BETWEEN> low = addExpression() <AND> high = addExpression() |
| { |
| left = ComparisonExpression.createNotBetween(left, low, high); |
| } |
| | |
| <IN> |
| "(" |
| t = stringLitteral() |
| { |
| list = new ArrayList(); |
| list.add( t ); |
| } |
| ( |
| "," |
| t = stringLitteral() |
| { |
| list.add( t ); |
| } |
| |
| )* |
| ")" |
| { |
| left = ComparisonExpression.createInFilter(left, list); |
| } |
| | |
| LOOKAHEAD(2) |
| <NOT> <IN> |
| "(" |
| t = stringLitteral() |
| { |
| list = new ArrayList(); |
| list.add( t ); |
| } |
| ( |
| "," |
| t = stringLitteral() |
| { |
| list.add( t ); |
| } |
| |
| )* |
| ")" |
| { |
| left = ComparisonExpression.createNotInFilter(left, list); |
| } |
| |
| )* |
| ) |
| { |
| return left; |
| } |
| } |
| |
| Expression addExpression() : |
| { |
| Expression left; |
| Expression right; |
| } |
| { |
| left = multExpr() |
| ( |
| LOOKAHEAD( ("+"|"-") multExpr()) |
| ( |
| "+" right = multExpr() |
| { |
| left = ArithmeticExpression.createPlus(left, right); |
| } |
| | |
| "-" right = multExpr() |
| { |
| left = ArithmeticExpression.createMinus(left, right); |
| } |
| ) |
| |
| )* |
| { |
| return left; |
| } |
| } |
| |
| Expression multExpr() : |
| { |
| Expression left; |
| Expression right; |
| } |
| { |
| left = unaryExpr() |
| ( |
| "*" right = unaryExpr() |
| { |
| left = ArithmeticExpression.createMultiply(left, right); |
| } |
| | |
| "/" right = unaryExpr() |
| { |
| left = ArithmeticExpression.createDivide(left, right); |
| } |
| | |
| "%" right = unaryExpr() |
| { |
| left = ArithmeticExpression.createMod(left, right); |
| } |
| |
| )* |
| { |
| return left; |
| } |
| } |
| |
| |
| Expression unaryExpr() : |
| { |
| String s=null; |
| Expression left=null; |
| } |
| { |
| ( |
| LOOKAHEAD( "+" unaryExpr() ) |
| "+" left=unaryExpr() |
| | |
| "-" left=unaryExpr() |
| { |
| left = UnaryExpression.createNegate(left); |
| } |
| | |
| <NOT> left=unaryExpr() |
| { |
| left = UnaryExpression.createNOT( asBooleanExpression(left) ); |
| } |
| | |
| <XPATH> s=stringLitteral() |
| { |
| left = UnaryExpression.createXPath( s ); |
| } |
| | |
| <XQUERY> s=stringLitteral() |
| { |
| left = UnaryExpression.createXQuery( s ); |
| } |
| | |
| left = primaryExpr() |
| ) |
| { |
| return left; |
| } |
| |
| } |
| |
| Expression primaryExpr() : |
| { |
| Expression left=null; |
| } |
| { |
| ( |
| left = literal() |
| | |
| left = variable() |
| | |
| "(" left = orExpression() ")" |
| ) |
| { |
| return left; |
| } |
| } |
| |
| |
| |
| ConstantExpression literal() : |
| { |
| Token t; |
| String s; |
| ConstantExpression left=null; |
| } |
| { |
| ( |
| ( |
| s = stringLitteral() |
| { |
| left = new ConstantExpression(s); |
| } |
| ) |
| | |
| ( |
| t = <DECIMAL_LITERAL> |
| { |
| left = ConstantExpression.createFromDecimal(t.image); |
| } |
| ) |
| | |
| ( |
| t = <HEX_LITERAL> |
| { |
| left = ConstantExpression.createFromHex(t.image); |
| } |
| ) |
| | |
| ( |
| t = <OCTAL_LITERAL> |
| { |
| left = ConstantExpression.createFromOctal(t.image); |
| } |
| ) |
| | |
| ( |
| t = <FLOATING_POINT_LITERAL> |
| { |
| left = ConstantExpression.createFloat(t.image); |
| } |
| ) |
| | |
| ( |
| <TRUE> |
| { |
| left = ConstantExpression.TRUE; |
| } |
| ) |
| | |
| ( |
| <FALSE> |
| { |
| left = ConstantExpression.FALSE; |
| } |
| ) |
| | |
| ( |
| <NULL> |
| { |
| left = ConstantExpression.NULL; |
| } |
| ) |
| ) |
| { |
| return left; |
| } |
| } |
| |
| String stringLitteral() : |
| { |
| Token t; |
| StringBuffer rc = new StringBuffer(); |
| boolean first=true; |
| } |
| { |
| t = <STRING_LITERAL> |
| { |
| // Decode the sting value. |
| String image = t.image; |
| for( int i=1; i < image.length()-1; i++ ) { |
| char c = image.charAt(i); |
| if( c == '\'' ) |
| i++; |
| rc.append(c); |
| } |
| return rc.toString(); |
| } |
| } |
| |
| PropertyExpression variable() : |
| { |
| Token t; |
| PropertyExpression left=null; |
| } |
| { |
| ( |
| t = <ID> |
| { |
| left = new PropertyExpression(t.image); |
| } |
| ) |
| { |
| return left; |
| } |
| } |