📄 writecode.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 + -