/* Generated By:CSharpCC: Do not edit this line. SelectorParserTokenManager.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;

public  class SelectorParserTokenManager : SelectorParserConstants {
  public  System.IO.TextWriter debugStream = Console.Out;
  public  void SetDebugStream(System.IO.TextWriter ds) { debugStream = ds; }
private int mccStopAtPos(int pos, int kind)
{
   mccmatchedKind = kind;
   mccmatchedPos = pos;
   return pos + 1;
}
private int mccMoveStringLiteralDfa0_0()
{
   switch((int)curChar) {
      case 9:
         mccmatchedKind = 2;
         return mccMoveNfa_0(5, 0);
      case 10:
         mccmatchedKind = 3;
         return mccMoveNfa_0(5, 0);
      case 12:
         mccmatchedKind = 5;
         return mccMoveNfa_0(5, 0);
      case 13:
         mccmatchedKind = 4;
         return mccMoveNfa_0(5, 0);
      case 32:
         mccmatchedKind = 1;
         return mccMoveNfa_0(5, 0);
      case 37:
         mccmatchedKind = 41;
         return mccMoveNfa_0(5, 0);
      case 40:
         mccmatchedKind = 34;
         return mccMoveNfa_0(5, 0);
      case 41:
         mccmatchedKind = 36;
         return mccMoveNfa_0(5, 0);
      case 42:
         mccmatchedKind = 39;
         return mccMoveNfa_0(5, 0);
      case 43:
         mccmatchedKind = 37;
         return mccMoveNfa_0(5, 0);
      case 44:
         mccmatchedKind = 35;
         return mccMoveNfa_0(5, 0);
      case 45:
         mccmatchedKind = 38;
         return mccMoveNfa_0(5, 0);
      case 47:
         mccmatchedKind = 40;
         return mccMoveNfa_0(5, 0);
      case 60:
         mccmatchedKind = 32;
         return mccMoveStringLiteralDfa1_0(9126805504L);
      case 61:
         mccmatchedKind = 28;
         return mccMoveNfa_0(5, 0);
      case 62:
         mccmatchedKind = 30;
         return mccMoveStringLiteralDfa1_0(2147483648L);
      case 65:
         return mccMoveStringLiteralDfa1_0(512L);
      case 66:
         return mccMoveStringLiteralDfa1_0(2048L);
      case 69:
         return mccMoveStringLiteralDfa1_0(8192L);
      case 70:
         return mccMoveStringLiteralDfa1_0(131072L);
      case 73:
         return mccMoveStringLiteralDfa1_0(49152L);
      case 76:
         return mccMoveStringLiteralDfa1_0(4096L);
      case 78:
         return mccMoveStringLiteralDfa1_0(262400L);
      case 79:
         return mccMoveStringLiteralDfa1_0(1024L);
      case 84:
         return mccMoveStringLiteralDfa1_0(65536L);
      case 88:
         return mccMoveStringLiteralDfa1_0(1572864L);
      case 97:
         return mccMoveStringLiteralDfa1_0(512L);
      case 98:
         return mccMoveStringLiteralDfa1_0(2048L);
      case 101:
         return mccMoveStringLiteralDfa1_0(8192L);
      case 102:
         return mccMoveStringLiteralDfa1_0(131072L);
      case 105:
         return mccMoveStringLiteralDfa1_0(49152L);
      case 108:
         return mccMoveStringLiteralDfa1_0(4096L);
      case 110:
         return mccMoveStringLiteralDfa1_0(262400L);
      case 111:
         return mccMoveStringLiteralDfa1_0(1024L);
      case 116:
         return mccMoveStringLiteralDfa1_0(65536L);
      case 120:
         return mccMoveStringLiteralDfa1_0(1572864L);
      default :
         return mccMoveNfa_0(5, 0);
   }
}
private int mccMoveStringLiteralDfa1_0(long active0)
{
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) {
   return mccMoveNfa_0(5, 0);
   }
   switch((int)curChar) {
      case 61:
         if ((active0 & 2147483648L) != 0L)
         {
            mccmatchedKind = 31;
            mccmatchedPos = 1;
         }
         else if ((active0 & 8589934592L) != 0L)
         {
            mccmatchedKind = 33;
            mccmatchedPos = 1;
         }
         break;
      case 62:
         if ((active0 & 536870912L) != 0L)
         {
            mccmatchedKind = 29;
            mccmatchedPos = 1;
         }
         break;
      case 65:
         return mccMoveStringLiteralDfa2_0(active0, 131072L);
      case 69:
         return mccMoveStringLiteralDfa2_0(active0, 2048L);
      case 73:
         return mccMoveStringLiteralDfa2_0(active0, 4096L);
      case 78:
         if ((active0 & 16384L) != 0L)
         {
            mccmatchedKind = 14;
            mccmatchedPos = 1;
         }
         return mccMoveStringLiteralDfa2_0(active0, 512L);
      case 79:
         return mccMoveStringLiteralDfa2_0(active0, 256L);
      case 80:
         return mccMoveStringLiteralDfa2_0(active0, 524288L);
      case 81:
         return mccMoveStringLiteralDfa2_0(active0, 1048576L);
      case 82:
         if ((active0 & 1024L) != 0L)
         {
            mccmatchedKind = 10;
            mccmatchedPos = 1;
         }
         return mccMoveStringLiteralDfa2_0(active0, 65536L);
      case 83:
         if ((active0 & 32768L) != 0L)
         {
            mccmatchedKind = 15;
            mccmatchedPos = 1;
         }
         return mccMoveStringLiteralDfa2_0(active0, 8192L);
      case 85:
         return mccMoveStringLiteralDfa2_0(active0, 262144L);
      case 97:
         return mccMoveStringLiteralDfa2_0(active0, 131072L);
      case 101:
         return mccMoveStringLiteralDfa2_0(active0, 2048L);
      case 105:
         return mccMoveStringLiteralDfa2_0(active0, 4096L);
      case 110:
         if ((active0 & 16384L) != 0L)
         {
            mccmatchedKind = 14;
            mccmatchedPos = 1;
         }
         return mccMoveStringLiteralDfa2_0(active0, 512L);
      case 111:
         return mccMoveStringLiteralDfa2_0(active0, 256L);
      case 112:
         return mccMoveStringLiteralDfa2_0(active0, 524288L);
      case 113:
         return mccMoveStringLiteralDfa2_0(active0, 1048576L);
      case 114:
         if ((active0 & 1024L) != 0L)
         {
            mccmatchedKind = 10;
            mccmatchedPos = 1;
         }
         return mccMoveStringLiteralDfa2_0(active0, 65536L);
      case 115:
         if ((active0 & 32768L) != 0L)
         {
            mccmatchedKind = 15;
            mccmatchedPos = 1;
         }
         return mccMoveStringLiteralDfa2_0(active0, 8192L);
      case 117:
         return mccMoveStringLiteralDfa2_0(active0, 262144L);
      default :
         break;
   }
   return mccMoveNfa_0(5, 1);
}
private int mccMoveStringLiteralDfa2_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return mccMoveNfa_0(5, 1);
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) {
   return mccMoveNfa_0(5, 1);
   }
   switch((int)curChar) {
      case 65:
         return mccMoveStringLiteralDfa3_0(active0, 524288L);
      case 67:
         return mccMoveStringLiteralDfa3_0(active0, 8192L);
      case 68:
         if ((active0 & 512L) != 0L)
         {
            mccmatchedKind = 9;
            mccmatchedPos = 2;
         }
         break;
      case 75:
         return mccMoveStringLiteralDfa3_0(active0, 4096L);
      case 76:
         return mccMoveStringLiteralDfa3_0(active0, 393216L);
      case 84:
         if ((active0 & 256L) != 0L)
         {
            mccmatchedKind = 8;
            mccmatchedPos = 2;
         }
         return mccMoveStringLiteralDfa3_0(active0, 2048L);
      case 85:
         return mccMoveStringLiteralDfa3_0(active0, 1114112L);
      case 97:
         return mccMoveStringLiteralDfa3_0(active0, 524288L);
      case 99:
         return mccMoveStringLiteralDfa3_0(active0, 8192L);
      case 100:
         if ((active0 & 512L) != 0L)
         {
            mccmatchedKind = 9;
            mccmatchedPos = 2;
         }
         break;
      case 107:
         return mccMoveStringLiteralDfa3_0(active0, 4096L);
      case 108:
         return mccMoveStringLiteralDfa3_0(active0, 393216L);
      case 116:
         if ((active0 & 256L) != 0L)
         {
            mccmatchedKind = 8;
            mccmatchedPos = 2;
         }
         return mccMoveStringLiteralDfa3_0(active0, 2048L);
      case 117:
         return mccMoveStringLiteralDfa3_0(active0, 1114112L);
      default :
         break;
   }
   return mccMoveNfa_0(5, 2);
}
private int mccMoveStringLiteralDfa3_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return mccMoveNfa_0(5, 2);
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) {
   return mccMoveNfa_0(5, 2);
   }
   switch((int)curChar) {
      case 65:
         return mccMoveStringLiteralDfa4_0(active0, 8192L);
      case 69:
         if ((active0 & 4096L) != 0L)
         {
            mccmatchedKind = 12;
            mccmatchedPos = 3;
         }
         else if ((active0 & 65536L) != 0L)
         {
            mccmatchedKind = 16;
            mccmatchedPos = 3;
         }
         return mccMoveStringLiteralDfa4_0(active0, 1048576L);
      case 76:
         if ((active0 & 262144L) != 0L)
         {
            mccmatchedKind = 18;
            mccmatchedPos = 3;
         }
         break;
      case 83:
         return mccMoveStringLiteralDfa4_0(active0, 131072L);
      case 84:
         return mccMoveStringLiteralDfa4_0(active0, 524288L);
      case 87:
         return mccMoveStringLiteralDfa4_0(active0, 2048L);
      case 97:
         return mccMoveStringLiteralDfa4_0(active0, 8192L);
      case 101:
         if ((active0 & 4096L) != 0L)
         {
            mccmatchedKind = 12;
            mccmatchedPos = 3;
         }
         else if ((active0 & 65536L) != 0L)
         {
            mccmatchedKind = 16;
            mccmatchedPos = 3;
         }
         return mccMoveStringLiteralDfa4_0(active0, 1048576L);
      case 108:
         if ((active0 & 262144L) != 0L)
         {
            mccmatchedKind = 18;
            mccmatchedPos = 3;
         }
         break;
      case 115:
         return mccMoveStringLiteralDfa4_0(active0, 131072L);
      case 116:
         return mccMoveStringLiteralDfa4_0(active0, 524288L);
      case 119:
         return mccMoveStringLiteralDfa4_0(active0, 2048L);
      default :
         break;
   }
   return mccMoveNfa_0(5, 3);
}
private int mccMoveStringLiteralDfa4_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return mccMoveNfa_0(5, 3);
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) {
   return mccMoveNfa_0(5, 3);
   }
   switch((int)curChar) {
      case 69:
         if ((active0 & 131072L) != 0L)
         {
            mccmatchedKind = 17;
            mccmatchedPos = 4;
         }
         return mccMoveStringLiteralDfa5_0(active0, 2048L);
      case 72:
         if ((active0 & 524288L) != 0L)
         {
            mccmatchedKind = 19;
            mccmatchedPos = 4;
         }
         break;
      case 80:
         return mccMoveStringLiteralDfa5_0(active0, 8192L);
      case 82:
         return mccMoveStringLiteralDfa5_0(active0, 1048576L);
      case 101:
         if ((active0 & 131072L) != 0L)
         {
            mccmatchedKind = 17;
            mccmatchedPos = 4;
         }
         return mccMoveStringLiteralDfa5_0(active0, 2048L);
      case 104:
         if ((active0 & 524288L) != 0L)
         {
            mccmatchedKind = 19;
            mccmatchedPos = 4;
         }
         break;
      case 112:
         return mccMoveStringLiteralDfa5_0(active0, 8192L);
      case 114:
         return mccMoveStringLiteralDfa5_0(active0, 1048576L);
      default :
         break;
   }
   return mccMoveNfa_0(5, 4);
}
private int mccMoveStringLiteralDfa5_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return mccMoveNfa_0(5, 4);
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) {
   return mccMoveNfa_0(5, 4);
   }
   switch((int)curChar) {
      case 69:
         if ((active0 & 8192L) != 0L)
         {
            mccmatchedKind = 13;
            mccmatchedPos = 5;
         }
         return mccMoveStringLiteralDfa6_0(active0, 2048L);
      case 89:
         if ((active0 & 1048576L) != 0L)
         {
            mccmatchedKind = 20;
            mccmatchedPos = 5;
         }
         break;
      case 101:
         if ((active0 & 8192L) != 0L)
         {
            mccmatchedKind = 13;
            mccmatchedPos = 5;
         }
         return mccMoveStringLiteralDfa6_0(active0, 2048L);
      case 121:
         if ((active0 & 1048576L) != 0L)
         {
            mccmatchedKind = 20;
            mccmatchedPos = 5;
         }
         break;
      default :
         break;
   }
   return mccMoveNfa_0(5, 5);
}
private int mccMoveStringLiteralDfa6_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return mccMoveNfa_0(5, 5);
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) {
   return mccMoveNfa_0(5, 5);
   }
   switch((int)curChar) {
      case 78:
         if ((active0 & 2048L) != 0L)
         {
            mccmatchedKind = 11;
            mccmatchedPos = 6;
         }
         break;
      case 110:
         if ((active0 & 2048L) != 0L)
         {
            mccmatchedKind = 11;
            mccmatchedPos = 6;
         }
         break;
      default :
         break;
   }
   return mccMoveNfa_0(5, 6);
}
private void mccCheckNAdd(int state)
{
   if (mccrounds[state] != mccround)
   {
      mccstateSet[mccnewStateCnt++] = state;
      mccrounds[state] = mccround;
   }
}
private void mccAddStates(int start, int end)
{
   do {
      mccstateSet[mccnewStateCnt++] = mccnextStates[start];
   } while (start++ != end);
}
private void mccCheckNAddTwoStates(int state1, int state2)
{
   mccCheckNAdd(state1);
   mccCheckNAdd(state2);
}
private void mccCheckNAddStates(int start, int end)
{
   do {
      mccCheckNAdd(mccnextStates[start]);
   } while (start++ != end);
}
private void mccCheckNAddStates(int start)
{
   mccCheckNAdd(mccnextStates[start]);
   mccCheckNAdd(mccnextStates[start + 1]);
}
static readonly long[] mccbitVec0 = {
   -2, -1L, -1L, -1L
};
static readonly long[] mccbitVec1 = {
   -1L, -1L, -1L, -1L
};
static readonly long[] mccbitVec2 = {
   0L, 0L, -1L, -1L
};
private int mccMoveNfa_0(int startState, int curPos)
{
   int strKind = mccmatchedKind;
   int strPos = mccmatchedPos;
   int seenUpto = curPos + 1;
   input_stream.Backup(seenUpto);
   try { curChar = input_stream.ReadChar(); }
   catch(System.IO.IOException) { throw new Exception("Internal Error"); }
   curPos = 0;
   //int[] nextStates;
   int startsAt = 0;
   mccnewStateCnt = 43;
   int i = 1;
   mccstateSet[0] = startState;
   int /*j,*/ kind = Int32.MaxValue;
   for (;;)
   {
      if (++mccround == Int32.MaxValue)
         ReInitRounds();
      if (curChar < 64)
      {
         long l = 1L << curChar;
         do
         {
            switch(mccstateSet[--i])
            {
               case 5:
                  if ((287948901175001088 & l) != 0L)
                     mccCheckNAddStates(0, 3);
                  else if (curChar == 36)
                  {
                     if (kind > 27)
                        kind = 27;
                     mccCheckNAdd(27);
                  }
                  else if (curChar == 39)
                     mccCheckNAddStates(4, 6);
                  else if (curChar == 46)
                     mccCheckNAdd(17);
                  else if (curChar == 47)
                     mccstateSet[mccnewStateCnt++] = 6;
                  else if (curChar == 45)
                     mccstateSet[mccnewStateCnt++] = 0;
                  if ((287667426198290432 & l) != 0L)
                  {
                     if (kind > 21)
                        kind = 21;
                     mccCheckNAddTwoStates(14, 15);
                  }
                  else if (curChar == 48)
                  {
                     if (kind > 23)
                        kind = 23;
                     mccCheckNAddTwoStates(40, 42);
                  }
                  break;
               case 0:
                  if (curChar == 45)
                     mccCheckNAddStates(7, 9);
                  break;
               case 1:
                  if ((-9217 & l) != 0L)
                     mccCheckNAddStates(7, 9);
                  break;
               case 2:
                  if ((9216 & l) != 0L && kind > 6)
                     kind = 6;
                  break;
               case 3:
                  if (curChar == 10 && kind > 6)
                     kind = 6;
                  break;
               case 4:
                  if (curChar == 13)
                     mccstateSet[mccnewStateCnt++] = 3;
                  break;
               case 6:
                  if (curChar == 42)
                     mccCheckNAddTwoStates(7, 8);
                  break;
               case 7:
                  if ((-4398046511105 & l) != 0L)
                     mccCheckNAddTwoStates(7, 8);
                  break;
               case 8:
                  if (curChar == 42)
                     mccCheckNAddStates(10, 12);
                  break;
               case 9:
                  if ((-145135534866433 & l) != 0L)
                     mccCheckNAddTwoStates(10, 8);
                  break;
               case 10:
                  if ((-4398046511105 & l) != 0L)
                     mccCheckNAddTwoStates(10, 8);
                  break;
               case 11:
                  if (curChar == 47 && kind > 7)
                     kind = 7;
                  break;
               case 12:
                  if (curChar == 47)
                     mccstateSet[mccnewStateCnt++] = 6;
                  break;
               case 13:
                  if ((287667426198290432 & l) == 0L)
                     break;
                  if (kind > 21)
                     kind = 21;
                  mccCheckNAddTwoStates(14, 15);
                  break;
               case 14:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 21)
                     kind = 21;
                  mccCheckNAddTwoStates(14, 15);
                  break;
               case 16:
                  if (curChar == 46)
                     mccCheckNAdd(17);
                  break;
               case 17:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 24)
                     kind = 24;
                  mccCheckNAddTwoStates(17, 18);
                  break;
               case 19:
                  if ((43980465111040 & l) != 0L)
                     mccCheckNAdd(20);
                  break;
               case 20:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 24)
                     kind = 24;
                  mccCheckNAdd(20);
                  break;
               case 21:
               case 22:
                  if (curChar == 39)
                     mccCheckNAddStates(4, 6);
                  break;
               case 23:
                  if (curChar == 39)
                     mccstateSet[mccnewStateCnt++] = 22;
                  break;
               case 24:
                  if ((-549755813889 & l) != 0L)
                     mccCheckNAddStates(4, 6);
                  break;
               case 25:
                  if (curChar == 39 && kind > 26)
                     kind = 26;
                  break;
               case 26:
                  if (curChar != 36)
                     break;
                  if (kind > 27)
                     kind = 27;
                  mccCheckNAdd(27);
                  break;
               case 27:
                  if ((287948969894477824 & l) == 0L)
                     break;
                  if (kind > 27)
                     kind = 27;
                  mccCheckNAdd(27);
                  break;
               case 28:
                  if ((287948901175001088 & l) != 0L)
                     mccCheckNAddStates(0, 3);
                  break;
               case 29:
                  if ((287948901175001088 & l) != 0L)
                     mccCheckNAddTwoStates(29, 30);
                  break;
               case 30:
                  if (curChar != 46)
                     break;
                  if (kind > 24)
                     kind = 24;
                  mccCheckNAddTwoStates(31, 32);
                  break;
               case 31:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 24)
                     kind = 24;
                  mccCheckNAddTwoStates(31, 32);
                  break;
               case 33:
                  if ((43980465111040 & l) != 0L)
                     mccCheckNAdd(34);
                  break;
               case 34:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 24)
                     kind = 24;
                  mccCheckNAdd(34);
                  break;
               case 35:
                  if ((287948901175001088 & l) != 0L)
                     mccCheckNAddTwoStates(35, 36);
                  break;
               case 37:
                  if ((43980465111040 & l) != 0L)
                     mccCheckNAdd(38);
                  break;
               case 38:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 24)
                     kind = 24;
                  mccCheckNAdd(38);
                  break;
               case 39:
                  if (curChar != 48)
                     break;
                  if (kind > 23)
                     kind = 23;
                  mccCheckNAddTwoStates(40, 42);
                  break;
               case 41:
                  if ((287948901175001088 & l) == 0L)
                     break;
                  if (kind > 22)
                     kind = 22;
                  mccstateSet[mccnewStateCnt++] = 41;
                  break;
               case 42:
                  if ((71776119061217280 & l) == 0L)
                     break;
                  if (kind > 23)
                     kind = 23;
                  mccCheckNAdd(42);
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else if (curChar < 128)
      {
         long l = 1L << (curChar & 63);
         do
         {
            switch(mccstateSet[--i])
            {
               case 5:
               case 27:
                  if ((576460745995190270 & l) == 0L)
                     break;
                  if (kind > 27)
                     kind = 27;
                  mccCheckNAdd(27);
                  break;
               case 1:
                  mccAddStates(7, 9);
                  break;
               case 7:
                  mccCheckNAddTwoStates(7, 8);
                  break;
               case 9:
               case 10:
                  mccCheckNAddTwoStates(10, 8);
                  break;
               case 15:
                  if ((17592186048512 & l) != 0L && kind > 21)
                     kind = 21;
                  break;
               case 18:
                  if ((137438953504 & l) != 0L)
                     mccAddStates(13, 14);
                  break;
               case 24:
                  mccAddStates(4, 6);
                  break;
               case 32:
                  if ((137438953504 & l) != 0L)
                     mccAddStates(15, 16);
                  break;
               case 36:
                  if ((137438953504 & l) != 0L)
                     mccAddStates(17, 18);
                  break;
               case 40:
                  if ((72057594054705152 & l) != 0L)
                     mccCheckNAdd(41);
                  break;
               case 41:
                  if ((541165879422 & l) == 0L)
                     break;
                  if (kind > 22)
                     kind = 22;
                  mccCheckNAdd(41);
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else
      {
         int hiByte = (curChar >> 8);
         int i1 = hiByte >> 6;
         long l1 = 1L << (hiByte & 63);
         int i2 = (curChar & 0xff) >> 6;
         long l2 = 1L << (curChar & 63);
         do
         {
            switch(mccstateSet[--i])
            {
               case 1:
                  if (mccCanMove_0(hiByte, i1, i2, l1, l2))
                     mccAddStates(7, 9);
                  break;
               case 7:
                  if (mccCanMove_0(hiByte, i1, i2, l1, l2))
                     mccCheckNAddTwoStates(7, 8);
                  break;
               case 9:
               case 10:
                  if (mccCanMove_0(hiByte, i1, i2, l1, l2))
                     mccCheckNAddTwoStates(10, 8);
                  break;
               case 24:
                  if (mccCanMove_0(hiByte, i1, i2, l1, l2))
                     mccAddStates(4, 6);
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      if (kind != Int32.MaxValue)
      {
         mccmatchedKind = kind;
         mccmatchedPos = curPos;
         kind = Int32.MaxValue;
      }
      ++curPos;
      if ((i = mccnewStateCnt) == (startsAt = 43 - (mccnewStateCnt = startsAt)))
         break;
      try { curChar = input_stream.ReadChar(); }
      catch(System.IO.IOException) { break; }
   }
   if (mccmatchedPos > strPos)
      return curPos;

   int toRet = Math.Max(curPos, seenUpto);

   if (curPos < toRet)
      for (i = toRet - Math.Min(curPos, seenUpto); i-- > 0; )
         try { curChar = input_stream.ReadChar(); }
         catch(System.IO.IOException) { throw new Exception("Internal Error : Please send a bug report."); }

   if (mccmatchedPos < strPos)
   {
      mccmatchedKind = strKind;
      mccmatchedPos = strPos;
   }
   else if (mccmatchedPos == strPos && mccmatchedKind > strKind)
      mccmatchedKind = strKind;

   return toRet;
}
static readonly int[] mccnextStates = {
   29, 30, 35, 36, 23, 24, 25, 1, 2, 4, 8, 9, 11, 19, 20, 33, 
   34, 37, 38, 
};
private static bool mccCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
{
   switch(hiByte)
   {
      case 0:
         return ((mccbitVec2[i2] & l2) != 0L);
      default : 
         if ((mccbitVec0[i1] & l1) != 0L)
            if ((mccbitVec1[i2] & l2) == 0L)
               return false;
            else
            return true;
         return false;
   }
}
public static readonly string[] mccstrLiteralImages = {
"", null, null, null, null, null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
null, "=", "<>", ">", ">=", "<", "<=", "(", ",", ")", "+", "-", "*", "/", "%", };
public static readonly string[] lexStateNames = {
   "DEFAULT", 
};
static readonly long[] mcctoToken = {
   4398012956417, 
};
static readonly long[] mcctoSkip = {
   254, 
};
static readonly long[] mcctoSpecial = {
   62, 
};
protected SimpleCharStream input_stream;
private readonly int[] mccrounds = new int[43];
private readonly int[] mccstateSet = new int[86];
protected char curChar;
public SelectorParserTokenManager(SimpleCharStream stream) {
   if (SimpleCharStream.staticFlag)
      throw new System.SystemException("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
   input_stream = stream;
}
public SelectorParserTokenManager(SimpleCharStream stream, int lexState)
   : this(stream) {
   SwitchTo(lexState);
}
public void ReInit(SimpleCharStream stream) {
   mccmatchedPos = mccnewStateCnt = 0;
   curLexState = defaultLexState;
   input_stream = stream;
   ReInitRounds();
}
private void ReInitRounds()
{
   int i;
   mccround = -2147483647;
   for (i = 43; i-- > 0;)
      mccrounds[i] = Int32.MinValue;
}
public void ReInit(SimpleCharStream stream, int lexState) {
   ReInit(stream);
   SwitchTo(lexState);
}
public void SwitchTo(int lexState) {
   if (lexState >= 1 || lexState < 0)
      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.InvalidLexicalState);
   else
      curLexState = lexState;
}

protected Token mccFillToken()
{
   Token t = Token.NewToken(mccmatchedKind);
   t.kind = mccmatchedKind;
   string im = mccstrLiteralImages[mccmatchedKind];
   t.image = (im == null) ? input_stream.GetImage() : im;
   t.beginLine = input_stream.BeginLine;
   t.beginColumn = input_stream.BeginColumn;
   t.endLine = input_stream.EndLine;
   t.endColumn = input_stream.EndColumn;
   return t;
}

int curLexState = 0;
int defaultLexState = 0;
int mccnewStateCnt;
int mccround;
int mccmatchedPos;
int mccmatchedKind;

public Token GetNextToken() {
  //int kind;
  Token specialToken = null;
  Token matchedToken;
  int curPos = 0;

for (;;) {
   try {
      curChar = input_stream.BeginToken();
   } catch(System.IO.IOException) {
      mccmatchedKind = 0;
      matchedToken = mccFillToken();
      matchedToken.specialToken = specialToken;
      return matchedToken;
   }

   mccmatchedKind = Int32.MaxValue;
   mccmatchedPos = 0;
   curPos = mccMoveStringLiteralDfa0_0();
   if (mccmatchedKind != Int32.MaxValue) {
      if (mccmatchedPos + 1 < curPos)
         input_stream.Backup(curPos - mccmatchedPos - 1);
      if ((mcctoToken[mccmatchedKind >> 6] & (1L << (mccmatchedKind & 63))) != 0L) {
         matchedToken = mccFillToken();
         matchedToken.specialToken = specialToken;
         return matchedToken;
      }
      else
      {
         if ((mcctoSpecial[mccmatchedKind >> 6] & (1L << (mccmatchedKind & 63))) != 0L) {
            matchedToken = mccFillToken();
            if (specialToken == null)
               specialToken = matchedToken;
            else {
               matchedToken.specialToken = specialToken;
               specialToken = (specialToken.next = matchedToken);
            }
         }
         goto EOFLoop;
      }
   }
   int error_line = input_stream.EndLine;
   int error_column = input_stream.EndColumn;
   string error_after = null;
   bool EOFSeen = false;
   try { input_stream.ReadChar(); input_stream.Backup(1); }
   catch (System.IO.IOException) {
      EOFSeen = true;
      error_after = curPos <= 1 ? "" : input_stream.GetImage();
      if (curChar == '\n' || curChar == '\r') {
         error_line++;
         error_column = 0;
      } else
         error_column++;
   }
   if (!EOFSeen) {
      input_stream.Backup(1);
      error_after = curPos <= 1 ? "" : input_stream.GetImage();
   }
   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LexicalError);
EOFLoop: ;
  }
}

}
