2

javacc インタープリターを作成する方法、特に以前に生成された AST ツリーからシンボル テーブルを作成する方法について、かなり混乱しています。

このASTから、このようなもの:

> Program
>  Id
>  Id
>  Id
>  VarDecl
>   Type
>   Id
>  Stl
>   Id
>   NewInt
>    IntLit
>  Sta
>   Id
>   IntLit
>   ParseArgs
>    Id
>    IntLit
>  Sta
>   Id
>   IntLit
>   ParseArgs
>    Id
>    IntLit
(…)

このテーブルへ

=== Symbol table ===
Name    Type    Init    Values
----    ----    ----    ------
args    args[]  true    2   12  8
x        int[]  true    2   4   0

たとえば、この入力で

class gcd {
  public static void main(String[] args) {
    int[] x;
    x = new int[2];

    x[0] = Integer.parseInt(args[0]);
    x[1] = Integer.parseInt(args[1]);
    if (x[0] == 0)
      System.out.println(x[1]);
    else
      while (x[1] > 0) {
        if (x[0] > x[1])
          x[0] = x[0] - x[1];
        else
          x[1] = x[1] - x[0];
      }
    System.out.println(x[0]);
  }
}

私が今持っているものは、ASTを作成するだけです。

私の大きな問題は、ツリー上のタイプを 1 つずつ定義して比較する方法です。

理論を含め、どんな助けも素晴らしいでしょう。

ありがとう。

4

1 に答える 1

3

簡単な答えは、「ツリーをたどり、シンボル テーブルを作成する」です。

ツリーを下に再帰すると、スコープ構造に遭遇します。遭遇したそのようなノードごとにスコープを構築し、スコープスタックの一番上にプッシュします。スコープが導入されたノードの宣言の子にアクセスすると、スコープ スタックの最上部のスコープに宣言の定義が挿入されます。スコープを導入したノードから戻ったら、スコープ スタックをポップします。ほら、レキシカルスコープ言語のシンボルテーブル。これらはすべて JavaCC から独立しており、コンパイラの本で詳しく説明されています。入手して注意深く読むことをお勧めします。

名前空間を持つ言語はそれほど簡単ではありませんが、この構造に押し込めることはできます。これがそれほど簡単ではないスコープ間のより複雑な関係を持つ言語があります。

Java でこれを行うには... 型システムの詳細は複雑で不可解であり、型の構文が何を意味するかを知ることの複雑さは驚くほど複雑です。テンプレート化されたタイプ。ここで役立つコンパイラーの本はありません。独自のシンボル テーブルを作成する場合は、Java リファレンス マニュアルを解釈する必要があります。これは非常に難しいと予想してください。それは他のすべての人のためです。

パッケージ参照に遭遇すると、「それほど簡単に入れ子にならない」スコープの問題の 1 つが見つかります。パッケージ参照を含むモジュールの名前を解決するには、まず、参照されたパッケージのソースまたはクラス ファイルを見つけ、その .xml のシンボル テーブルを作成する必要があります。これは事実上、1 つのファイルのシンボル テーブルを作成している最中に、ファイル システムに到達し、ファイルを [テキストとしてまたはクラスとして] 解析し、そのシンボル テーブルを作成してから先に進む必要があることを意味します。

結論: Java には、シンボル テーブル ビルダーにとって不都合な驚きがたくさんあります。

(私はプログラム分析ツールを構築しています。さまざまな Java 方言をすべて解析するのに数日しかかからなかったのは、一部には非常に優れた解析機構があるためです。Java 1.7 まで適切なシンボル テーブルを構築するのに数か月かかりました。 Java 1.8 に取り組んでいます)。

実際に AST とシンボル テーブルを使用したい場合は、他の誰かのパーサー/名前型リゾルバーを取得/使用する方がはるかに優れています。JDT AST 機械が思い浮かびます。私の会社もこの分野でツールを提供しています。

于 2014-05-25T16:21:22.247 に答える