【问题标题】:How to handle field named as keywords in jasmin如何处理 jasmin 中命名为关键字的字段
【发布时间】:2012-05-09 10:11:43
【问题描述】:

我正在为 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;
    }
}

这会像这样编译成 jasmin:

.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 组装成类文件,但随后出现验证错误(看起来它实际上包含名称中的引号,这是次优的)。使用双引号根本无法编译。

对此有什么解决方案吗,或者在 jasmin 中不可能做到这一点?

【问题讨论】:

    标签: java jvm-languages jasmin


    【解决方案1】:

    尝试了几个小时后,我决定修补 jasmin。当我提交补丁时,我意识到 repo 中的代码不是最新版本。然后在获得最新版本的代码后,我意识到我实现的功能已经存在,但由于某种原因,debian 中的 2.4 没有,但 sourceforge 的 2.4 有。

    【讨论】:

    • 是的,如果您使用最新版本的 jasmin,单引号可以解决问题。 ubunt/debian repos 中的 jasmin 不是最近的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多