セマンティック分析は、コンパイラー内の多くの単純なステップを網羅する包括的な用語です。
通常、次の要素で構成されます。
- さらなる分析を簡素化するためのシンタックス シュガーおよび/またはマクロ展開パス
- 識別子の解決と名前の変更。つまり、各名前は完全修飾識別子に変換され、ローカル スコープの各識別子には一意の名前が付けられます。
- 型チェック (型推論または型伝播のいずれか)
- 制約チェック
- さまざまなサニティ チェック (つまり、「非 void 関数が値を返すかどうか」または「変数が初期化の前に使用されるかどうか」)
現在の傾向は、個別のパスを持つのではなく、すべての制約チェックを型システムに限定しようとすることです。多くの異なる言語に適した汎用的で強力な型付けアルゴリズムはHindley-Milnerです。複雑に見えるかもしれませんが、正しい方法で実行すれば、実際には (C や Java のような) 愚かな型の伝播よりも簡単に実装できます。
複雑な型付けと任意のセマンティック チェックの両方を行うための非常に一般的で単純なトリックの 1 つは、AST をウォークスルーし、単純な Prolog インタープリターにフィードして AST 全体を取得できる Prolog (場合によっては Datalog でさえも) 式のフラットなシーケンスを出力することです。制約システムが解決されました。