class X
{
int A()
{
int B
ユーザーがコードの一部を省略すると Syntax Parsing Engine が解析を誤る可能性があります。こうした特殊な場合はシンクロナイザー ペア エラー処理方法で処理できますが、大半の記号に対して IsStartOfErrorRecoveryPair を設定しても意味をなしません。バックトラッキング方法は、不良解析判断から一般的なバッキング事例を処理します。以下は、パーサーが解析を開始したドキュメントの一部の例です。
C# の場合:
class X
{
int A()
{
int B
パーサーは、ローカル変数「B」を含むメソッド「A」を含むクラス「X」内にあるとみなしています。ただし、ドキュメント全文はこのようになります。
C# の場合:
class X
{
int A()
{
int B()
{
}
}
構文解析がテキスト「B(」に到達すると、間違いがあることを認識します。ローカル変数宣言の後ろには 開カッコを続けることはできません。ここでどうなっているべきであったかと言うと、メソッド「A」のための閉カッコが抜けているとして挿入されるべきであったのと、「int B」はメソッドシグニチャの開始として解釈されるべきであったのです。
バックトラッキング方法では、パーサーが作成したばかりの一部の小さな構文ノードを分割し、省略されていたものがユーザーによって盛り込まれていた場合にはそれらのノード内のトークンがより良い形で解析できたかもしれない可能性を確認します。上記の例では、閉カッコがないことを正しく報告します。
バックトラッキング エラー処理方法に関する点について:
この方法は、 NonTerminalSymbol.PreventBacktracking プロパティを True に設定すると非終端記号で無効にすることができます。この値を True に設定した非終端記号に対しリダクションが起きると、リダクションによって作成された構文ノードはバックトラッキング方法を実施しようとして分割されることはありません。
エラー発生時にこのように分割されるのは、ほんのわずかな構文ノードのみです。また、あまりにも多くのトークンでノードが構成されていると、バックトラッキング方法は使用されません。ノード構造に解析された後で何百または何千というトークンを再解析するには時間がかかりすぎます。
このトピックの追加情報については、以下のトピックも合わせてご参照ください。