私の yacc パーサーはシンボル テーブルを作成しますが、スコープを考慮する必要があります。どうすればいいですか?スコープを終了すると、シンボル テーブルがどのように破棄されるかについて聞いたことがあります。これを行う方法についてはまだあまり明確ではありません。
2 に答える
あなたが適切に判断したように、これは yacc に間接的にのみ関連する問題です。(yacc が行うのは、入力文字列を文法内の文字列に一致させることだけです。)
したがって、すべてのシンボル管理とその他すべてのセマンティック処理をコードで行うことができます。自由に想像できる任意のデータ構造があります。
整理するためのいくつかの考え:
ネストされたスコープに入ると、新しいシンボル テーブルを作成し、特定のシンボルが見つかるまで外方向に複数のルックアップを実行できます。
単一のテーブルを使用して、各シンボルに元の字句レベルのタグを付けることができます。次に、字句レベルのみが異なる重複シンボルを処理する必要があり、複数のシンボルを返す可能性のあるルックアップが必要になりますが、必要なテーブルは 1 つだけです。スコープを終了した後にすべてのシンボルを保持する予定がない場合、これはその価値よりも問題になる可能性があります。これを行う場合、特定のスコープ内のすべてのシンボルを一緒にスレッド化するリンクへのルート ポインターを含む別のスタックを保持したい場合があります。
シンボル テーブルでスコープを処理するには、さまざまな方法があります。非常に簡単な方法の 1 つは、スコープごとに個別のテーブルを作成し、アクティブなスコープのリストを維持することです。
新しいスコープが入力されるたびに、そのテーブルを作成し、アクティブなスコープ リストの先頭に追加できます。スコープを離れるときは、アクティブなスコープ リストの先頭を削除するだけです。
通常、スコープの解析が完了したときにテーブルを破棄したくないと思います。後でセマンティック分析を実行したり、デバッグ情報を生成したりするために必要になる場合があります。