字句解析結び付きは、厳密なエラー回復規則を要求します。 See Error Recovery。
その理由は、エラー回復規則の目的が、ある構成物の構文解析を中断し、 より大きな構成物の構文解析を再開することです。 前述のC言語に似ている言語の例では、次のように、 標準的なエラー回復規則は、次のセミコロンまでトークンを読み捨て、 新しい文の構文解析を再開します。
stmt: expr ';' | IF '(' expr ')' stmt { ... } ... error ';' { hexflag = 0; } ;
もし、‘hex (expr)’の途中で構文エラーが発生すれば、
このエラー回復規則が適用され、完了した‘hex expr)’に対する
アクションは決して実行されません。
すると、hexflag
は、入力の残りの間ずっと設定されたままでいるか、
次のhex
予約語の出現までそのままの状態でいて、
識別子が16進整数と誤解されます。
この問題を防ぐためには、エラー回復規則が
hexflag
を元に戻すべきです。
さらに、式の内部で働くエラー回復規則があるかもしれません。 たとえば、次の例のように、かっこの中でエラーが発生すると、 閉じかっこまで読み捨てるようなエラー回復規則が考えられます。
expr: ... | '(' expr ')' { $$ = $2; } | '(' error ')' ...
もし、この規則がhex
構造の中で働くならば、
その構造の中の内側のかっこに適用されるので、
構造を中断するべきではありません。
したがって、このアクションではフラグを戻すべきではなく、
hex
構造の残りはフラグを有効にしたまま構文解析されるべきです。
状況に応じて、hex
構造を中断できるかもしれないし、そうでないかもしれない
エラー回復規則があれば、どうなるでしょうか。
hex
構造を中断すべきかどうか決定できるアクションを書けません。
そこで、もし、字句解析結び付きを使っているならば、
あなたが書いたエラー回復規則がそのようになっていないことを確かめるべきです。
それぞれの規則は、常にフラグを戻すべきか、あるいは常にフラグを戻さないべきか、
決定できるべきです。