1

私はJavaのサブセット用のコンパイラを書いていますが、ほぼ完成しています。私が問題を抱えていることの 1 つは、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 がクラス ファイルにアセンブルしますが、検証エラーが発生します (実際には名前に引用符が含まれているようで、最適ではありません)。二重引用符を使用すると、まったくコンパイルされません。

これに対する解決策はまったくありますか、それともジャスミンでこれを行うことは不可能ですか?

4

1 に答える 1

0

何時間も試した後、ジャスミンにパッチを当てることにしました。パッチを提出したとき、リポジトリのコードが最新バージョンではないことに気付きました。その後、コードの最新バージョンを取得した後、実装した機能が既に存在することに気付きましたが、何らかの理由で debian の 2.4 にはそれがありませんでしたが、sourceforge の 2.4 にはありました。

于 2012-04-29T13:54:42.947 に答える