-1

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 を作成するための他のツールを利用できますか?

4

1 に答える 1

0

もちろん、最初のステップは、AST を実際にどのようにしたいのかを理解することです。バイトコードは、変数、スコープ、ラベルなしブレーク、および AST で最も便利に表現されるその他の機能がないため、標準言語よりもはるかに使用されません。クラス、メソッド、命令、およびオペランドを表すノードを持つツリーを引き続き使用できますが、各メソッド内では、コードは基本的にフラットです。

実際の実装に関しては、上記の理由により、操作のためにバイトコードから AST を作成した人を私は知りません。最も近いのは、バイトコード アセンブラー用のパーサーです。たとえば、私のアセンブラーの文法はここで見つけることができます。Lex と Yacc の Python ベースの実装である Ply を使用しているため、似ているはずです。ただし、これは、特定のプログラムによる変換ではなく、クラスファイルのアセンブル プロセスを支援するために設計された解析ツリーです。

于 2013-04-18T00:03:42.123 に答える