我正在为Java的一个子集编写一个编译器,并且我差不多完成了。我遇到的一件事是处理命名为jasmin-keywords的类,字段和方法。
例如:
class Test {
public static void main(String[] args) {
int a;
a = new pop().run();
}
}
class pop {
int lcmp;
int stack;
int isub;
int iload_0;
public int run() {
int aaload;
lcmp = 1;
aaload = lcmp;
return aaload;
}
public int swap() {
return 0;
}
public int iload_0() {
int istore;
boolean ret;
return 0;
}
}
像这样编译成茉莉花:
.source evul_names.java
.class Test
.super java/lang/Object
.method public <init>()V
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit locals 2
.limit stack 2
.var 0 is a I
.line 4
new pop
dup
invokespecial pop/<init>()V
invokevirtual pop/run()I
istore_0 ; a
return
.end method
.source evul_names.java
.class pop
.super java/lang/Object
.field public lcmp I
.field public stack I
.field public isub I
.field public iload_0 I
.method public <init>()V
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
.method public run()I
.limit locals 3
.limit stack 2
.line 15
.var 0 is <this> Lpop;
.var 1 is aaload I
.line 17
iconst_1
aload_0 ; this
swap
putfield pop/lcmp I
.line 18
aload_0 ; this
getfield pop/lcmp I
istore_1 ; aaload
.line 19
iload_1 ; aaload
ireturn
.end method
.method public swap()I
.limit locals 2
.limit stack 1
.line 22
.var 0 is <this> Lpop;
.line 23
iconst_0
ireturn
.end method
.method public iload_0()I
.limit locals 4
.limit stack 1
.line 26
.var 0 is <this> Lpop;
.var 1 is istore I
.var 2 is ret Z
.line 29
iconst_0
ireturn
.end method
问题是.class和.field指令,如果名称是关键字,它们会导致编译错误。我试过在它们周围加上单引号和双引号。使用单引号,jasmin会组装到类文件中,但随后会出现一个get verify错误(并且似乎实际上在名称中包括了引号,这是次优的)。使用双引号根本不会编译。
对此有什么解决办法吗,还是在茉莉花中不可能做到这一点?
最佳答案
经过几个小时的尝试,我决定修补茉莉花。当我提交补丁后,我意识到回购中的代码不是最新版本。然后,在获取了最新版本的代码之后,我意识到我已经实现的功能已经存在,但是由于某种原因,debian中的2.4尚无此功能,而sourceforge的2.4具有了。