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