/* Generated By:CSharpCC: Do not edit this line. SelectorParser.cs */
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
using System;
using System.IO;
using System.Text;
using System.Collections;

using Apache.NMS;

namespace Apache.NMS.Selector
{
    /// <summary>
    /// JMS Selector Parser generated by <a href="https://github.com/deveel/csharpcc">CSharpCC</a>
    /// 
    /// Do not edit this .cs file directly - it is autogenerated from SelectorParser.csc
    /// using <c>csharpcc.exe -UNICODE_INPUT=true SelectorParser.csc</c>.
    /// 
    /// SelectorParser.csc is adapted from
    /// <a href="https://raw.githubusercontent.com/apache/activemq/activemq-4.0/activemq-core/src/main/grammar/SelectorParser.jj">
    /// ActiveMQ 4.0 SelectorParser.jj</a>
    /// </summary>
    public class SelectorParser : SelectorParserConstants {

        public SelectorParser()
            : this(new StringReader(""))
        {
        }

        public IBooleanExpression Parse(string selector)
        {
            this.ReInit(new StringReader(selector));

            try
            {
                return this.JmsSelector();
            }
            catch(Exception e)
            {
                    throw new InvalidSelectorException(selector, e);
            }
        }

        private IBooleanExpression AsBooleanExpression(IExpression value)
        {
            if(value is IBooleanExpression)
            {
                return (IBooleanExpression)value;
            }
            if(value is PropertyExpression)
            {
                return UnaryExpression.CreateBooleanCast(value);
            }
            throw new ParseException("IExpression will not result in a boolean value: " + value);
        }

// ----------------------------------------------------------------------------
// Grammar
// ----------------------------------------------------------------------------
  public IBooleanExpression JmsSelector() {
    IExpression left = null;
    left = GetOrExpression();
        {return AsBooleanExpression(left);}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetOrExpression() {
    IExpression left;
    IExpression right;
    left = GetAndExpression();
    while (true) {
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case OR:
        ;
        break;
      default:
        goto label_1;
      }
      mcc_consume_token(OR);
      right = GetAndExpression();
                left = LogicExpression.CreateOR(AsBooleanExpression(left), AsBooleanExpression(right));
    }label_1: ;
    
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetAndExpression() {
    IExpression left;
    IExpression right;
    left = GetEqualityExpression();
    while (true) {
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case AND:
        ;
        break;
      default:
        goto label_2;
      }
      mcc_consume_token(AND);
      right = GetEqualityExpression();
                left = LogicExpression.CreateAND(AsBooleanExpression(left), AsBooleanExpression(right));
    }label_2: ;
    
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetEqualityExpression() {
    IExpression left;
    IExpression right;
    left = GetComparisonExpression();
    while (true) {
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case IS:
      case 28:
      case 29:
        ;
        break;
      default:
        goto label_3;
      }
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case 28:
        mcc_consume_token(28);
        right = GetComparisonExpression();
                left = ComparisonExpression.CreateEqual(left, right);
        break;
      case 29:
        mcc_consume_token(29);
        right = GetComparisonExpression();
                left = ComparisonExpression.CreateNotEqual(left, right);
        break;
      default:
        if (mcc_2_1(2)) {
          mcc_consume_token(IS);
          mcc_consume_token(NULL);
                left = ComparisonExpression.CreateIsNull(left);
        } else {
          switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
          case IS:
            mcc_consume_token(IS);
            mcc_consume_token(NOT);
            mcc_consume_token(NULL);
                left = ComparisonExpression.CreateIsNotNull(left);
            break;
          default:
            mcc_consume_token(-1);
            throw new ParseException();
          }
        }
        break;
      }
    }label_3: ;
    
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetComparisonExpression() {
    IExpression left;
    IExpression right;
    IExpression low;
    IExpression high;
    string t;
    string u;
        ArrayList list;
    left = GetAddExpression();
    while (true) {
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case NOT:
      case BETWEEN:
      case LIKE:
      case IN:
      case 30:
      case 31:
      case 32:
      case 33:
        ;
        break;
      default:
        goto label_4;
      }
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case 30:
        mcc_consume_token(30);
        right = GetAddExpression();
                    left = ComparisonExpression.CreateGreaterThan(left, right);
        break;
      case 31:
        mcc_consume_token(31);
        right = GetAddExpression();
                    left = ComparisonExpression.CreateGreaterThanOrEqual(left, right);
        break;
      case 32:
        mcc_consume_token(32);
        right = GetAddExpression();
                    left = ComparisonExpression.CreateLesserThan(left, right);
        break;
      case 33:
        mcc_consume_token(33);
        right = GetAddExpression();
                    left = ComparisonExpression.CreateLesserThanOrEqual(left, right);
        break;
      case LIKE:
                                        u = null;
        mcc_consume_token(LIKE);
        t = GetStringLitteral();
        switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
        case ESCAPE:
          mcc_consume_token(ESCAPE);
          u = GetStringLitteral();
          break;
        default:
          ;
          break;
        }
                    left = ComparisonExpression.CreateLike(left, t, u);
        break;
      default:
        if (mcc_2_2(2)) {
                                        u=null;
          mcc_consume_token(NOT);
          mcc_consume_token(LIKE);
          t = GetStringLitteral();
          switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
          case ESCAPE:
            mcc_consume_token(ESCAPE);
            u = GetStringLitteral();
            break;
          default:
            ;
            break;
          }
                    left = ComparisonExpression.CreateNotLike(left, t, u);
        } else {
          switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
          case BETWEEN:
            mcc_consume_token(BETWEEN);
            low = GetAddExpression();
            mcc_consume_token(AND);
            high = GetAddExpression();
                                        left = ComparisonExpression.CreateBetween(left, low, high);
            break;
          default:
            if (mcc_2_3(2)) {
              mcc_consume_token(NOT);
              mcc_consume_token(BETWEEN);
              low = GetAddExpression();
              mcc_consume_token(AND);
              high = GetAddExpression();
                                        left = ComparisonExpression.CreateNotBetween(left, low, high);
            } else {
              switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
              case IN:
                mcc_consume_token(IN);
                mcc_consume_token(34);
                t = GetStringLitteral();
                                    list = new ArrayList();
                                    list.Add(t);
                while (true) {
                  switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
                  case 35:
                    ;
                    break;
                  default:
                    goto label_5;
                  }
                  mcc_consume_token(35);
                  t = GetStringLitteral();
                                            list.Add(t);
                }label_5: ;
                
                mcc_consume_token(36);
                           left = ComparisonExpression.CreateIn(left, list);
                break;
              default:
                if (mcc_2_4(2)) {
                  mcc_consume_token(NOT);
                  mcc_consume_token(IN);
                  mcc_consume_token(34);
                  t = GetStringLitteral();
                                    list = new ArrayList();
                                    list.Add(t);
                  while (true) {
                    switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
                    case 35:
                      ;
                      break;
                    default:
                      goto label_6;
                    }
                    mcc_consume_token(35);
                    t = GetStringLitteral();
                                            list.Add(t);
                  }label_6: ;
                  
                  mcc_consume_token(36);
                           left = ComparisonExpression.CreateNotIn(left, list);
                } else {
                  mcc_consume_token(-1);
                  throw new ParseException();
                }
                break;
              }
            }
            break;
          }
        }
        break;
      }
    }label_4: ;
    
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetAddExpression() {
    IExpression left;
    IExpression right;
    left = GetMultiplyExpression();
    while (true) {
      if (mcc_2_5(2147483647)) {
        ;
      } else {
        goto label_7;
      }
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case 37:
        mcc_consume_token(37);
        right = GetMultiplyExpression();
                    left = ArithmeticExpression.CreatePlus(left, right);
        break;
      case 38:
        mcc_consume_token(38);
        right = GetMultiplyExpression();
                    left = ArithmeticExpression.CreateMinus(left, right);
        break;
      default:
        mcc_consume_token(-1);
        throw new ParseException();
      }
    }label_7: ;
    
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetMultiplyExpression() {
    IExpression left;
    IExpression right;
    left = GetUnaryExpression();
    while (true) {
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case 39:
      case 40:
      case 41:
        ;
        break;
      default:
        goto label_8;
      }
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case 39:
        mcc_consume_token(39);
        right = GetUnaryExpression();
                left = ArithmeticExpression.CreateMultiply(left, right);
        break;
      case 40:
        mcc_consume_token(40);
        right = GetUnaryExpression();
                left = ArithmeticExpression.CreateDivide(left, right);
        break;
      case 41:
        mcc_consume_token(41);
        right = GetUnaryExpression();
                left = ArithmeticExpression.CreateMod(left, right);
        break;
      default:
        mcc_consume_token(-1);
        throw new ParseException();
      }
    }label_8: ;
    
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetUnaryExpression() {
    IExpression left = null;
    if (mcc_2_6(2147483647)) {
      mcc_consume_token(37);
      left = GetUnaryExpression();
    } else {
      switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
      case 38:
        mcc_consume_token(38);
        left = GetUnaryExpression();
                left = UnaryExpression.CreateNegate(left);
        break;
      case NOT:
        mcc_consume_token(NOT);
        left = GetUnaryExpression();
                    left = UnaryExpression.CreateNOT(AsBooleanExpression(left));
        break;
      case TRUE:
      case FALSE:
      case NULL:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case ID:
      case 34:
        left = GetPrimaryExpression();
        break;
      default:
        mcc_consume_token(-1);
        throw new ParseException();
      }
    }
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public IExpression GetPrimaryExpression() {
    IExpression left = null;
    switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
    case TRUE:
    case FALSE:
    case NULL:
    case DECIMAL_LITERAL:
    case HEX_LITERAL:
    case OCTAL_LITERAL:
    case FLOATING_POINT_LITERAL:
    case STRING_LITERAL:
      left = GetLiteral();
      break;
    case ID:
      left = GetVariable();
      break;
    case 34:
      mcc_consume_token(34);
      left = GetOrExpression();
      mcc_consume_token(36);
      break;
    default:
      mcc_consume_token(-1);
      throw new ParseException();
    }
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public ConstantExpression GetLiteral() {
    Token t;
    string s;
    ConstantExpression left = null;
    switch ((mcc_ntk==-1)?mcc_mntk():mcc_ntk) {
    case STRING_LITERAL:
      s = GetStringLitteral();
                left = new ConstantExpression(s);
      break;
    case DECIMAL_LITERAL:
      t = mcc_consume_token(DECIMAL_LITERAL);
                left = ConstantExpression.CreateFromDecimal(t.image);
      break;
    case HEX_LITERAL:
      t = mcc_consume_token(HEX_LITERAL);
                left = ConstantExpression.CreateFromHex(t.image);
      break;
    case OCTAL_LITERAL:
      t = mcc_consume_token(OCTAL_LITERAL);
                left = ConstantExpression.CreateFromOctal(t.image);
      break;
    case FLOATING_POINT_LITERAL:
      t = mcc_consume_token(FLOATING_POINT_LITERAL);
                left = ConstantExpression.CreateFloat(t.image);
      break;
    case TRUE:
      mcc_consume_token(TRUE);
                left = ConstantExpression.TRUE;
      break;
    case FALSE:
      mcc_consume_token(FALSE);
                left = ConstantExpression.FALSE;
      break;
    case NULL:
      mcc_consume_token(NULL);
                left = ConstantExpression.NULL;
      break;
    default:
      mcc_consume_token(-1);
      throw new ParseException();
    }
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  public string GetStringLitteral() {
    Token t;
    StringBuilder rc = new StringBuilder();
    t = mcc_consume_token(STRING_LITERAL);
        // Decode the sting value.
        String image = t.image;
        for(int c = 1; c < image.Length - 1; c++)
        {
                char ch = image[c];
                if(ch == '\'')
            {
                        c++;
            }
                        rc.Append(ch);
        }
            {return rc.ToString();}
    throw new Exception("Missing return statement in function");
  }

  public PropertyExpression GetVariable() {
    Token t;
    PropertyExpression left = null;
    t = mcc_consume_token(ID);
            left = new PropertyExpression(t.image);
        {return left;}
    throw new Exception("Missing return statement in function");
  }

  private bool mcc_2_1(int xla) {
    mcc_la = xla; mcc_lastpos = mcc_scanpos = token;
    try { return !mcc_3_1(); }
    catch(LookaheadSuccess) { return true; }
  }

  private bool mcc_2_2(int xla) {
    mcc_la = xla; mcc_lastpos = mcc_scanpos = token;
    try { return !mcc_3_2(); }
    catch(LookaheadSuccess) { return true; }
  }

  private bool mcc_2_3(int xla) {
    mcc_la = xla; mcc_lastpos = mcc_scanpos = token;
    try { return !mcc_3_3(); }
    catch(LookaheadSuccess) { return true; }
  }

  private bool mcc_2_4(int xla) {
    mcc_la = xla; mcc_lastpos = mcc_scanpos = token;
    try { return !mcc_3_4(); }
    catch(LookaheadSuccess) { return true; }
  }

  private bool mcc_2_5(int xla) {
    mcc_la = xla; mcc_lastpos = mcc_scanpos = token;
    try { return !mcc_3_5(); }
    catch(LookaheadSuccess) { return true; }
  }

  private bool mcc_2_6(int xla) {
    mcc_la = xla; mcc_lastpos = mcc_scanpos = token;
    try { return !mcc_3_6(); }
    catch(LookaheadSuccess) { return true; }
  }

  private bool mcc_3R_57() {
    if (mcc_scan_token(ESCAPE)) return true;
    if (mcc_3R_36()) return true;
    return false;
  }

  private bool mcc_3R_19() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_20()) {
    mcc_scanpos = xsp;
    if (mcc_3R_21()) {
    mcc_scanpos = xsp;
    if (mcc_3R_22()) return true;
    }
    }
    return false;
  }

  private bool mcc_3R_39() {
    if (mcc_3R_41()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_42()) { mcc_scanpos = xsp; break; }
    }
    return false;
  }

  private bool mcc_3_4() {
    if (mcc_scan_token(NOT)) return true;
    if (mcc_scan_token(IN)) return true;
    if (mcc_scan_token(34)) return true;
    if (mcc_3R_36()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_59()) { mcc_scanpos = xsp; break; }
    }
    if (mcc_scan_token(36)) return true;
    return false;
  }

  private bool mcc_3_6() {
    if (mcc_scan_token(37)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_15() {
    if (mcc_3R_19()) return true;
    return false;
  }

  private bool mcc_3R_36() {
    if (mcc_scan_token(STRING_LITERAL)) return true;
    return false;
  }

  private bool mcc_3R_14() {
    if (mcc_scan_token(NOT)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_12() {
    if (mcc_scan_token(37)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_53() {
    if (mcc_scan_token(IN)) return true;
    if (mcc_scan_token(34)) return true;
    if (mcc_3R_36()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_58()) { mcc_scanpos = xsp; break; }
    }
    if (mcc_scan_token(36)) return true;
    return false;
  }

  private bool mcc_3R_45() {
    if (mcc_scan_token(IS)) return true;
    if (mcc_scan_token(NOT)) return true;
    if (mcc_scan_token(NULL)) return true;
    return false;
  }

  private bool mcc_3R_13() {
    if (mcc_scan_token(38)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_33() {
    if (mcc_scan_token(NULL)) return true;
    return false;
  }

  private bool mcc_3_1() {
    if (mcc_scan_token(IS)) return true;
    if (mcc_scan_token(NULL)) return true;
    return false;
  }

  private bool mcc_3R_10() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_12()) {
    mcc_scanpos = xsp;
    if (mcc_3R_13()) {
    mcc_scanpos = xsp;
    if (mcc_3R_14()) {
    mcc_scanpos = xsp;
    if (mcc_3R_15()) return true;
    }
    }
    }
    return false;
  }

  private bool mcc_3R_44() {
    if (mcc_scan_token(29)) return true;
    if (mcc_3R_39()) return true;
    return false;
  }

  private bool mcc_3R_32() {
    if (mcc_scan_token(FALSE)) return true;
    return false;
  }

  private bool mcc_3_3() {
    if (mcc_scan_token(NOT)) return true;
    if (mcc_scan_token(BETWEEN)) return true;
    if (mcc_3R_41()) return true;
    if (mcc_scan_token(AND)) return true;
    if (mcc_3R_41()) return true;
    return false;
  }

  private bool mcc_3R_43() {
    if (mcc_scan_token(28)) return true;
    if (mcc_3R_39()) return true;
    return false;
  }

  private bool mcc_3R_40() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_43()) {
    mcc_scanpos = xsp;
    if (mcc_3R_44()) {
    mcc_scanpos = xsp;
    if (mcc_3_1()) {
    mcc_scanpos = xsp;
    if (mcc_3R_45()) return true;
    }
    }
    }
    return false;
  }

  private bool mcc_3R_52() {
    if (mcc_scan_token(BETWEEN)) return true;
    if (mcc_3R_41()) return true;
    if (mcc_scan_token(AND)) return true;
    if (mcc_3R_41()) return true;
    return false;
  }

  private bool mcc_3R_31() {
    if (mcc_scan_token(TRUE)) return true;
    return false;
  }

  private bool mcc_3R_56() {
    if (mcc_scan_token(ESCAPE)) return true;
    if (mcc_3R_36()) return true;
    return false;
  }

  private bool mcc_3R_18() {
    if (mcc_scan_token(41)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_30() {
    if (mcc_scan_token(FLOATING_POINT_LITERAL)) return true;
    return false;
  }

  private bool mcc_3R_37() {
    if (mcc_3R_39()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_40()) { mcc_scanpos = xsp; break; }
    }
    return false;
  }

  private bool mcc_3_2() {
    if (mcc_scan_token(NOT)) return true;
    if (mcc_scan_token(LIKE)) return true;
    if (mcc_3R_36()) return true;
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_57()) mcc_scanpos = xsp;
    return false;
  }

  private bool mcc_3R_51() {
    if (mcc_scan_token(LIKE)) return true;
    if (mcc_3R_36()) return true;
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_56()) mcc_scanpos = xsp;
    return false;
  }

  private bool mcc_3R_17() {
    if (mcc_scan_token(40)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_29() {
    if (mcc_scan_token(OCTAL_LITERAL)) return true;
    return false;
  }

  private bool mcc_3R_16() {
    if (mcc_scan_token(39)) return true;
    if (mcc_3R_10()) return true;
    return false;
  }

  private bool mcc_3R_11() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_16()) {
    mcc_scanpos = xsp;
    if (mcc_3R_17()) {
    mcc_scanpos = xsp;
    if (mcc_3R_18()) return true;
    }
    }
    return false;
  }

  private bool mcc_3R_38() {
    if (mcc_scan_token(AND)) return true;
    if (mcc_3R_37()) return true;
    return false;
  }

  private bool mcc_3R_28() {
    if (mcc_scan_token(HEX_LITERAL)) return true;
    return false;
  }

  private bool mcc_3R_9() {
    if (mcc_3R_10()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_11()) { mcc_scanpos = xsp; break; }
    }
    return false;
  }

  private bool mcc_3R_27() {
    if (mcc_scan_token(DECIMAL_LITERAL)) return true;
    return false;
  }

  private bool mcc_3R_55() {
    if (mcc_scan_token(38)) return true;
    if (mcc_3R_9()) return true;
    return false;
  }

  private bool mcc_3R_34() {
    if (mcc_3R_37()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_38()) { mcc_scanpos = xsp; break; }
    }
    return false;
  }

  private bool mcc_3_5() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_scan_token(37)) {
    mcc_scanpos = xsp;
    if (mcc_scan_token(38)) return true;
    }
    if (mcc_3R_9()) return true;
    return false;
  }

  private bool mcc_3R_50() {
    if (mcc_scan_token(33)) return true;
    if (mcc_3R_41()) return true;
    return false;
  }

  private bool mcc_3R_54() {
    if (mcc_scan_token(37)) return true;
    if (mcc_3R_9()) return true;
    return false;
  }

  private bool mcc_3R_26() {
    if (mcc_3R_36()) return true;
    return false;
  }

  private bool mcc_3R_49() {
    if (mcc_scan_token(32)) return true;
    if (mcc_3R_41()) return true;
    return false;
  }

  private bool mcc_3R_59() {
    if (mcc_scan_token(35)) return true;
    if (mcc_3R_36()) return true;
    return false;
  }

  private bool mcc_3R_46() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_54()) {
    mcc_scanpos = xsp;
    if (mcc_3R_55()) return true;
    }
    return false;
  }

  private bool mcc_3R_35() {
    if (mcc_scan_token(OR)) return true;
    if (mcc_3R_34()) return true;
    return false;
  }

  private bool mcc_3R_23() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_26()) {
    mcc_scanpos = xsp;
    if (mcc_3R_27()) {
    mcc_scanpos = xsp;
    if (mcc_3R_28()) {
    mcc_scanpos = xsp;
    if (mcc_3R_29()) {
    mcc_scanpos = xsp;
    if (mcc_3R_30()) {
    mcc_scanpos = xsp;
    if (mcc_3R_31()) {
    mcc_scanpos = xsp;
    if (mcc_3R_32()) {
    mcc_scanpos = xsp;
    if (mcc_3R_33()) return true;
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  private bool mcc_3R_48() {
    if (mcc_scan_token(31)) return true;
    if (mcc_3R_41()) return true;
    return false;
  }

  private bool mcc_3R_24() {
    if (mcc_scan_token(ID)) return true;
    return false;
  }

  private bool mcc_3R_47() {
    if (mcc_scan_token(30)) return true;
    if (mcc_3R_41()) return true;
    return false;
  }

  private bool mcc_3R_42() {
    Token xsp;
    xsp = mcc_scanpos;
    if (mcc_3R_47()) {
    mcc_scanpos = xsp;
    if (mcc_3R_48()) {
    mcc_scanpos = xsp;
    if (mcc_3R_49()) {
    mcc_scanpos = xsp;
    if (mcc_3R_50()) {
    mcc_scanpos = xsp;
    if (mcc_3R_51()) {
    mcc_scanpos = xsp;
    if (mcc_3_2()) {
    mcc_scanpos = xsp;
    if (mcc_3R_52()) {
    mcc_scanpos = xsp;
    if (mcc_3_3()) {
    mcc_scanpos = xsp;
    if (mcc_3R_53()) {
    mcc_scanpos = xsp;
    if (mcc_3_4()) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  private bool mcc_3R_41() {
    if (mcc_3R_9()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_46()) { mcc_scanpos = xsp; break; }
    }
    return false;
  }

  private bool mcc_3R_25() {
    if (mcc_3R_34()) return true;
    Token xsp;
    while (true) {
      xsp = mcc_scanpos;
      if (mcc_3R_35()) { mcc_scanpos = xsp; break; }
    }
    return false;
  }

  private bool mcc_3R_22() {
    if (mcc_scan_token(34)) return true;
    if (mcc_3R_25()) return true;
    if (mcc_scan_token(36)) return true;
    return false;
  }

  private bool mcc_3R_21() {
    if (mcc_3R_24()) return true;
    return false;
  }

  private bool mcc_3R_20() {
    if (mcc_3R_23()) return true;
    return false;
  }

  private bool mcc_3R_58() {
    if (mcc_scan_token(35)) return true;
    if (mcc_3R_36()) return true;
    return false;
  }

  public SelectorParserTokenManager token_source;
  SimpleCharStream mcc_input_stream;
  public Token token, mcc_nt;
  private int mcc_ntk;
  private Token mcc_scanpos, mcc_lastpos;
  private int mcc_la;
  public bool lookingAhead = false;
  //private bool mcc_semLA;

  public SelectorParser(System.IO.Stream stream) {
    mcc_input_stream = new SimpleCharStream(stream, 1, 1);
    token_source = new SelectorParserTokenManager(mcc_input_stream);
    token = new Token();
    mcc_ntk = -1;
  }

  public void ReInit(System.IO.Stream stream) {
    mcc_input_stream.ReInit(stream, 1, 1);
    token_source.ReInit(mcc_input_stream);
    token = new Token();
    mcc_ntk = -1;
  }

  public SelectorParser(System.IO.TextReader stream) {
    mcc_input_stream = new SimpleCharStream(stream, 1, 1);
    token_source = new SelectorParserTokenManager(mcc_input_stream);
    token = new Token();
    mcc_ntk = -1;
  }

  public void ReInit(System.IO.TextReader stream) {
    mcc_input_stream.ReInit(stream, 1, 1);
    token_source.ReInit(mcc_input_stream);
    token = new Token();
    mcc_ntk = -1;
  }

  public SelectorParser(SelectorParserTokenManager tm) {
    token_source = tm;
    token = new Token();
    mcc_ntk = -1;
  }

  public void ReInit(SelectorParserTokenManager tm) {
    token_source = tm;
    token = new Token();
    mcc_ntk = -1;
  }

   private Token mcc_consume_token(int kind) {
    Token oldToken = null;
    if ((oldToken = token).next != null) token = token.next;
    else token = token.next = token_source.GetNextToken();
    mcc_ntk = -1;
    if (token.kind == kind) {
      return token;
    }
    token = oldToken;
    throw GenerateParseException();
  }

  private class LookaheadSuccess : System.Exception { }
  private LookaheadSuccess mcc_ls = new LookaheadSuccess();
  private bool mcc_scan_token(int kind) {
    if (mcc_scanpos == mcc_lastpos) {
      mcc_la--;
      if (mcc_scanpos.next == null) {
        mcc_lastpos = mcc_scanpos = mcc_scanpos.next = token_source.GetNextToken();
      } else {
        mcc_lastpos = mcc_scanpos = mcc_scanpos.next;
      }
    } else {
      mcc_scanpos = mcc_scanpos.next;
    }
    if (mcc_scanpos.kind != kind) return true;
    if (mcc_la == 0 && mcc_scanpos == mcc_lastpos) throw mcc_ls;
    return false;
  }

  public Token GetNextToken() {
    if (token.next != null) token = token.next;
    else token = token.next = token_source.GetNextToken();
    mcc_ntk = -1;
    return token;
  }

  public Token GetToken(int index) {
    Token t = lookingAhead ? mcc_scanpos : token;
    for (int i = 0; i < index; i++) {
      if (t.next != null) t = t.next;
      else t = t.next = token_source.GetNextToken();
    }
    return t;
  }

  private int mcc_mntk() {
    if ((mcc_nt=token.next) == null)
      return (mcc_ntk = (token.next=token_source.GetNextToken()).kind);
    else
      return (mcc_ntk = mcc_nt.kind);
  }

  public ParseException GenerateParseException() {
    Token errortok = token.next;
    int line = errortok.beginLine, column = errortok.beginColumn;
    string mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
  }

  public void enable_tracing() {
  }

  public void disable_tracing() {
  }

}

}