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
}
私の目標は、解析ツリーまたは抽象構文ツリーを生成することです。フレックスとバイソンのコンボを使用する予定です。それが正しいアプローチになるか知りたいだけですか?また、ゼロから始める必要がありますか、それともバイト コードから AST を作成するための他のツールを利用できますか?