nfastate.java

来自「java 编译器java复杂编译器,可以编译java文件的类库」· Java 代码 · 共 2,249 行 · 第 1/5 页

JAVA
2,249
字号
            tmp = (NfaState)subSet.elementAt(j);            if (stateBlock)               dumped[tmp.stateName] = true;            tmp.DumpAsciiMoveForCompositeState(ostr, byteNum, j != 0);         }      }      if (stateBlock)         ostr.println("                  break;");      else         ostr.println("                  break;");   }   private boolean selfLoop()   {      if (next == null || next.epsilonMovesString == null)         return false;      int[] set = (int[])allNextStates.get(next.epsilonMovesString);      return ElemOccurs(stateName, set) >= 0;   }   private void DumpAsciiMoveForCompositeState(java.io.PrintWriter ostr, int byteNum, boolean elseNeeded)   {      boolean nextIntersects = selfLoop();      for (int j = 0; j < allStates.size(); j++)      {         NfaState temp1 = (NfaState)allStates.elementAt(j);         if (this == temp1 || temp1.stateName == -1 || temp1.dummy ||             stateName == temp1.stateName || temp1.asciiMoves[byteNum] == 0L)            continue;         if (!nextIntersects && Intersect(temp1.next.epsilonMovesString,                                         next.epsilonMovesString))         {            nextIntersects = true;            break;         }      }      //System.out.println(stateName + " \'s nextIntersects : " + nextIntersects);      String prefix = "";      if (asciiMoves[byteNum] != 0xffffffffffffffffL)      {         int oneBit = OnlyOneBitSet(asciiMoves[byteNum]);         if (oneBit != -1)            ostr.println("                  " + (elseNeeded ? "else " : "") + "if (curChar == " +                    (64 * byteNum + oneBit) + ")");         else            ostr.println("                  " + (elseNeeded ? "else " : "") + "if ((0x" + Long.toHexString(asciiMoves[byteNum]) +                    "L & l) != 0L)");         prefix = "   ";      }      if (kindToPrint != Integer.MAX_VALUE)      {         if (asciiMoves[byteNum] != 0xffffffffffffffffL)         {            ostr.println("                  {");         }         ostr.println(prefix + "                  if (kind > " + kindToPrint + ")");         ostr.println(prefix + "                     kind = " + kindToPrint + ";");      }      if (next != null && next.usefulEpsilonMoves > 0)      {         int[] stateNames = (int[])allNextStates.get(                                          next.epsilonMovesString);         if (next.usefulEpsilonMoves == 1)         {            int name = stateNames[0];            if (nextIntersects)               ostr.println(prefix + "                  jjCheckNAdd(" + name + ");");            else               ostr.println(prefix + "                  jjstateSet[jjnewStateCnt++] = " + name + ";");         }         else if (next.usefulEpsilonMoves == 2 && nextIntersects)         {            ostr.println(prefix + "                  jjCheckNAddTwoStates(" +               stateNames[0] + ", " + stateNames[1] + ");");         }         else         {            int[] indices = GetStateSetIndicesForUse(next.epsilonMovesString);            boolean notTwo = (indices[0] + 1 != indices[1]);            if (nextIntersects)               ostr.println(prefix + "                  jjCheckNAddStates(" +                  indices[0] + (notTwo  ? (", " + indices[1]) : "") + ");");            else               ostr.println(prefix + "                  jjAddStates(" +                                     indices[0] + ", " + indices[1] + ");");         }      }      if (asciiMoves[byteNum] != 0xffffffffffffffffL && kindToPrint != Integer.MAX_VALUE)         ostr.println("                  }");   }   private void DumpAsciiMove(java.io.PrintWriter ostr, int byteNum, boolean dumped[])   {      boolean nextIntersects = selfLoop() && isComposite;      boolean onlyState = true;      for (int j = 0; j < allStates.size(); j++)      {         NfaState temp1 = (NfaState)allStates.elementAt(j);         if (this == temp1 || temp1.stateName == -1 || temp1.dummy ||             stateName == temp1.stateName || temp1.asciiMoves[byteNum] == 0L)            continue;         if (onlyState && (asciiMoves[byteNum] & temp1.asciiMoves[byteNum]) != 0L)            onlyState = false;         if (!nextIntersects && Intersect(temp1.next.epsilonMovesString,                                         next.epsilonMovesString))            nextIntersects = true;         if (!dumped[temp1.stateName] && !temp1.isComposite &&             asciiMoves[byteNum] == temp1.asciiMoves[byteNum] &&             kindToPrint == temp1.kindToPrint &&             (next.epsilonMovesString == temp1.next.epsilonMovesString ||              (next.epsilonMovesString != null &&               temp1.next.epsilonMovesString != null &&               next.epsilonMovesString.equals(                            temp1.next.epsilonMovesString))))         {            dumped[temp1.stateName] = true;            ostr.println("               case " + temp1.stateName + ":");         }      }      //if (onlyState)         //nextIntersects = false;      int oneBit = OnlyOneBitSet(asciiMoves[byteNum]);      if (asciiMoves[byteNum] != 0xffffffffffffffffL)      {         if ((next == null || next.usefulEpsilonMoves == 0) &&             kindToPrint != Integer.MAX_VALUE)         {            String kindCheck = "";            if (!onlyState)               kindCheck = " && kind > " + kindToPrint;            if (oneBit != -1)               ostr.println("                  if (curChar == " +                  (64 * byteNum + oneBit) + kindCheck + ")");            else               ostr.println("                  if ((0x" +                   Long.toHexString(asciiMoves[byteNum]) +                   "L & l) != 0L" + kindCheck + ")");            ostr.println("                     kind = " + kindToPrint + ";");            if (onlyState)               ostr.println("                  break;");            else               ostr.println("                  break;");            return;         }      }      String prefix = "";      if (kindToPrint != Integer.MAX_VALUE)      {         if (oneBit != -1)         {            ostr.println("                  if (curChar != " +                    (64 * byteNum + oneBit) + ")");            ostr.println("                     break;");         }         else if (asciiMoves[byteNum] != 0xffffffffffffffffL)         {            ostr.println("                  if ((0x" + Long.toHexString(asciiMoves[byteNum]) + "L & l) == 0L)");            ostr.println("                     break;");         }         if (onlyState)         {            ostr.println("                  kind = " + kindToPrint + ";");         }         else         {            ostr.println("                  if (kind > " + kindToPrint + ")");            ostr.println("                     kind = " + kindToPrint + ";");         }      }      else      {         if (oneBit != -1)         {            ostr.println("                  if (curChar == " +                    (64 * byteNum + oneBit) + ")");            prefix = "   ";         }         else if (asciiMoves[byteNum] != 0xffffffffffffffffL)         {            ostr.println("                  if ((0x" + Long.toHexString(asciiMoves[byteNum]) + "L & l) != 0L)");            prefix = "   ";         }      }      if (next != null && next.usefulEpsilonMoves > 0)      {         int[] stateNames = (int[])allNextStates.get(                                          next.epsilonMovesString);         if (next.usefulEpsilonMoves == 1)         {            int name = stateNames[0];            if (nextIntersects)               ostr.println(prefix + "                  jjCheckNAdd(" + name + ");");            else               ostr.println(prefix + "                  jjstateSet[jjnewStateCnt++] = " + name + ";");         }         else if (next.usefulEpsilonMoves == 2 && nextIntersects)         {            ostr.println(prefix + "                  jjCheckNAddTwoStates(" +               stateNames[0] + ", " + stateNames[1] + ");");         }         else         {            int[] indices = GetStateSetIndicesForUse(next.epsilonMovesString);            boolean notTwo = (indices[0] + 1 != indices[1]);            if (nextIntersects)               ostr.println(prefix + "                  jjCheckNAddStates(" +                  indices[0] + (notTwo  ? (", " + indices[1]) : "") + ");");            else               ostr.println(prefix + "                  jjAddStates(" +                                     indices[0] + ", " + indices[1] + ");");         }      }      if (onlyState)         ostr.println("                  break;");      else         ostr.println("                  break;");   }   private static void DumpAsciiMoves(java.io.PrintWriter ostr, int byteNum)   {      boolean[] dumped = new boolean[Math.max(generatedStates, dummyStateIndex + 1)];      Enumeration e = compositeStateTable.keys();      DumpHeadForCase(ostr, byteNum);      while (e.hasMoreElements())         DumpCompositeStatesAsciiMoves(ostr, (String)e.nextElement(), byteNum, dumped);      for (int i = 0; i < allStates.size(); i++)      {         NfaState temp = (NfaState)allStates.elementAt(i);         if (dumped[temp.stateName] || temp.lexState != LexGen.lexStateIndex ||             !temp.HasTransitions() || temp.dummy ||             temp.stateName == -1)            continue;         String toPrint = "";         if (temp.stateForCase != null)         {            if (temp.inNextOf == 1)               continue;            if (dumped[temp.stateForCase.stateName])               continue;            toPrint = (temp.stateForCase.PrintNoBreak(ostr, byteNum, dumped));            if (temp.asciiMoves[byteNum] == 0L)            {               if (toPrint.equals(""))                  ostr.println("                  break;");               continue;            }         }         if (temp.asciiMoves[byteNum] == 0L)            continue;         if (!toPrint.equals(""))            ostr.print(toPrint);         dumped[temp.stateName] = true;         ostr.println("               case " + temp.stateName + ":");         temp.DumpAsciiMove(ostr, byteNum, dumped);      }      ostr.println("               default : break;");      ostr.println("            }");      ostr.println("         } while(i != startsAt);");      return;   }   private static void DumpCompositeStatesNonAsciiMoves(java.io.PrintWriter ostr,                                      String key, boolean[] dumped)   {      int i;      int[] nameSet = (int[])allNextStates.get(key);      if (nameSet.length == 1 || dumped[StateNameForComposite(key)])         return;      NfaState toBePrinted = null;      int neededStates = 0;      NfaState tmp;      NfaState stateForCase = null;      String toPrint = "";      boolean stateBlock = (stateBlockTable.get(key) != null);      for (i = 0; i < nameSet.length; i++)      {         tmp = (NfaState)allStates.elementAt(nameSet[i]);         if (tmp.nonAsciiMethod != -1)         {            if (neededStates++ == 1)               break;            else               toBePrinted = tmp;         }         else            dumped[tmp.stateName] = true;         if (tmp.stateForCase != null)         {            if (stateForCase != null)               throw new Error("JavaCC Bug: Please send mail to sankar@cs.stanford.edu : ");            stateForCase = tmp.stateForCase;         }      }      if (stateForCase != null)         toPrint = stateForCase.PrintNoBreak(ostr, -1, dumped);      if (neededStates == 0)      {         if (stateForCase != null && toPrint.equals(""))            ostr.println("                  break;");         return;      }      if (neededStates == 1)      {         if (!toPrint.equals(""))            ostr.print(toPrint);         ostr.println("               case " + StateNameForComposite(key) + ":");         if (!dumped[toBePrinted.stateName] && !stateBlock && toBePrinted.inNextOf > 1)            ostr.println("               case " + toBePrinted.stateName + ":");         dumped[toBePrinted.stateName] = true;         toBePrinted.DumpNonAsciiMove(ostr, dumped);         return;      }      if (!toPrint.equals(""))         ostr.print(toPrint);      int keyState = StateNameForComposite(key);      ostr.println("               case " + keyState + ":");      if (keyState < generatedStates)         dumped[keyState] = true;      for (i = 0; i < nameSet.length; i++)      {         tmp = (NfaState)allStates.elementAt(nameSet[i]);         if (tmp.nonAsciiMethod != -1)         {            if (stateBlock)               dumped[tmp.stateName] = true;            tmp.DumpNonAsciiMoveForCompositeState(ostr);         }      }      if (stateBlock)         ostr.println("                  break;");      else         ostr.println("                  break;");   }   private final void DumpNonAsciiMoveForCompositeState(java.io.PrintWriter ostr)   {      boolean nextIntersects = selfLoop();      for (int j = 0; j < allStates.size(); j++)      {         NfaState temp1 = (NfaState)allStates.elementAt(j);         if (this == temp1 || temp1.stateName == -1 || temp1.dummy ||             stateName == temp1.stateName || (temp1.nonAsciiMethod == -1))            continue;         if (!nextIntersects && Intersect(temp1.next.epsilonMovesString,                                         next.epsilonMovesString))         {            nextIntersects = true;            break;         }      }      if (!Options.B("JAVA_UNICODE_ESCAPE") && !unicodeWarningGiven)      {         if (loByteVec != null && loByteVec.size() > 1)            ostr.println("                  if ((jjbitVec" +             ((Integer)loByteVec.elementAt(1)).intValue() + "[i2" +                "] & l2) != 0L)");      }      else      {         ostr.println("                  if (jjCanMove_" + nonAsciiMethod +                                                "(hiByte, i1, i2, l1, l2))");      }      if (kindToPrint != Integer.MAX_VALUE)      {         ostr.println("                  {");         ostr.println("                     if (kind > " + kindToPrint + ")");         ostr.println("                        kind = " + kindToPrint + ";");      }      if (next != null && next.usefulEpsilonMoves > 0)      {         int[] stateNames = (int[])allNextStates.get(                                          next.epsilonMovesString);         if (next.usefulEpsilonMoves == 1)         {            int name = stateNames[0];            if (nextIntersects)               ostr.println("                     jjCheckNAdd(" + name + ");");            else 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?