2013-04-17 68 views
-1

我打算從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?

+1

Java字節碼不是真正的文本要解析;沒有記錄的「語法」。你爲什麼認爲這很有用? –

+0

您好,我的目標是比較兩個不同版本的程序的字節代碼生成的兩個AST。我想要具有語義差異,而不是差異工具返回的差異線差異 –

+0

使用eclipse-jdt插件,您可以從類文件/ java文件生成AST。不確定是否支持字節碼解析。 –

回答

0

當然,第一步是弄清楚你真的想要你的AST。由於缺少變量,範圍界定,未標記的中斷以及最方便用AST表示的其他功能,字節碼對標準語言的使用要少於標準語言。您仍然可以擁有一棵樹,其中的節點代表類,方法,指令和操作數,但在每種方法中,代碼基本上都是平坦的。

至於實際的實現,由於上述原因,我不知道任何人是由於字節碼的操作而創建AST的。最接近的,你會來的是字節碼彙編器的解析器。例如,您可以找到我的彙編程序here的語法。它使用Ply,它是Lex和Yacc的基於Python的實現,所以它應該是類似的。但是這是一個解析樹,用於協助組裝類文件的過程,而不是用於任何特定的程序轉換。

+0

您好,我的目標是比較兩個不同版本的程序的字節代碼生成的兩個AST。我想要具有語義差異,而不是由diff工具返回的行差異。 –

+0

那麼一個字節碼「ast」基本上會給你線差異。充其量它將有助於重新排序方法。 – Antimony

+0

嗨在解編譯器如何檢索變量和範圍界定的情況下呢?還具有異常處理功能,請嘗試catch塊?因爲它不可見於字節代碼/ –