📄 emitter.java
字号:
println(" * This class is a scanner generated by "); println(" * <a href=\"http://www.jflex.de/\">JFlex</a> "+Main.version); println(" * on "+date+" from the specification file"); println(" * <tt>"+path+"</tt>"); println(" */"); } if ( scanner.isPublic ) print("public "); if ( scanner.isAbstract) print("abstract "); if ( scanner.isFinal ) print("final "); print("class "); print(scanner.className); if ( scanner.isExtending != null ) { print(" extends "); print(scanner.isExtending); } if ( scanner.isImplementing != null ) { print(" implements "); print(scanner.isImplementing); } println(" {"); } /** * Try to find out if user code ends with a javadoc comment * * @param buffer the user code * @return true if it ends with a javadoc comment */ public static boolean endsWithJavadoc(StringBuffer usercode) { String s = usercode.toString().trim(); if (!s.endsWith("*/")) return false; // find beginning of javadoc comment int i = s.lastIndexOf("/**"); if (i < 0) return false; // javadoc comment shouldn't contain a comment end return s.substring(i,s.length()-2).indexOf("*/") < 0; } private void emitLexicalStates() { Enumeration stateNames = scanner.states.names(); while ( stateNames.hasMoreElements() ) { String name = (String) stateNames.nextElement(); int num = scanner.states.getNumber(name).intValue(); println(" "+visibility+" static final int "+name+" = "+2*num+";"); } // can't quite get rid of the indirection, even for non-bol lex states: // their DFA states might be the same, but their EOF actions might be different // (see bug #1540228) println(""); println(" /**"); println(" * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l"); println(" * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l"); println(" * at the beginning of a line"); println(" * l is of the form l = 2*k, k a non negative integer"); println(" */"); println(" private static final int ZZ_LEXSTATE[] = { "); int i, j = 0; print(" "); for (i = 0; i < 2*dfa.numLexStates-1; i++) { print( dfa.entryState[i], 2 ); print(", "); if (++j >= 16) { println(); print(" "); j = 0; } } println( dfa.entryState[i] ); println(" };"); } private void emitDynamicInit() { int count = 0; int value = dfa.table[0][0]; println(" /** "); println(" * The transition table of the DFA"); println(" */"); CountEmitter e = new CountEmitter("Trans"); e.setValTranslation(+1); // allow vals in [-1, 0xFFFE] e.emitInit(); for (int i = 0; i < dfa.numStates; i++) { if ( !rowKilled[i] ) { for (int c = 0; c < dfa.numInput; c++) { if ( !colKilled[c] ) { if (dfa.table[i][c] == value) { count++; } else { e.emit(count, value); count = 1; value = dfa.table[i][c]; } } } } } e.emit(count, value); e.emitUnpack(); println(e.toString()); } private void emitCharMapInitFunction() { CharClasses cl = parser.getCharClasses(); if ( cl.getMaxCharCode() < 256 ) return; println(""); println(" /** "); println(" * Unpacks the compressed character translation table."); println(" *"); println(" * @param packed the packed character translation table"); println(" * @return the unpacked character translation table"); println(" */"); println(" private static char [] zzUnpackCMap(String packed) {"); println(" char [] map = new char[0x10000];"); println(" int i = 0; /* index in packed string */"); println(" int j = 0; /* index in unpacked array */"); println(" while (i < "+2*intervals.length+") {"); println(" int count = packed.charAt(i++);"); println(" char value = packed.charAt(i++);"); println(" do map[j++] = value; while (--count > 0);"); println(" }"); println(" return map;"); println(" }"); } private void emitZZTrans() { int i,c; int n = 0; println(" /** "); println(" * The transition table of the DFA"); println(" */"); println(" private static final int ZZ_TRANS [] = {"); print(" "); for (i = 0; i < dfa.numStates; i++) { if ( !rowKilled[i] ) { for (c = 0; c < dfa.numInput; c++) { if ( !colKilled[c] ) { if (n >= 10) { println(); print(" "); n = 0; } print( dfa.table[i][c] ); if (i != dfa.numStates-1 || c != dfa.numInput-1) print( ", "); n++; } } } } println(); println(" };"); } private void emitCharMapArrayUnPacked() { CharClasses cl = parser.getCharClasses(); println(""); println(" /** "); println(" * Translates characters to character classes"); println(" */"); println(" private static final char [] ZZ_CMAP = {"); int n = 0; // numbers of entries in current line print(" "); int max = cl.getMaxCharCode(); // not very efficient, but good enough for <= 255 characters for (char c = 0; c <= max; c++) { print(colMap[cl.getClassCode(c)],2); if (c < max) { print(", "); if ( ++n >= 16 ) { println(); print(" "); n = 0; } } } println(); println(" };"); println(); } private void emitCharMapArray() { CharClasses cl = parser.getCharClasses(); if ( cl.getMaxCharCode() < 256 ) { emitCharMapArrayUnPacked(); return; } // ignores cl.getMaxCharCode(), emits all intervals instead intervals = cl.getIntervals(); println(""); println(" /** "); println(" * Translates characters to character classes"); println(" */"); println(" private static final String ZZ_CMAP_PACKED = "); int n = 0; // numbers of entries in current line print(" \""); int i = 0; int count, value; while ( i < intervals.length ) { count = intervals[i].end-intervals[i].start+1; value = colMap[intervals[i].charClass]; // count could be >= 0x10000 while (count > 0xFFFF) { printUC(0xFFFF); printUC(value); count -= 0xFFFF; n++; } printUC(count); printUC(value); if (i < intervals.length-1) { if ( ++n >= 10 ) { println("\"+"); print(" \""); n = 0; } } i++; } println("\";"); println(); println(" /** "); println(" * Translates characters to character classes"); println(" */"); println(" private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);"); println(); } /** * Print number as octal/unicode escaped string character. * * @param c the value to print * @prec 0 <= c <= 0xFFFF */ private void printUC(int c) { if (c > 255) { out.print("\\u"); if (c < 0x1000) out.print("0"); out.print(Integer.toHexString(c)); } else { out.print("\\"); out.print(Integer.toOctalString(c)); } } private void emitRowMapArray() { println(""); println(" /** "); println(" * Translates a state to a row index in the transition table"); println(" */"); HiLowEmitter e = new HiLowEmitter("RowMap"); e.emitInit(); for (int i = 0; i < dfa.numStates; i++) { e.emit(rowMap[i]*numCols); } e.emitUnpack(); println(e.toString()); } private void emitAttributes() { println(" /**"); println(" * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>"); println(" */"); CountEmitter e = new CountEmitter("Attribute"); e.emitInit(); int count = 1; int value = 0; if ( dfa.isFinal[0] ) value = FINAL; if ( !isTransition[0] ) value|= NOLOOK; for (int i = 1; i < dfa.numStates; i++) { int attribute = 0; if ( dfa.isFinal[i] ) attribute = FINAL; if ( !isTransition[i] ) attribute|= NOLOOK; if (value == attribute) { count++; } else { e.emit(count, value); count = 1; value = attribute; } } e.emit(count, value); e.emitUnpack(); println(e.toString()); } private void emitClassCode() { if ( scanner.eofCode != null ) { println(" /** denotes if the user-EOF-code has already been executed */"); println(" private boolean zzEOFDone;"); println(""); } if ( scanner.classCode != null ) { println(" /* user code: */"); println(scanner.classCode); } } private void emitConstructorDecl() { emitConstructorDecl(true); if ((scanner.standalone || scanner.debugOption) && scanner.ctorArgs.size() > 0) { Out.warning(ErrorMessages.get(ErrorMessages.CTOR_DEBUG)); println(); emitConstructorDecl(false); } } private void emitConstructorDecl(boolean printCtorArgs) { String warn = "// WARNING: this is a default constructor for " + "debug/standalone only. Has no custom parameters or init code."; if (!printCtorArgs) println(warn); print(" "); if ( scanner.isPublic ) print("public "); print( getBaseName(scanner.className) ); print("(java.io.Reader in"); if (printCtorArgs) emitCtorArgs(); print(")"); if ( scanner.initThrow != null && printCtorArgs) { print(" throws "); print( scanner.initThrow ); } println(" {"); if ( scanner.initCode != null && printCtorArgs) { print(" "); print( scanner.initCode ); } println(" this.zzReader = in;"); println(" }"); println();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -