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

📄 emitter.java

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