📄 emitter.java
字号:
} println(" { "+action.content); println(" }"); println(" case "+(i++)+": break;"); } } private void emitEOFVal() { EOFActions eofActions = parser.getEOFActions(); if ( scanner.eofCode != null ) println(" zzDoEOF();"); if ( eofActions.numActions() > 0 ) { println(" switch (zzLexicalState) {"); Enumeration stateNames = scanner.states.names(); // record lex states already emitted: Hashtable used = new Hashtable(); // pick a start value for break case labels. // must be larger than any value of a lex state: int last = dfa.numStates; while ( stateNames.hasMoreElements() ) { String name = (String) stateNames.nextElement(); int num = scanner.states.getNumber(name).intValue(); Action action = eofActions.getAction(num); if (action != null) { println(" case "+name+": {"); if ( scanner.debugOption ) { print(" System.out.println("); if ( scanner.lineCount ) print("\"line: \"+(yyline+1)+\" \"+"); if ( scanner.columnCount ) print("\"col: \"+(yycolumn+1)+\" \"+"); println("\"match: <<EOF>>\");"); print(" System.out.println(\"action ["+action.priority+"] { "); print(escapify(action.content)); println(" }\");"); } println(" "+action.content); println(" }"); println(" case "+(++last)+": break;"); } } println(" default:"); } Action defaultAction = eofActions.getDefault(); if (defaultAction != null) { println(" {"); if ( scanner.debugOption ) { print(" System.out.println("); if ( scanner.lineCount ) print("\"line: \"+(yyline+1)+\" \"+"); if ( scanner.columnCount ) print("\"col: \"+(yycolumn+1)+\" \"+"); println("\"match: <<EOF>>\");"); print(" System.out.println(\"action ["+defaultAction.priority+"] { "); print(escapify(defaultAction.content)); println(" }\");"); } println(" " + defaultAction.content); println(" }"); } else if ( scanner.eofVal != null ) println(" { " + scanner.eofVal + " }"); else if ( scanner.isInteger ) println(" return YYEOF;"); else println(" return null;"); if (eofActions.numActions() > 0) println(" }"); } private void emitState(int state) { println(" case "+state+":"); println(" switch (zzInput) {"); int defaultTransition = getDefaultTransition(state); for (int next = 0; next < dfa.numStates; next++) { if ( next != defaultTransition && table[state][next] != null ) { emitTransition(state, next); } } if ( defaultTransition != DFA.NO_TARGET && noTarget[state] != null ) { emitTransition(state, DFA.NO_TARGET); } emitDefaultTransition(state, defaultTransition); println(" }"); println(""); } private void emitTransition(int state, int nextState) { CharSetEnumerator chars; if (nextState != DFA.NO_TARGET) chars = table[state][nextState].characters(); else chars = noTarget[state].characters(); print(" case "); print(chars.nextElement()); print(": "); while ( chars.hasMoreElements() ) { println(); print(" case "); print(chars.nextElement()); print(": "); } if ( nextState != DFA.NO_TARGET ) { if ( dfa.isFinal[nextState] ) print("zzIsFinal = true; "); if ( !isTransition[nextState] ) print("zzNoLookAhead = true; "); if ( nextState == state ) println("break zzForNext;"); else println("zzState = "+nextState+"; break zzForNext;"); } else println("break zzForAction;"); } private void emitDefaultTransition(int state, int nextState) { print(" default: "); if ( nextState != DFA.NO_TARGET ) { if ( dfa.isFinal[nextState] ) print("zzIsFinal = true; "); if ( !isTransition[nextState] ) print("zzNoLookAhead = true; "); if ( nextState == state ) println("break zzForNext;"); else println("zzState = "+nextState+"; break zzForNext;"); } else println( "break zzForAction;" ); } private int getDefaultTransition(int state) { int max = 0; for (int i = 0; i < dfa.numStates; i++) { if ( table[state][max] == null ) max = i; else if ( table[state][i] != null && table[state][max].size() < table[state][i].size() ) max = i; } if ( table[state][max] == null ) return DFA.NO_TARGET; if ( noTarget[state] == null ) return max; if ( table[state][max].size() < noTarget[state].size() ) max = DFA.NO_TARGET; return max; } // for switch statement: private void transformTransitionTable() { int numInput = parser.getCharClasses().getNumClasses()+1; int i; char j; table = new CharSet[dfa.numStates][dfa.numStates]; noTarget = new CharSet[dfa.numStates]; for (i = 0; i < dfa.numStates; i++) for (j = 0; j < dfa.numInput; j++) { int nextState = dfa.table[i][j]; if ( nextState == DFA.NO_TARGET ) { if ( noTarget[i] == null ) noTarget[i] = new CharSet(numInput, colMap[j]); else noTarget[i].add(colMap[j]); } else { if ( table[i][nextState] == null ) table[i][nextState] = new CharSet(numInput, colMap[j]); else table[i][nextState].add(colMap[j]); } } } private void findActionStates() { isTransition = new boolean [dfa.numStates]; for (int i = 0; i < dfa.numStates; i++) { char j = 0; while ( !isTransition[i] && j < dfa.numInput ) isTransition[i] = dfa.table[i][j++] != DFA.NO_TARGET; } } private void reduceColumns() { colMap = new int [dfa.numInput]; colKilled = new boolean [dfa.numInput]; int i,j,k; int translate = 0; boolean equal; numCols = dfa.numInput; for (i = 0; i < dfa.numInput; i++) { colMap[i] = i-translate; for (j = 0; j < i; j++) { // test for equality: k = -1; equal = true; while (equal && ++k < dfa.numStates) equal = dfa.table[k][i] == dfa.table[k][j]; if (equal) { translate++; colMap[i] = colMap[j]; colKilled[i] = true; numCols--; break; } // if } // for j } // for i } private void reduceRows() { rowMap = new int [dfa.numStates]; rowKilled = new boolean [dfa.numStates]; int i,j,k; int translate = 0; boolean equal; numRows = dfa.numStates; // i is the state to add to the new table for (i = 0; i < dfa.numStates; i++) { rowMap[i] = i-translate; // check if state i can be removed (i.e. already // exists in entries 0..i-1) for (j = 0; j < i; j++) { // test for equality: k = -1; equal = true; while (equal && ++k < dfa.numInput) equal = dfa.table[i][k] == dfa.table[j][k]; if (equal) { translate++; rowMap[i] = rowMap[j]; rowKilled[i] = true; numRows--; break; } // if } // for j } // for i } /** * Set up EOF code section according to scanner.eofcode */ private void setupEOFCode() { if (scanner.eofclose) { scanner.eofCode = LexScan.conc(scanner.eofCode, " yyclose();"); scanner.eofThrow = LexScan.concExc(scanner.eofThrow, "java.io.IOException"); } } /** * Main Emitter method. */ public void emit() { setupEOFCode(); if (scanner.functionName == null) scanner.functionName = "yylex"; reduceColumns(); findActionStates(); emitHeader(); emitUserCode(); emitClassName(); skel.emitNext(); println(" private static final int ZZ_BUFFERSIZE = "+scanner.bufferSize+";"); if (scanner.debugOption) { println(" private static final String ZZ_NL = System.getProperty(\"line.separator\");"); } skel.emitNext(); emitLexicalStates(); emitCharMapArray(); emitActionTable(); if (scanner.useRowMap) { reduceRows(); emitRowMapArray(); if (scanner.packed) emitDynamicInit(); else emitZZTrans(); } skel.emitNext(); if (scanner.useRowMap) emitAttributes(); skel.emitNext(); emitLookBuffer(); emitClassCode(); skel.emitNext(); emitConstructorDecl(); emitCharMapInitFunction(); skel.emitNext(); emitScanError(); skel.emitNext(); emitDoEOF(); skel.emitNext(); emitLexFunctHeader(); emitNextInput(); if (scanner.useRowMap) emitGetRowMapNext(); else emitTransitionTable(); skel.emitNext(); emitActions(); skel.emitNext(); emitEOFVal(); skel.emitNext(); emitNoMatch(); skel.emitNext(); emitMain(); skel.emitNext(); out.close(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -