Previous: Lexical Tie-ins, Up: Context Dependency


7.3 字句解析結び付きとエラー回復

字句解析結び付きは、厳密なエラー回復規則を要求します。 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構造を中断すべきかどうか決定できるアクションを書けません。 そこで、もし、字句解析結び付きを使っているならば、 あなたが書いたエラー回復規則がそのようになっていないことを確かめるべきです。 それぞれの規則は、常にフラグを戻すべきか、あるいは常にフラグを戻さないべきか、 決定できるべきです。