例外 | 解説 |
---|---|
System.ArgumentNullException | symbol が null の場合に発生します。 |
System.InvalidOperationException | 所有する Grammar の IsMutable の値が False の場合に発生します。 |
System.ArgumentException | symbol が NonTerminalSymbol と同じ Grammar にない場合に発生します。 |
ドキュメントの解析で、語彙アナライザーが予期しないトークンを見つけた場合、解析がエラーの復元を試みます。 エラー特定の種類を処理するさまざまな方法を使用します。1 つの方法として、エラーが発生したときに生成中の非終端記号を取得し、語彙アナライザーの予期しないトークンが、実際にはいずれかの非終端記号に予期されるかどうかを確認します。その場合、欠落した構造を予期しないトークンまで挿入し、トークンを「予期」されるトークンにして解析を続行します。ただし、特定の非終了記号のために、このエラー復元の方法は正しくない可能性があります。
たとえば、C# のクラス宣言の閉じる括弧の後にセミコロンがオプションです。クラス メンバー セクションに誤ったセミコロンが入力されている場合 (class X{ ; })、エラー復元処理では、セミコロンが閉じる括弧の後のオプションのセミコロンであると想定されます。解析ツリーに閉じる括弧に挿入します。実際の閉じる括弧を見つけると、その括弧はスキップされ、予期しないトークンとしてマークされます。これは実際に正しいエラーの報告ですが、セミコロンの後にクラス メンバーが宣言されている場合には事態が悪化します。クラス宣言の終了後にクラス メンバーを表すトークンを続けられない場合、これらのトークンはすべてスキップされることになります。
この問題を解決するには、特定の非終端記号に、予期しないトークンはエラー復元処理で使用される代わりにスキップされることを認識させる必要があります。上記の例では、セミコロンはクラスの終了でオプションです。当然のことながら、クラスの終了を示すには、セミコロンより閉じる括弧が優先されます。したがって、クラス宣言に含まれるセミコロンは、エラー復元処理では無視しなければなりません。セミコロンを表す TerminalSymbol をクラス宣言を表す NonTerminalSymbol で SuppressErrorRecoveryForSymbol メソッドに渡す必要があります。
注: 抑制が機能するのは、指定した symbol が NonTerminalSymbol のルール階層で直接参照される場合のみです。記号が他の非終端記号の参照によって間接的に参照される場合、この呼び出しはエラー復元処理に影響しません。