エラーを検出した後でも、javaccに入力ファイルをさらに解析する方法はありますか?パニックモードの回復、フレーズレベルの回復など、いくつかの方法があることを知りました。しかし、javaccjjtファイルに実装する方法がわかりません。例として、私の入力ファイルが
Line 1: int i
Line 2: int x;
Line 3: int k
したがって、1行目でセミコロンが欠落しているというエラーを検出した後、解析を続行して3行目でもエラーを見つけます。
エラーを検出した後でも、javaccに入力ファイルをさらに解析する方法はありますか?パニックモードの回復、フレーズレベルの回復など、いくつかの方法があることを知りました。しかし、javaccjjtファイルに実装する方法がわかりません。例として、私の入力ファイルが
Line 1: int i
Line 2: int x;
Line 3: int k
したがって、1行目でセミコロンが欠落しているというエラーを検出した後、解析を続行して3行目でもエラーを見つけます。
パニックモードのエラー回復の方法で答えを見つけましたが、それにもいくつかのバグがあります。私がしたことは、文法を編集して、入力ファイルの行で欠落している文字 (上記の場合はセミコロン) に遭遇すると、パーサーが同様の文字を見つけるまで続行するようにすることでした。これらの類似の文字は、同期トークンと呼ばれます。
以下の例を参照してください。最初に、文法内のすべてのセミコロン トークンをこれに置き換えました。
Semicolon()
次に、この新しい生産ルールを追加します。
void Semicolon() :
{}
{
try
{
<SEMICOLON>
} catch (ParseException e) {
Token t;
System.out.println(e.toString());
do {
t = getNextToken();
} while (t.kind != SEMICOLON && t!=null && t.kind != EOF );
}
}
欠落文字パーサーに遭遇すると、同様の文字を検索します。そのような文字が見つかると、それを呼び出したルールに戻ります。
例:- 変数宣言でセミコロンが欠落しているとします。
int a=10 <--- no semicolon
そのため、パーサーはセミコロンを検索します。ある時点でセミコロンを見つけます。
___(some code)__; method(param1);
したがって、上記の例で最初のセミコロンを見つけた後、変数宣言規則に戻ります (それは semicolon() メソッドを呼び出したものだからです)。 .
誰でもこの問題を解決する方法を提案できますか。