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