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