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 + -
显示快捷键?