📄 emitter.java
字号:
println(" /**"); println(" * Creates a new scanner."); println(" * There is also java.io.Reader version of this constructor."); println(" *"); println(" * @param in the java.io.Inputstream to read input from."); println(" */"); if (!printCtorArgs) println(warn); print(" "); if ( scanner.isPublic ) print("public "); print( getBaseName(scanner.className) ); print("(java.io.InputStream in"); if (printCtorArgs) emitCtorArgs(); print(")"); if ( scanner.initThrow != null && printCtorArgs ) { print(" throws "); print( scanner.initThrow ); } println(" {"); print(" this(new java.io.InputStreamReader(in)"); if (printCtorArgs) { for (int i=0; i < scanner.ctorArgs.size(); i++) { print(", "+scanner.ctorArgs.elementAt(i)); } } println(");"); println(" }"); } private void emitCtorArgs() { for (int i = 0; i < scanner.ctorArgs.size(); i++) { print(", "+scanner.ctorTypes.elementAt(i)); print(" "+scanner.ctorArgs.elementAt(i)); } } private void emitDoEOF() { if ( scanner.eofCode == null ) return; println(" /**"); println(" * Contains user EOF-code, which will be executed exactly once,"); println(" * when the end of file is reached"); println(" */"); print(" private void zzDoEOF()"); if ( scanner.eofThrow != null ) { print(" throws "); print(scanner.eofThrow); } println(" {"); println(" if (!zzEOFDone) {"); println(" zzEOFDone = true;"); println(" "+scanner.eofCode ); println(" }"); println(" }"); println(""); println(""); } private void emitLexFunctHeader() { if (scanner.cupCompatible) { // force public, because we have to implement java_cup.runtime.Symbol print(" public "); } else { print(" "+visibility+" "); } if ( scanner.tokenType == null ) { if ( scanner.isInteger ) print( "int" ); else if ( scanner.isIntWrap ) print( "Integer" ); else print( "Yytoken" ); } else print( scanner.tokenType ); print(" "); print(scanner.functionName); print("() throws java.io.IOException"); if ( scanner.lexThrow != null ) { print(", "); print(scanner.lexThrow); } if ( scanner.scanErrorException != null ) { print(", "); print(scanner.scanErrorException); } println(" {"); skel.emitNext(); if ( scanner.useRowMap ) { println(" int [] zzTransL = ZZ_TRANS;"); println(" int [] zzRowMapL = ZZ_ROWMAP;"); println(" int [] zzAttrL = ZZ_ATTRIBUTE;"); } skel.emitNext(); if ( scanner.charCount ) { println(" yychar+= zzMarkedPosL-zzStartRead;"); println(""); } if ( scanner.lineCount || scanner.columnCount ) { println(" boolean zzR = false;"); println(" for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;"); println(" zzCurrentPosL++) {"); println(" switch (zzBufferL[zzCurrentPosL]) {"); println(" case '\\u000B':"); println(" case '\\u000C':"); println(" case '\\u0085':"); println(" case '\\u2028':"); println(" case '\\u2029':"); if ( scanner.lineCount ) println(" yyline++;"); if ( scanner.columnCount ) println(" yycolumn = 0;"); println(" zzR = false;"); println(" break;"); println(" case '\\r':"); if ( scanner.lineCount ) println(" yyline++;"); if ( scanner.columnCount ) println(" yycolumn = 0;"); println(" zzR = true;"); println(" break;"); println(" case '\\n':"); println(" if (zzR)"); println(" zzR = false;"); println(" else {"); if ( scanner.lineCount ) println(" yyline++;"); if ( scanner.columnCount ) println(" yycolumn = 0;"); println(" }"); println(" break;"); println(" default:"); println(" zzR = false;"); if ( scanner.columnCount ) println(" yycolumn++;"); println(" }"); println(" }"); println(); if ( scanner.lineCount ) { println(" if (zzR) {"); println(" // peek one character ahead if it is \\n (if we have counted one line too much)"); println(" boolean zzPeek;"); println(" if (zzMarkedPosL < zzEndReadL)"); println(" zzPeek = zzBufferL[zzMarkedPosL] == '\\n';"); println(" else if (zzAtEOF)"); println(" zzPeek = false;"); println(" else {"); println(" boolean eof = zzRefill();"); println(" zzEndReadL = zzEndRead;"); println(" zzMarkedPosL = zzMarkedPos;"); println(" zzBufferL = zzBuffer;"); println(" if (eof) "); println(" zzPeek = false;"); println(" else "); println(" zzPeek = zzBufferL[zzMarkedPosL] == '\\n';"); println(" }"); println(" if (zzPeek) yyline--;"); println(" }"); } } if ( scanner.bolUsed ) { // zzMarkedPos > zzStartRead <=> last match was not empty // if match was empty, last value of zzAtBOL can be used // zzStartRead is always >= 0 println(" if (zzMarkedPosL > zzStartRead) {"); println(" switch (zzBufferL[zzMarkedPosL-1]) {"); println(" case '\\n':"); println(" case '\\u000B':"); println(" case '\\u000C':"); println(" case '\\u0085':"); println(" case '\\u2028':"); println(" case '\\u2029':"); println(" zzAtBOL = true;"); println(" break;"); println(" case '\\r': "); println(" if (zzMarkedPosL < zzEndReadL)"); println(" zzAtBOL = zzBufferL[zzMarkedPosL] != '\\n';"); println(" else if (zzAtEOF)"); println(" zzAtBOL = false;"); println(" else {"); println(" boolean eof = zzRefill();"); println(" zzMarkedPosL = zzMarkedPos;"); println(" zzEndReadL = zzEndRead;"); println(" zzBufferL = zzBuffer;"); println(" if (eof) "); println(" zzAtBOL = false;"); println(" else "); println(" zzAtBOL = zzBufferL[zzMarkedPosL] != '\\n';"); println(" }"); println(" break;"); println(" default:"); println(" zzAtBOL = false;"); println(" }"); println(" }"); } skel.emitNext(); if (scanner.bolUsed) { println(" if (zzAtBOL)"); println(" zzState = ZZ_LEXSTATE[zzLexicalState+1];"); println(" else"); println(" zzState = ZZ_LEXSTATE[zzLexicalState];"); println(); } else { println(" zzState = ZZ_LEXSTATE[zzLexicalState];"); println(); } skel.emitNext(); } private void emitGetRowMapNext() { println(" int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];"); println(" if (zzNext == "+DFA.NO_TARGET+") break zzForAction;"); println(" zzState = zzNext;"); println(); println(" int zzAttributes = zzAttrL[zzState];"); println(" if ( (zzAttributes & "+FINAL+") == "+FINAL+" ) {"); skel.emitNext(); println(" if ( (zzAttributes & "+NOLOOK+") == "+NOLOOK+" ) break zzForAction;"); skel.emitNext(); } private void emitTransitionTable() { transformTransitionTable(); println(" zzInput = zzCMapL[zzInput];"); println(); println(" boolean zzIsFinal = false;"); println(" boolean zzNoLookAhead = false;"); println(); println(" zzForNext: { switch (zzState) {"); for (int state = 0; state < dfa.numStates; state++) if (isTransition[state]) emitState(state); println(" default:"); println(" // if this is ever reached, there is a serious bug in JFlex"); println(" zzScanError(ZZ_UNKNOWN_ERROR);"); println(" break;"); println(" } }"); println(); println(" if ( zzIsFinal ) {"); skel.emitNext(); println(" if ( zzNoLookAhead ) break zzForAction;"); skel.emitNext(); } /** * Escapes all " ' \ tabs and newlines */ private String escapify(String s) { StringBuffer result = new StringBuffer(s.length()*2); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '\'': result.append("\\\'"); break; case '\"': result.append("\\\""); break; case '\\': result.append("\\\\"); break; case '\t': result.append("\\t"); break; case '\r': if (i+1 == s.length() || s.charAt(i+1) != '\n') result.append("\"+ZZ_NL+\""); break; case '\n': result.append("\"+ZZ_NL+\""); break; default: result.append(c); } } return result.toString(); } public void emitActionTable() { int lastAction = 1; int count = 0; int value = 0; println(" /** "); println(" * Translates DFA states to action switch labels."); println(" */"); CountEmitter e = new CountEmitter("Action"); e.emitInit(); for (int i = 0; i < dfa.numStates; i++) { int newVal = 0; if ( dfa.isFinal[i] ) { Action action = dfa.action[i]; if (action.isEmittable()) { Integer stored = (Integer) actionTable.get(action); if ( stored == null ) { stored = new Integer(lastAction++); actionTable.put(action, stored); } newVal = stored.intValue(); } } if (value == newVal) { count++; } else { if (count > 0) e.emit(count,value); count = 1; value = newVal; } } if (count > 0) e.emit(count,value); e.emitUnpack(); println(e.toString()); } private void emitActions() { println(" switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {"); int i = actionTable.size()+1; Enumeration actions = actionTable.keys(); while ( actions.hasMoreElements() ) { Action action = (Action) actions.nextElement(); int label = ((Integer) actionTable.get(action)).intValue(); println(" case "+label+": "); if (action.lookAhead() == Action.FIXED_BASE) { println(" // lookahead expression with fixed base length"); println(" zzMarkedPos = zzStartRead + "+action.getLookLength()+";"); } if (action.lookAhead() == Action.FIXED_LOOK || action.lookAhead() == Action.FINITE_CHOICE) { println(" // lookahead expression with fixed lookahead length"); println(" yypushback("+action.getLookLength()+");"); } if (action.lookAhead() == Action.GENERAL_LOOK) { println(" // general lookahead, find correct zzMarkedPos"); println(" { int zzFState = "+dfa.entryState[action.getEntryState()]+";"); println(" int zzFPos = zzStartRead;"); println(" if (zzFin.length <= zzBufferL.length) { zzFin = new boolean[zzBufferL.length+1]; }"); println(" boolean zzFinL[] = zzFin;"); println(" while (zzFState != -1 && zzFPos < zzMarkedPos) {"); println(" if ((zzAttrL[zzFState] & 1) == 1) { zzFinL[zzFPos] = true; } "); println(" zzInput = zzBufferL[zzFPos++];"); println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];"); println(" }"); println(" if (zzFState != -1 && (zzAttrL[zzFState] & 1) == 1) { zzFinL[zzFPos] = true; } "); println(); println(" zzFState = "+dfa.entryState[action.getEntryState()+1]+";"); println(" zzFPos = zzMarkedPos;"); println(" while (!zzFinL[zzFPos] || (zzAttrL[zzFState] & 1) != 1) {"); println(" zzInput = zzBufferL[--zzFPos];"); println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];"); println(" };"); println(" zzMarkedPos = zzFPos;"); println(" }"); } if ( scanner.debugOption ) { print(" System.out.println("); if ( scanner.lineCount ) print("\"line: \"+(yyline+1)+\" \"+"); if ( scanner.columnCount ) print("\"col: \"+(yycolumn+1)+\" \"+"); println("\"match: --\"+yytext()+\"--\");"); print(" System.out.println(\"action ["+action.priority+"] { "); print(escapify(action.content)); println(" }\");");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -