3

私は、C に似た言語用のコンパイラを構築している最中です。レクサーとパーサーの使用はある程度完了しました。現在、セマンティック分析を行おうとしており、シンボル テーブルを構築しようとしています。現在、仕様によれば、同じレキシカル レベルでの重複宣言は許可されていません。これには、レキシカル レベルごとに異なるシンボル テーブルを作成する必要がありますね。どうすればこれを行うことができますか?現在、私が持っている 1 つのシンボル テーブルは、各ノードが次のように見えるバイナリ ツリーの形式になっています。

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

特定のノードを別のツリーの「ルート」ノードにポイントするにはどうすればよいですか?

どんな助けでも素晴らしいでしょう!どうもありがとう。

4

2 に答える 2

1

通常、これはスタックのような構造で行われます。開始時に各「レキシカル レベル」がスタック上で開かれ、追加のレベルが検出されるとプッシュされます。

例えば:

int i,j,k;

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

   ...
}

これを解析するとき、最初に and の定義をi j行いk、それらを追加します。q r次に、 while ステートメントをヒットし、 andの定義を「プッシュ」しますsq rwhile ステートメントのスコープが終了すると、 andsなどが「ポップ」されます。

于 2011-01-30T13:04:13.873 に答える
0

そのスコープ内で直接定義されたシンボルだけを含む、レキシカルスコープごとに個別のシンボルツリーが必要です。シンボルを検索するときは、最初に最も深い包含スコープを検索し、次に親スコープというように、ファイル スコープに到達するまで検索します。

于 2011-01-31T04:19:31.630 に答える