Compiler-design-error-recovery

提供:Dev Guides
移動先:案内検索

コンパイラー設計-エラー回復

パーサーは、プログラムのエラーを検出して報告できる必要があります。 エラーが発生した場合、パーサーはそれを処理し、残りの入力の解析を続行できるはずです。 ほとんどの場合、パーサーからエラーをチェックすることが期待されますが、コンパイルプロセスのさまざまな段階でエラーが発生する可能性があります。 プログラムには、さまざまな段階で次の種類のエラーが発生する場合があります。

  • Lexical :誤って入力された識別子の名前
  • 構文:セミコロンが欠落しているか、括弧が不均衡です
  • Semantical :互換性のない値の割り当て
  • 論理:到達不能なコード、無限ループ

コード内のエラーに対処するためにパーサーに実装できる4つの一般的なエラー回復戦略があります。

パニックモード

パーサーは、ステートメント内のどこかでエラーを検出すると、セミコロンなどの誤った入力から区切り文字への入力を処理しないため、ステートメントの残りを無視します。 これはエラー回復の最も簡単な方法であり、パーサーによる無限ループの発生を防ぎます。

ステートメントモード

パーサーでエラーが発生すると、ステートメントの残りの入力でパーサーが先に解析できるように、修正措置を講じようとします。 たとえば、欠落しているセミコロンを挿入する、コンマをセミコロンで置き換えるなど。 パーサーの設計者は、間違った修正を行うと無限ループになる可能性があるため、ここで注意する必要があります。

エラー制作

いくつかの一般的なエラーは、コードで発生する可能性のあるコンパイラ設計者に知られています。 さらに、設計者は、これらのエラーが発生したときに誤った構成を生成するプロダクションとして、使用する拡張文法を作成できます。

グローバル補正

パーサーは、プログラムを全体として考慮し、プログラムが何をしようとしているかを把握しようとし、エラーに最も近いプログラムに最も近いものを見つけようとします。 誤った入力(ステートメント)Xが入力されると、エラーに最も近いステートメントYの解析ツリーが作成されます。 これにより、パーサーはソースコードに最小限の変更を加えることができますが、この戦略の複雑さ(時間とスペース)により、実際にはまだ実装されていません。

抽象構文ツリー

解析ツリー表現は、実際に必要な詳細よりも多く含まれているため、コンパイラーによる解析は容易ではありません。 例として次の解析ツリーを取り上げます。

解析ツリー

よく見ると、ほとんどのリーフノードは親ノードの単一の子ノードです。 この情報は、次のフェーズに送る前に削除できます。 追加情報を非表示にすることで、以下に示すツリーを取得できます。

抽象構文ツリー

抽象ツリーは次のように表すことができます。

抽象構文ツリー表現

ASTは、不必要な情報を最小限に抑えたコンパイラの重要なデータ構造です。 ASTは解析ツリーよりもコンパクトであり、コンパイラで簡単に使用できます。