3

私はCのような言語のためのコンパイラを構築しています。私は幾分レクサーとパーサーでやっています。今、私は意味解析をしようとしているし、シンボルテーブルを構築しようとしています。 仕様によれば、重複した宣言は同じ字句レベルでは許可されません。これには、各レキシカルレベルごとに異なるシンボルテーブルを構築する必要があります。これをどうやって行うのですか?今のよう は、私が持っている1つのシンボルテーブルには、各ノードが次のようになり、バイナリツリーの形である:さまざまなレキシカルレベルのシンボルテーブルを作成するにはどうすればよいですか?

struct tree_el 
{ 
    char *identifier; 
    char *type; 
    struct tree_el *right, *left; 
} 

私は別のツリーの「ルート」ノードに特定のノードを指してはどうすればよいですか?

どのようなヘルプが素晴らしいでしょう!どうもありがとう。

+1

[Language Implementation Patterns](http://pragprog.com/titles/tpdsl/language-implementation-patterns)を読んだことは本当に楽しいものでしたが、これはシンボルテーブルの作成に関する素晴らしい章でした。 – sarnold

答えて

1

通常、これはスタックのような構造で行われます。開始時に「字句レベル」がスタック上に開かれ、発生したときに追加レベルがプッシュされます。例えば

:あなたがこれを解析したとして

int i,j,k; 

while (i) { 
    int q, r, s; 

    ... 
} 

、あなたがijkのための最初の定義をいただきたいとあなたがそれらを追加したいです。次に、whileステートメントを実行し、qrsの定義を「プッシュ」します。 while文のスコープが終了したとき、あなたはあなただけで直接そのスコープ内で定義されたシンボルを含む各レキシカルスコープのためのシンボルの別のツリーを必要とするなどqrs

0

オフ「ポップ」と思います。シンボルを検索するときは、ファイルスコープに達するまで、最も深いスコープ、次に親スコープなどを調べます。