前文
エラー回復機能を備えた GLR パーサーを作成しました。エラーが発生すると、次の代替手段に分割されます。
- 期待される要素を入力に挿入し (ユーザーが見逃した可能性があります)、通常どおりに処理を進めます。
- エラーのある要素を予想される要素 (ユーザーがタイプミスした可能性があります) に置き換えて、通常どおり続行します。
- エラーのある要素をスキップし、次の要素もエラーの場合は #2 に進みます。
しかし、入力に多くのエラーがある場合 (たとえば、ユーザーが誤って JPEG ファイルをパーサーに渡してしまった場合)、代替手段の数が指数関数的に増加します。
例
次の文法に対応するこのようなパーサー:
Program -> Identifier WS Identifier WS '=' WS Identifier
Identifier -> ('a'..'z' | 'A'..'Z' | '0'..'9')*
WS -> ' '*
次のテキストに適用されます。
x = "abc\"def"; y = "ghi\"jkl";
中程度の最新のデスクトップ コンピューターでは、「メモリ不足」で失敗します。
質問
入力エラーが発生した場合に選択肢の数を減らす方法は?