⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emitter.java

📁 java语法解释器生成器
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
      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 + -