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

📄 writecode.java

📁 一个JAVA编写的简单编译器
💻 JAVA
字号:
package codegen;

import java.util.Date;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class WriteCode {
  private static java.io.PrintStream pc = null;
  private static java.io.PrintStream px = null;

  public static final String[] header1 = {
    ";; Produced by JSub",
    ";; mailto: pengbin0211@hotmail.com",
  };

  public static final String[] header2 = {
    ".source %s.java",
    ".class public %s",
    ".super java/lang/Object",
    "",
  };

  public static void genHeader (String name) {
    for (int i = 0; i < header1.length; i++)
      pc.println (header1[i]);
    pc.println (";; " + getDate ());
    pc.println ();
    for (int i = 0; i < header2.length; i++)
      pc.println (printf (header2[i], name));
  }

  public static final String[] DefaultConstructor = {
    ".method public <init>()V",
    ".limit stack 1",
    ".limit locals 1",
    "",
    "  aload_0",
    "  invokespecial java/lang/Object/<init>()V",
    "  return",
    "",
    ".end method",
    "",
  };

  public static final String[] mainText = {
    ".method public static main([Ljava/lang/String;)V",
    ".limit stack %d",
    ".limit locals %d",
    };

  public static void genDefaultConstructor () {
    for (int i = 0; i < DefaultConstructor.length; i++)
      pc.println (DefaultConstructor[i]);
  }

  public static String printf (String text, String insert) {
    int i = text.indexOf ("%s");
    if (i < 0)
      return text;
    return text.substring (0, i) + insert + text.substring (i+2);
  }
  public static String printf (String text, int insert) {
    int j = text.indexOf ("%d");
    if (j >= 0)
      text = text.substring (0, j) + insert + text.substring (j+2);
    return text;
  }

  public static String getDate () {
       //  formatting of date
      SimpleDateFormat formatter 
          = new SimpleDateFormat ("HH:mm:ss dd.MM.yyyy");
      GregorianCalendar gc = new GregorianCalendar();
      Date date = gc.getTime ();
      return (formatierer.format(date));
    }

  private static String nameOfClass = null;

  public static void genComment (String line) {
    pc.println (";" + line);
  }

  public static void setClassName (String nameOfClass) {
    WriteCode.nameOfClass = nameOfClass;
  }

  public static void genstaticCall (String method, String params, String type) {
    pc.print ("  invokestatic ");
    if (method.indexOf ("/") < 0)
      method = nameOfClass + "/" + method;
    pc.println (method + "(" + params + ")" + type);
  }

  public static void genLoad (ast.declaration.JSubObject decl) {
    pc.println ("  " + decl.getLoadString ());
  }

  public static void genStore (ast.declaration.JSubObject decl) {
    pc.println ("  " + decl.getStoreString ());
  }

  public static void genField (String name, String type) {
    pc.println (".field public static " + name + " " + type);
  }

  private static boolean deadCode = false;
  public static void genInstruction (String code) {
    pc.println ("  " + code);
    deadCode = code.indexOf ("return") >= 0;
  }

  public static void genBranchInstruction (String code, int label) {
    if (!deadCode)
      pc.println ("  " + code + " label" + label);
  }

  private static int label = 0;
  private static void nextLabel () {
    label++;
  }

  public static int getLabel () {
    int myLabel = label;
    nextLabel ();
    return myLabel;
  }

  public static void genLabel (int label) {
    deadCode = false;
    pc.println ("label" + label + ":");
  }

  public static void genGoto (int label) {
    if (!deadCode)
      pc.println ("  goto label" + label);
  }

  static void resetLabel () {
    label = 0;
  }

  public static void genMethodHeader (String attribute, String name, String signature, String type, int locals, int stack) {
    pc.println (".method public static " + attribute + " " + name + "(" + signature + ")" + type);
    pc.println (printf (mainText[1], stack));
    pc.println (printf (mainText[2], locals));
  }

  public static void genMethodTrailer (String type) {
    if (type == "V")
      pc.println ("  return");
    pc.println (".end method\n");
    deadCode = false;
  }

  public static void genMain (int locals, int stack) {
    pc.println (mainText[0]);
    pc.println (printf (mainText[1], stack));
    pc.println (printf (mainText[2], locals+1)); // args[0] actual Parameter for main
  }

  public static void setCodeFile (String sourceCodeFileName) {
    int i = sourceCodeFileName.lastIndexOf(".java");
    if (i > 0) {
      String codeFileName = sourceCodeFileName.substring (0, i);
      try {
        if (!util.Options.getpnocodegen())
          pc = new java.io.PrintStream (new java.io.FileOutputStream (codeFileName + ".jas"));
        if (util.Options.getpgenxml()) {
          px = new java.io.PrintStream (new java.io.FileOutputStream (codeFileName + ".xml"));
          px.println ("<?xml version=\"1.0\"?>");
        }
      } catch (java.io.IOException ioex) {
        util.Error.e3 (ioex.toString ());
      }
    }
  }
  public static java.io.PrintStream getXMLFile () {
    return px;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -