5

意味解析はコンパイラによって (一般的に) どのように行われますか?

私は前回の試験でこの質問に答えなければなりませんでしたが、教授にとっては十分ではありませんでした。

回答に BNF (例を含む) と構文カードを含めると、彼は私に次のように尋ねましたint i;

4

1 に答える 1

7

アホ&ウルマン/ドラゴンブックをじっくり読む時間。

セマンティック分析は、さまざまな値の型が何であるか、それらの型が式でどのように相互作用するか、およびそれらの相互作用が意味的に妥当かどうかを判断するコンパイラーの活動です。たとえば、文字列をクラス名で合理的に乗算することはできませんが、エディターで書くのを止めることはできません。

 "abc" * MyClass

これを行うには、コンパイラは最初に宣言とスコープを識別し、通常はこのステップの結果を一連のシンボル テーブルに記録する必要があります。これにより、特定の識別子が特定のコンテキストで何を意味するかがわかります。また、さまざまなリテラル定数の型も決定する必要があります。「abc」は 12.2e-5 とは異なるタイプです。

次に、識別子とリテラルが使用されているすべての場所を訪問し、識別子/リテラル​​の使用と計算結果が言語定義と互換性があることを確認する必要があります (上記の例のように)。

これがどのように行われるかについて: 通常、ソース コードが解析され、プログラムの何らかの表現が構築され (構文ツリーが非常に一般的です)、その表現が要素ごとにウォーク (「訪問」) され、セマンティック情報が収集/検証されます。シンボル テーブルは通常、スコープを表す構文ツリーに関連付けられた一連のハッシュ テーブルであり、識別子から型宣言を含む構造体へのハッシュです。

于 2012-01-03T15:01:47.833 に答える