001/* Generated By:JavaCC: Do not edit this line. SelectorParser.java */
002/**
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements.  See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License.  You may obtain a copy of the License at
009 *
010 *      http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019package org.apache.activemq.selector;
020
021import java.io.*;
022import java.util.*;
023
024import javax.jms.InvalidSelectorException;
025
026import org.apache.activemq.filter.*;
027import org.apache.activemq.filter.FunctionCallExpression.invalidFunctionExpressionException;
028import org.apache.activemq.util.LRUCache;
029
030/**
031 * JMS Selector Parser generated by JavaCC
032 *
033 * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj
034 */
035public class SelectorParser implements SelectorParserConstants {
036
037    private static final Map cache = Collections.synchronizedMap(new LRUCache(100));
038    private static final String CONVERT_STRING_EXPRESSIONS_PREFIX = "convert_string_expressions:";
039
040    public static BooleanExpression parse(String sql) throws InvalidSelectorException {
041        Object result = cache.get(sql);
042        if (result instanceof InvalidSelectorException) {
043            throw (InvalidSelectorException) result;
044        } else if (result instanceof BooleanExpression) {
045            return (BooleanExpression) result;
046        } else {
047
048            boolean convertStringExpressions = false;
049            if( sql.startsWith(CONVERT_STRING_EXPRESSIONS_PREFIX)) {
050                convertStringExpressions = true;
051                sql = sql.substring(CONVERT_STRING_EXPRESSIONS_PREFIX.length());
052            }
053
054            if( convertStringExpressions ) {
055                ComparisonExpression.CONVERT_STRING_EXPRESSIONS.set(true);
056            }
057            try {
058                BooleanExpression e = new SelectorParser(sql).parse();
059                cache.put(sql, e);
060                return e;
061            } catch (InvalidSelectorException t) {
062                cache.put(sql, t);
063                throw t;
064            } finally {
065                if( convertStringExpressions ) {
066                    ComparisonExpression.CONVERT_STRING_EXPRESSIONS.remove();
067                }
068            }
069        }
070    }
071
072    public static void clearCache() {
073        cache.clear();
074    }
075
076    private String sql;
077
078    protected SelectorParser(String sql) {
079        this(new StringReader(sql));
080        this.sql = sql;
081    }
082
083    protected BooleanExpression parse() throws InvalidSelectorException {
084        try {
085            return this.JmsSelector();
086        }
087        catch (Throwable e) {
088            throw (InvalidSelectorException) new InvalidSelectorException(sql).initCause(e);
089        }
090    }
091
092    private BooleanExpression asBooleanExpression(Expression value) throws ParseException  {
093        if (value instanceof BooleanExpression) {
094            return (BooleanExpression) value;
095        }
096        if (value instanceof PropertyExpression) {
097            return UnaryExpression.createBooleanCast( value );
098        }
099        throw new ParseException("Expression will not result in a boolean value: " + value);
100    }
101
102// ----------------------------------------------------------------------------
103// Grammer
104// ----------------------------------------------------------------------------
105  final public BooleanExpression JmsSelector() throws ParseException {
106    Expression left=null;
107    left = orExpression();
108    jj_consume_token(0);
109        {if (true) return asBooleanExpression(left);}
110    throw new Error("Missing return statement in function");
111  }
112
113  final public Expression orExpression() throws ParseException {
114    Expression left;
115    Expression right;
116    left = andExpression();
117    label_1:
118    while (true) {
119      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
120      case OR:
121        ;
122        break;
123      default:
124        break label_1;
125      }
126      jj_consume_token(OR);
127      right = andExpression();
128                left = LogicExpression.createOR(asBooleanExpression(left), asBooleanExpression(right));
129    }
130        {if (true) return left;}
131    throw new Error("Missing return statement in function");
132  }
133
134  final public Expression andExpression() throws ParseException {
135    Expression left;
136    Expression right;
137    left = equalityExpression();
138    label_2:
139    while (true) {
140      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
141      case AND:
142        ;
143        break;
144      default:
145        break label_2;
146      }
147      jj_consume_token(AND);
148      right = equalityExpression();
149                left = LogicExpression.createAND(asBooleanExpression(left), asBooleanExpression(right));
150    }
151        {if (true) return left;}
152    throw new Error("Missing return statement in function");
153  }
154
155  final public Expression equalityExpression() throws ParseException {
156    Expression left;
157    Expression right;
158    left = comparisonExpression();
159    label_3:
160    while (true) {
161      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
162      case IS:
163      case 28:
164      case 29:
165        ;
166        break;
167      default:
168        break label_3;
169      }
170      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
171      case 28:
172        jj_consume_token(28);
173        right = comparisonExpression();
174                left = ComparisonExpression.createEqual(left, right);
175        break;
176      case 29:
177        jj_consume_token(29);
178        right = comparisonExpression();
179                left = ComparisonExpression.createNotEqual(left, right);
180        break;
181      default:
182        if (jj_2_1(2)) {
183          jj_consume_token(IS);
184          jj_consume_token(NULL);
185                left = ComparisonExpression.createIsNull(left);
186        } else {
187          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
188          case IS:
189            jj_consume_token(IS);
190            jj_consume_token(NOT);
191            jj_consume_token(NULL);
192                left = ComparisonExpression.createIsNotNull(left);
193            break;
194          default:
195            jj_consume_token(-1);
196            throw new ParseException();
197          }
198        }
199      }
200    }
201        {if (true) return left;}
202    throw new Error("Missing return statement in function");
203  }
204
205  final public Expression comparisonExpression() throws ParseException {
206    Expression left;
207    Expression right;
208    Expression low;
209    Expression high;
210    String t, u;
211    boolean not;
212    ArrayList list;
213    left = addExpression();
214    label_4:
215    while (true) {
216      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
217      case NOT:
218      case BETWEEN:
219      case LIKE:
220      case IN:
221      case 30:
222      case 31:
223      case 32:
224      case 33:
225        ;
226        break;
227      default:
228        break label_4;
229      }
230      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
231      case 30:
232        jj_consume_token(30);
233        right = addExpression();
234                    left = ComparisonExpression.createGreaterThan(left, right);
235        break;
236      case 31:
237        jj_consume_token(31);
238        right = addExpression();
239                    left = ComparisonExpression.createGreaterThanEqual(left, right);
240        break;
241      case 32:
242        jj_consume_token(32);
243        right = addExpression();
244                    left = ComparisonExpression.createLessThan(left, right);
245        break;
246      case 33:
247        jj_consume_token(33);
248        right = addExpression();
249                    left = ComparisonExpression.createLessThanEqual(left, right);
250        break;
251      case LIKE:
252                    u=null;
253        jj_consume_token(LIKE);
254        t = stringLitteral();
255        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
256        case ESCAPE:
257          jj_consume_token(ESCAPE);
258          u = stringLitteral();
259          break;
260        default:
261          ;
262        }
263                    left = ComparisonExpression.createLike(left, t, u);
264        break;
265      default:
266        if (jj_2_2(2)) {
267                    u=null;
268          jj_consume_token(NOT);
269          jj_consume_token(LIKE);
270          t = stringLitteral();
271          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
272          case ESCAPE:
273            jj_consume_token(ESCAPE);
274            u = stringLitteral();
275            break;
276          default:
277            ;
278          }
279                    left = ComparisonExpression.createNotLike(left, t, u);
280        } else {
281          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
282          case BETWEEN:
283            jj_consume_token(BETWEEN);
284            low = addExpression();
285            jj_consume_token(AND);
286            high = addExpression();
287                    left = ComparisonExpression.createBetween(left, low, high);
288            break;
289          default:
290            if (jj_2_3(2)) {
291              jj_consume_token(NOT);
292              jj_consume_token(BETWEEN);
293              low = addExpression();
294              jj_consume_token(AND);
295              high = addExpression();
296                    left = ComparisonExpression.createNotBetween(left, low, high);
297            } else {
298              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
299              case IN:
300                jj_consume_token(IN);
301                jj_consume_token(34);
302                t = stringLitteral();
303                        list = new ArrayList();
304                        list.add( t );
305                label_5:
306                while (true) {
307                  switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
308                  case 35:
309                    ;
310                    break;
311                  default:
312                    break label_5;
313                  }
314                  jj_consume_token(35);
315                  t = stringLitteral();
316                            list.add( t );
317                }
318                jj_consume_token(36);
319                   left = ComparisonExpression.createInFilter(left, list);
320                break;
321              default:
322                if (jj_2_4(2)) {
323                  jj_consume_token(NOT);
324                  jj_consume_token(IN);
325                  jj_consume_token(34);
326                  t = stringLitteral();
327                        list = new ArrayList();
328                        list.add( t );
329                  label_6:
330                  while (true) {
331                    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
332                    case 35:
333                      ;
334                      break;
335                    default:
336                      break label_6;
337                    }
338                    jj_consume_token(35);
339                    t = stringLitteral();
340                            list.add( t );
341                  }
342                  jj_consume_token(36);
343                   left = ComparisonExpression.createNotInFilter(left, list);
344                } else {
345                  jj_consume_token(-1);
346                  throw new ParseException();
347                }
348              }
349            }
350          }
351        }
352      }
353    }
354        {if (true) return left;}
355    throw new Error("Missing return statement in function");
356  }
357
358  final public Expression addExpression() throws ParseException {
359    Expression left;
360    Expression right;
361    left = multExpr();
362    label_7:
363    while (true) {
364      if (jj_2_5(2147483647)) {
365        ;
366      } else {
367        break label_7;
368      }
369      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
370      case 37:
371        jj_consume_token(37);
372        right = multExpr();
373                left = ArithmeticExpression.createPlus(left, right);
374        break;
375      case 38:
376        jj_consume_token(38);
377        right = multExpr();
378                left = ArithmeticExpression.createMinus(left, right);
379        break;
380      default:
381        jj_consume_token(-1);
382        throw new ParseException();
383      }
384    }
385        {if (true) return left;}
386    throw new Error("Missing return statement in function");
387  }
388
389  final public Expression multExpr() throws ParseException {
390    Expression left;
391    Expression right;
392    left = unaryExpr();
393    label_8:
394    while (true) {
395      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
396      case 39:
397      case 40:
398      case 41:
399        ;
400        break;
401      default:
402        break label_8;
403      }
404      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
405      case 39:
406        jj_consume_token(39);
407        right = unaryExpr();
408            left = ArithmeticExpression.createMultiply(left, right);
409        break;
410      case 40:
411        jj_consume_token(40);
412        right = unaryExpr();
413            left = ArithmeticExpression.createDivide(left, right);
414        break;
415      case 41:
416        jj_consume_token(41);
417        right = unaryExpr();
418            left = ArithmeticExpression.createMod(left, right);
419        break;
420      default:
421        jj_consume_token(-1);
422        throw new ParseException();
423      }
424    }
425        {if (true) return left;}
426    throw new Error("Missing return statement in function");
427  }
428
429  final public Expression unaryExpr() throws ParseException {
430    String s=null;
431    Expression left=null;
432    if (jj_2_6(2147483647)) {
433      jj_consume_token(37);
434      left = unaryExpr();
435    } else {
436      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
437      case 38:
438        jj_consume_token(38);
439        left = unaryExpr();
440            left = UnaryExpression.createNegate(left);
441        break;
442      case NOT:
443        jj_consume_token(NOT);
444        left = unaryExpr();
445            left = UnaryExpression.createNOT( asBooleanExpression(left) );
446        break;
447      case XPATH:
448        jj_consume_token(XPATH);
449        s = stringLitteral();
450            left = UnaryExpression.createXPath( s );
451        break;
452      case XQUERY:
453        jj_consume_token(XQUERY);
454        s = stringLitteral();
455            left = UnaryExpression.createXQuery( s );
456        break;
457      default:
458        if (jj_2_7(2147483647)) {
459          left = functionCallExpr();
460        } else {
461          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
462          case TRUE:
463          case FALSE:
464          case NULL:
465          case DECIMAL_LITERAL:
466          case HEX_LITERAL:
467          case OCTAL_LITERAL:
468          case FLOATING_POINT_LITERAL:
469          case STRING_LITERAL:
470          case ID:
471          case 34:
472            left = primaryExpr();
473            break;
474          default:
475            jj_consume_token(-1);
476            throw new ParseException();
477          }
478        }
479      }
480    }
481        {if (true) return left;}
482    throw new Error("Missing return statement in function");
483  }
484
485  final public Expression functionCallExpr() throws ParseException {
486    Token      func_name;
487    FunctionCallExpression func_call = null;
488    Expression arg = null;
489    ArrayList arg_list = new ArrayList();
490    func_name = jj_consume_token(ID);
491    jj_consume_token(34);
492    arg = unaryExpr();
493            arg_list.add(arg);
494    label_9:
495    while (true) {
496      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
497      case 35:
498        ;
499        break;
500      default:
501        break label_9;
502      }
503      jj_consume_token(35);
504      arg = unaryExpr();
505                arg_list.add(arg);
506    }
507    jj_consume_token(36);
508        try
509        {
510            {if (true) return FunctionCallExpression.createFunctionCall(func_name.image, arg_list);}
511        }
512        catch ( invalidFunctionExpressionException inv_exc )
513        {
514            // Re-throw as an error to avoid the need to propogate the throws declaration.
515            {if (true) throw new Error("invalid function call expression", inv_exc);}
516        }
517    throw new Error("Missing return statement in function");
518  }
519
520  final public Expression primaryExpr() throws ParseException {
521    Expression left=null;
522    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
523    case TRUE:
524    case FALSE:
525    case NULL:
526    case DECIMAL_LITERAL:
527    case HEX_LITERAL:
528    case OCTAL_LITERAL:
529    case FLOATING_POINT_LITERAL:
530    case STRING_LITERAL:
531      left = literal();
532      break;
533    case ID:
534      left = variable();
535      break;
536    case 34:
537      jj_consume_token(34);
538      left = orExpression();
539      jj_consume_token(36);
540      break;
541    default:
542      jj_consume_token(-1);
543      throw new ParseException();
544    }
545        {if (true) return left;}
546    throw new Error("Missing return statement in function");
547  }
548
549  final public ConstantExpression literal() throws ParseException {
550    Token t;
551    String s;
552    ConstantExpression left=null;
553    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
554    case STRING_LITERAL:
555      s = stringLitteral();
556                left = new ConstantExpression(s);
557      break;
558    case DECIMAL_LITERAL:
559      t = jj_consume_token(DECIMAL_LITERAL);
560                left = ConstantExpression.createFromDecimal(t.image);
561      break;
562    case HEX_LITERAL:
563      t = jj_consume_token(HEX_LITERAL);
564                left = ConstantExpression.createFromHex(t.image);
565      break;
566    case OCTAL_LITERAL:
567      t = jj_consume_token(OCTAL_LITERAL);
568                left = ConstantExpression.createFromOctal(t.image);
569      break;
570    case FLOATING_POINT_LITERAL:
571      t = jj_consume_token(FLOATING_POINT_LITERAL);
572                left = ConstantExpression.createFloat(t.image);
573      break;
574    case TRUE:
575      jj_consume_token(TRUE);
576                left = ConstantExpression.TRUE;
577      break;
578    case FALSE:
579      jj_consume_token(FALSE);
580                left = ConstantExpression.FALSE;
581      break;
582    case NULL:
583      jj_consume_token(NULL);
584                left = ConstantExpression.NULL;
585      break;
586    default:
587      jj_consume_token(-1);
588      throw new ParseException();
589    }
590        {if (true) return left;}
591    throw new Error("Missing return statement in function");
592  }
593
594  final public String stringLitteral() throws ParseException {
595    Token t;
596    StringBuffer rc = new StringBuffer();
597    boolean first=true;
598    t = jj_consume_token(STRING_LITERAL);
599        // Decode the sting value.
600        String image = t.image;
601        for( int i=1; i < image.length()-1; i++ ) {
602            char c = image.charAt(i);
603            if( c == '\u005c'' )
604                i++;
605               rc.append(c);
606        }
607        {if (true) return rc.toString();}
608    throw new Error("Missing return statement in function");
609  }
610
611  final public PropertyExpression variable() throws ParseException {
612    Token t;
613    PropertyExpression left=null;
614    t = jj_consume_token(ID);
615            left = new PropertyExpression(t.image);
616        {if (true) return left;}
617    throw new Error("Missing return statement in function");
618  }
619
620  private boolean jj_2_1(int xla) {
621    jj_la = xla; jj_lastpos = jj_scanpos = token;
622    try { return !jj_3_1(); }
623    catch(LookaheadSuccess ls) { return true; }
624  }
625
626  private boolean jj_2_2(int xla) {
627    jj_la = xla; jj_lastpos = jj_scanpos = token;
628    try { return !jj_3_2(); }
629    catch(LookaheadSuccess ls) { return true; }
630  }
631
632  private boolean jj_2_3(int xla) {
633    jj_la = xla; jj_lastpos = jj_scanpos = token;
634    try { return !jj_3_3(); }
635    catch(LookaheadSuccess ls) { return true; }
636  }
637
638  private boolean jj_2_4(int xla) {
639    jj_la = xla; jj_lastpos = jj_scanpos = token;
640    try { return !jj_3_4(); }
641    catch(LookaheadSuccess ls) { return true; }
642  }
643
644  private boolean jj_2_5(int xla) {
645    jj_la = xla; jj_lastpos = jj_scanpos = token;
646    try { return !jj_3_5(); }
647    catch(LookaheadSuccess ls) { return true; }
648  }
649
650  private boolean jj_2_6(int xla) {
651    jj_la = xla; jj_lastpos = jj_scanpos = token;
652    try { return !jj_3_6(); }
653    catch(LookaheadSuccess ls) { return true; }
654  }
655
656  private boolean jj_2_7(int xla) {
657    jj_la = xla; jj_lastpos = jj_scanpos = token;
658    try { return !jj_3_7(); }
659    catch(LookaheadSuccess ls) { return true; }
660  }
661
662  private boolean jj_3R_11() {
663    Token xsp;
664    xsp = jj_scanpos;
665    if (jj_3R_13()) {
666    jj_scanpos = xsp;
667    if (jj_3R_14()) {
668    jj_scanpos = xsp;
669    if (jj_3R_15()) {
670    jj_scanpos = xsp;
671    if (jj_3R_16()) {
672    jj_scanpos = xsp;
673    if (jj_3R_17()) {
674    jj_scanpos = xsp;
675    if (jj_3R_18()) {
676    jj_scanpos = xsp;
677    if (jj_3R_19()) return true;
678    }
679    }
680    }
681    }
682    }
683    }
684    return false;
685  }
686
687  private boolean jj_3R_59() {
688    if (jj_scan_token(IN)) return true;
689    if (jj_scan_token(34)) return true;
690    if (jj_3R_23()) return true;
691    Token xsp;
692    while (true) {
693      xsp = jj_scanpos;
694      if (jj_3R_64()) { jj_scanpos = xsp; break; }
695    }
696    if (jj_scan_token(36)) return true;
697    return false;
698  }
699
700  private boolean jj_3R_49() {
701    if (jj_scan_token(28)) return true;
702    if (jj_3R_45()) return true;
703    return false;
704  }
705
706  private boolean jj_3R_46() {
707    Token xsp;
708    xsp = jj_scanpos;
709    if (jj_3R_49()) {
710    jj_scanpos = xsp;
711    if (jj_3R_50()) {
712    jj_scanpos = xsp;
713    if (jj_3_1()) {
714    jj_scanpos = xsp;
715    if (jj_3R_51()) return true;
716    }
717    }
718    }
719    return false;
720  }
721
722  private boolean jj_3R_31() {
723    if (jj_scan_token(ID)) return true;
724    return false;
725  }
726
727  private boolean jj_3_3() {
728    if (jj_scan_token(NOT)) return true;
729    if (jj_scan_token(BETWEEN)) return true;
730    if (jj_3R_47()) return true;
731    if (jj_scan_token(AND)) return true;
732    if (jj_3R_47()) return true;
733    return false;
734  }
735
736  private boolean jj_3R_29() {
737    if (jj_scan_token(34)) return true;
738    if (jj_3R_32()) return true;
739    if (jj_scan_token(36)) return true;
740    return false;
741  }
742
743  private boolean jj_3R_28() {
744    if (jj_3R_31()) return true;
745    return false;
746  }
747
748  private boolean jj_3R_22() {
749    if (jj_scan_token(41)) return true;
750    if (jj_3R_11()) return true;
751    return false;
752  }
753
754  private boolean jj_3R_27() {
755    if (jj_3R_30()) return true;
756    return false;
757  }
758
759  private boolean jj_3R_58() {
760    if (jj_scan_token(BETWEEN)) return true;
761    if (jj_3R_47()) return true;
762    if (jj_scan_token(AND)) return true;
763    if (jj_3R_47()) return true;
764    return false;
765  }
766
767  private boolean jj_3R_43() {
768    if (jj_3R_45()) return true;
769    Token xsp;
770    while (true) {
771      xsp = jj_scanpos;
772      if (jj_3R_46()) { jj_scanpos = xsp; break; }
773    }
774    return false;
775  }
776
777  private boolean jj_3R_21() {
778    if (jj_scan_token(40)) return true;
779    if (jj_3R_11()) return true;
780    return false;
781  }
782
783  private boolean jj_3R_25() {
784    Token xsp;
785    xsp = jj_scanpos;
786    if (jj_3R_27()) {
787    jj_scanpos = xsp;
788    if (jj_3R_28()) {
789    jj_scanpos = xsp;
790    if (jj_3R_29()) return true;
791    }
792    }
793    return false;
794  }
795
796  private boolean jj_3R_62() {
797    if (jj_scan_token(ESCAPE)) return true;
798    if (jj_3R_23()) return true;
799    return false;
800  }
801
802  private boolean jj_3_2() {
803    if (jj_scan_token(NOT)) return true;
804    if (jj_scan_token(LIKE)) return true;
805    if (jj_3R_23()) return true;
806    Token xsp;
807    xsp = jj_scanpos;
808    if (jj_3R_63()) jj_scanpos = xsp;
809    return false;
810  }
811
812  private boolean jj_3R_12() {
813    Token xsp;
814    xsp = jj_scanpos;
815    if (jj_3R_20()) {
816    jj_scanpos = xsp;
817    if (jj_3R_21()) {
818    jj_scanpos = xsp;
819    if (jj_3R_22()) return true;
820    }
821    }
822    return false;
823  }
824
825  private boolean jj_3R_20() {
826    if (jj_scan_token(39)) return true;
827    if (jj_3R_11()) return true;
828    return false;
829  }
830
831  private boolean jj_3R_23() {
832    if (jj_scan_token(STRING_LITERAL)) return true;
833    return false;
834  }
835
836  private boolean jj_3R_44() {
837    if (jj_scan_token(AND)) return true;
838    if (jj_3R_43()) return true;
839    return false;
840  }
841
842  private boolean jj_3R_10() {
843    if (jj_3R_11()) return true;
844    Token xsp;
845    while (true) {
846      xsp = jj_scanpos;
847      if (jj_3R_12()) { jj_scanpos = xsp; break; }
848    }
849    return false;
850  }
851
852  private boolean jj_3R_57() {
853    if (jj_scan_token(LIKE)) return true;
854    if (jj_3R_23()) return true;
855    Token xsp;
856    xsp = jj_scanpos;
857    if (jj_3R_62()) jj_scanpos = xsp;
858    return false;
859  }
860
861  private boolean jj_3R_41() {
862    if (jj_3R_43()) return true;
863    Token xsp;
864    while (true) {
865      xsp = jj_scanpos;
866      if (jj_3R_44()) { jj_scanpos = xsp; break; }
867    }
868    return false;
869  }
870
871  private boolean jj_3R_26() {
872    if (jj_scan_token(35)) return true;
873    if (jj_3R_11()) return true;
874    return false;
875  }
876
877  private boolean jj_3R_56() {
878    if (jj_scan_token(33)) return true;
879    if (jj_3R_47()) return true;
880    return false;
881  }
882
883  private boolean jj_3R_40() {
884    if (jj_scan_token(NULL)) return true;
885    return false;
886  }
887
888  private boolean jj_3R_61() {
889    if (jj_scan_token(38)) return true;
890    if (jj_3R_10()) return true;
891    return false;
892  }
893
894  private boolean jj_3_5() {
895    Token xsp;
896    xsp = jj_scanpos;
897    if (jj_scan_token(37)) {
898    jj_scanpos = xsp;
899    if (jj_scan_token(38)) return true;
900    }
901    if (jj_3R_10()) return true;
902    return false;
903  }
904
905  private boolean jj_3R_55() {
906    if (jj_scan_token(32)) return true;
907    if (jj_3R_47()) return true;
908    return false;
909  }
910
911  private boolean jj_3R_60() {
912    if (jj_scan_token(37)) return true;
913    if (jj_3R_10()) return true;
914    return false;
915  }
916
917  private boolean jj_3R_39() {
918    if (jj_scan_token(FALSE)) return true;
919    return false;
920  }
921
922  private boolean jj_3R_42() {
923    if (jj_scan_token(OR)) return true;
924    if (jj_3R_41()) return true;
925    return false;
926  }
927
928  private boolean jj_3R_54() {
929    if (jj_scan_token(31)) return true;
930    if (jj_3R_47()) return true;
931    return false;
932  }
933
934  private boolean jj_3R_52() {
935    Token xsp;
936    xsp = jj_scanpos;
937    if (jj_3R_60()) {
938    jj_scanpos = xsp;
939    if (jj_3R_61()) return true;
940    }
941    return false;
942  }
943
944  private boolean jj_3_7() {
945    if (jj_scan_token(ID)) return true;
946    if (jj_scan_token(34)) return true;
947    return false;
948  }
949
950  private boolean jj_3R_24() {
951    if (jj_scan_token(ID)) return true;
952    if (jj_scan_token(34)) return true;
953    if (jj_3R_11()) return true;
954    Token xsp;
955    while (true) {
956      xsp = jj_scanpos;
957      if (jj_3R_26()) { jj_scanpos = xsp; break; }
958    }
959    if (jj_scan_token(36)) return true;
960    return false;
961  }
962
963  private boolean jj_3R_53() {
964    if (jj_scan_token(30)) return true;
965    if (jj_3R_47()) return true;
966    return false;
967  }
968
969  private boolean jj_3R_48() {
970    Token xsp;
971    xsp = jj_scanpos;
972    if (jj_3R_53()) {
973    jj_scanpos = xsp;
974    if (jj_3R_54()) {
975    jj_scanpos = xsp;
976    if (jj_3R_55()) {
977    jj_scanpos = xsp;
978    if (jj_3R_56()) {
979    jj_scanpos = xsp;
980    if (jj_3R_57()) {
981    jj_scanpos = xsp;
982    if (jj_3_2()) {
983    jj_scanpos = xsp;
984    if (jj_3R_58()) {
985    jj_scanpos = xsp;
986    if (jj_3_3()) {
987    jj_scanpos = xsp;
988    if (jj_3R_59()) {
989    jj_scanpos = xsp;
990    if (jj_3_4()) return true;
991    }
992    }
993    }
994    }
995    }
996    }
997    }
998    }
999    }
1000    return false;
1001  }
1002
1003  private boolean jj_3R_38() {
1004    if (jj_scan_token(TRUE)) return true;
1005    return false;
1006  }
1007
1008  private boolean jj_3R_47() {
1009    if (jj_3R_10()) return true;
1010    Token xsp;
1011    while (true) {
1012      xsp = jj_scanpos;
1013      if (jj_3R_52()) { jj_scanpos = xsp; break; }
1014    }
1015    return false;
1016  }
1017
1018  private boolean jj_3R_32() {
1019    if (jj_3R_41()) return true;
1020    Token xsp;
1021    while (true) {
1022      xsp = jj_scanpos;
1023      if (jj_3R_42()) { jj_scanpos = xsp; break; }
1024    }
1025    return false;
1026  }
1027
1028  private boolean jj_3R_37() {
1029    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
1030    return false;
1031  }
1032
1033  private boolean jj_3R_65() {
1034    if (jj_scan_token(35)) return true;
1035    if (jj_3R_23()) return true;
1036    return false;
1037  }
1038
1039  private boolean jj_3R_18() {
1040    if (jj_3R_24()) return true;
1041    return false;
1042  }
1043
1044  private boolean jj_3R_19() {
1045    if (jj_3R_25()) return true;
1046    return false;
1047  }
1048
1049  private boolean jj_3R_36() {
1050    if (jj_scan_token(OCTAL_LITERAL)) return true;
1051    return false;
1052  }
1053
1054  private boolean jj_3R_45() {
1055    if (jj_3R_47()) return true;
1056    Token xsp;
1057    while (true) {
1058      xsp = jj_scanpos;
1059      if (jj_3R_48()) { jj_scanpos = xsp; break; }
1060    }
1061    return false;
1062  }
1063
1064  private boolean jj_3R_17() {
1065    if (jj_scan_token(XQUERY)) return true;
1066    if (jj_3R_23()) return true;
1067    return false;
1068  }
1069
1070  private boolean jj_3R_35() {
1071    if (jj_scan_token(HEX_LITERAL)) return true;
1072    return false;
1073  }
1074
1075  private boolean jj_3R_16() {
1076    if (jj_scan_token(XPATH)) return true;
1077    if (jj_3R_23()) return true;
1078    return false;
1079  }
1080
1081  private boolean jj_3R_63() {
1082    if (jj_scan_token(ESCAPE)) return true;
1083    if (jj_3R_23()) return true;
1084    return false;
1085  }
1086
1087  private boolean jj_3_4() {
1088    if (jj_scan_token(NOT)) return true;
1089    if (jj_scan_token(IN)) return true;
1090    if (jj_scan_token(34)) return true;
1091    if (jj_3R_23()) return true;
1092    Token xsp;
1093    while (true) {
1094      xsp = jj_scanpos;
1095      if (jj_3R_65()) { jj_scanpos = xsp; break; }
1096    }
1097    if (jj_scan_token(36)) return true;
1098    return false;
1099  }
1100
1101  private boolean jj_3_6() {
1102    if (jj_scan_token(37)) return true;
1103    if (jj_3R_11()) return true;
1104    return false;
1105  }
1106
1107  private boolean jj_3R_34() {
1108    if (jj_scan_token(DECIMAL_LITERAL)) return true;
1109    return false;
1110  }
1111
1112  private boolean jj_3R_15() {
1113    if (jj_scan_token(NOT)) return true;
1114    if (jj_3R_11()) return true;
1115    return false;
1116  }
1117
1118  private boolean jj_3R_64() {
1119    if (jj_scan_token(35)) return true;
1120    if (jj_3R_23()) return true;
1121    return false;
1122  }
1123
1124  private boolean jj_3R_51() {
1125    if (jj_scan_token(IS)) return true;
1126    if (jj_scan_token(NOT)) return true;
1127    if (jj_scan_token(NULL)) return true;
1128    return false;
1129  }
1130
1131  private boolean jj_3R_14() {
1132    if (jj_scan_token(38)) return true;
1133    if (jj_3R_11()) return true;
1134    return false;
1135  }
1136
1137  private boolean jj_3R_33() {
1138    if (jj_3R_23()) return true;
1139    return false;
1140  }
1141
1142  private boolean jj_3_1() {
1143    if (jj_scan_token(IS)) return true;
1144    if (jj_scan_token(NULL)) return true;
1145    return false;
1146  }
1147
1148  private boolean jj_3R_13() {
1149    if (jj_scan_token(37)) return true;
1150    if (jj_3R_11()) return true;
1151    return false;
1152  }
1153
1154  private boolean jj_3R_30() {
1155    Token xsp;
1156    xsp = jj_scanpos;
1157    if (jj_3R_33()) {
1158    jj_scanpos = xsp;
1159    if (jj_3R_34()) {
1160    jj_scanpos = xsp;
1161    if (jj_3R_35()) {
1162    jj_scanpos = xsp;
1163    if (jj_3R_36()) {
1164    jj_scanpos = xsp;
1165    if (jj_3R_37()) {
1166    jj_scanpos = xsp;
1167    if (jj_3R_38()) {
1168    jj_scanpos = xsp;
1169    if (jj_3R_39()) {
1170    jj_scanpos = xsp;
1171    if (jj_3R_40()) return true;
1172    }
1173    }
1174    }
1175    }
1176    }
1177    }
1178    }
1179    return false;
1180  }
1181
1182  private boolean jj_3R_50() {
1183    if (jj_scan_token(29)) return true;
1184    if (jj_3R_45()) return true;
1185    return false;
1186  }
1187
1188  /** Generated Token Manager. */
1189  public SelectorParserTokenManager token_source;
1190  SimpleCharStream jj_input_stream;
1191  /** Current token. */
1192  public Token token;
1193  /** Next token. */
1194  public Token jj_nt;
1195  private int jj_ntk;
1196  private Token jj_scanpos, jj_lastpos;
1197  private int jj_la;
1198
1199  /** Constructor with InputStream. */
1200  public SelectorParser(java.io.InputStream stream) {
1201     this(stream, null);
1202  }
1203  /** Constructor with InputStream and supplied encoding */
1204  public SelectorParser(java.io.InputStream stream, String encoding) {
1205    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
1206    token_source = new SelectorParserTokenManager(jj_input_stream);
1207    token = new Token();
1208    jj_ntk = -1;
1209  }
1210
1211  /** Reinitialise. */
1212  public void ReInit(java.io.InputStream stream) {
1213     ReInit(stream, null);
1214  }
1215  /** Reinitialise. */
1216  public void ReInit(java.io.InputStream stream, String encoding) {
1217    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
1218    token_source.ReInit(jj_input_stream);
1219    token = new Token();
1220    jj_ntk = -1;
1221  }
1222
1223  /** Constructor. */
1224  public SelectorParser(java.io.Reader stream) {
1225    jj_input_stream = new SimpleCharStream(stream, 1, 1);
1226    token_source = new SelectorParserTokenManager(jj_input_stream);
1227    token = new Token();
1228    jj_ntk = -1;
1229  }
1230
1231  /** Reinitialise. */
1232  public void ReInit(java.io.Reader stream) {
1233    jj_input_stream.ReInit(stream, 1, 1);
1234    token_source.ReInit(jj_input_stream);
1235    token = new Token();
1236    jj_ntk = -1;
1237  }
1238
1239  /** Constructor with generated Token Manager. */
1240  public SelectorParser(SelectorParserTokenManager tm) {
1241    token_source = tm;
1242    token = new Token();
1243    jj_ntk = -1;
1244  }
1245
1246  /** Reinitialise. */
1247  public void ReInit(SelectorParserTokenManager tm) {
1248    token_source = tm;
1249    token = new Token();
1250    jj_ntk = -1;
1251  }
1252
1253  private Token jj_consume_token(int kind) throws ParseException {
1254    Token oldToken;
1255    if ((oldToken = token).next != null) token = token.next;
1256    else token = token.next = token_source.getNextToken();
1257    jj_ntk = -1;
1258    if (token.kind == kind) {
1259      return token;
1260    }
1261    token = oldToken;
1262    throw generateParseException();
1263  }
1264
1265  static private final class LookaheadSuccess extends java.lang.Error { }
1266  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
1267  private boolean jj_scan_token(int kind) {
1268    if (jj_scanpos == jj_lastpos) {
1269      jj_la--;
1270      if (jj_scanpos.next == null) {
1271        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
1272      } else {
1273        jj_lastpos = jj_scanpos = jj_scanpos.next;
1274      }
1275    } else {
1276      jj_scanpos = jj_scanpos.next;
1277    }
1278    if (jj_scanpos.kind != kind) return true;
1279    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
1280    return false;
1281  }
1282
1283
1284/** Get the next Token. */
1285  final public Token getNextToken() {
1286    if (token.next != null) token = token.next;
1287    else token = token.next = token_source.getNextToken();
1288    jj_ntk = -1;
1289    return token;
1290  }
1291
1292/** Get the specific Token. */
1293  final public Token getToken(int index) {
1294    Token t = token;
1295    for (int i = 0; i < index; i++) {
1296      if (t.next != null) t = t.next;
1297      else t = t.next = token_source.getNextToken();
1298    }
1299    return t;
1300  }
1301
1302  private int jj_ntk() {
1303    if ((jj_nt=token.next) == null)
1304      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
1305    else
1306      return (jj_ntk = jj_nt.kind);
1307  }
1308
1309  /** Generate ParseException. */
1310  public ParseException generateParseException() {
1311    Token errortok = token.next;
1312    int line = errortok.beginLine, column = errortok.beginColumn;
1313    String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
1314    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
1315  }
1316
1317  /** Enable tracing. */
1318  final public void enable_tracing() {
1319  }
1320
1321  /** Disable tracing. */
1322  final public void disable_tracing() {
1323  }
1324
1325}