我打算從java字節代碼生成分析樹。一個典型的字節碼如下,使用flex和野牛組合或從java字節碼生成分析樹
public class org.scandroid.testing.InvokeCallArgTest extends org.scandroid.testing.SourceSink{
public org.scandroid.testing.InvokeCallArgTest();
Code:
0: aload_0
1: invokespecial #8; //Method org/scandroid/testing/SourceSink."<init>":()V
4: return
public static java.lang.String invokeCallArgSourceSpec();
Code:
0: iconst_1
1: newarray char
3: astore_0
4: aload_0
5: invokestatic #16; //Method org/scandroid/testing/SourceSink.load:([C)V
8: new #20; //class java/lang/String
11: dup
12: aload_0
13: invokespecial #22; //Method java/lang/String."<init>":([C)V
16: areturn
public static int invokeCallArgSourceSpecInt();
Code:
0: iconst_1
1: newarray char
3: astore_0
4: aload_0
5: invokestatic #16; //Method org/scandroid/testing/SourceSink.load:([C)V
8: aload_0
9: arraylength
10: ireturn
public static void invokeCallArgSinkSpecInt(int);
Code:
0: iload_0
1: invokestatic #30; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: invokestatic #36; //Method org/scandroid/testing/SourceSink.sink:(Ljava/lang/Object;)V
7: return
public static void invokeCallArgSinkSpecBiInt(int, int);
Code:
0: iload_0
1: iload_1
2: iadd
3: invokestatic #30; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: invokestatic #36; //Method org/scandroid/testing/SourceSink.sink:(Ljava/lang/Object;)V
9: return
}
我的目標是生成一個分析樹或抽象語法樹。我打算使用flex和bison組合。只是想知道它會是一個正確的方法嗎?我應該從頭開始還是有其他工具可用於處理從字節碼創建AST?
Java字節碼不是真正的文本要解析;沒有記錄的「語法」。你爲什麼認爲這很有用? –
您好,我的目標是比較兩個不同版本的程序的字節代碼生成的兩個AST。我想要具有語義差異,而不是差異工具返回的差異線差異 –
使用eclipse-jdt插件,您可以從類文件/ java文件生成AST。不確定是否支持字節碼解析。 –