자바의 하위 집합에 대한 컴파일러를 작성 중이며 거의 완료되었습니다. 한 가지 문제는 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은 클래스 파일로 어셈블되지만, 하나는 확인 오류를 발생시킵니다 (실제로는 차선책 인 이름에 따옴표가 포함 된 것처럼 보입니다). 큰 따옴표를 사용하면 컴파일되지 않습니다.
이것에 대한 해결책이 있습니까, 아니면 재스민에서 불가능합니까?
그럼 단일 인용문으로 해결 되었습니까? – Nubsis
예. 최신 버전의 jasmin을 사용하는 경우 단일 인용 부호로 해결합니다. ubunt/debian repos의 재스민은 최근의 것이 아닙니다. – Torandi