0

エラーを検出した後でも、javaccに入力ファイルをさらに解析する方法はありますか?パニックモードの回復、フレーズレベルの回復など、いくつかの方法があることを知りました。しかし、javaccjjtファイルに実装する方法がわかりません。例として、私の入力ファイルが

Line 1: int i
Line 2: int x; 
Line 3: int k

したがって、1行目でセミコロンが欠落しているというエラーを検出した後、解析を続行して3行目でもエラーを見つけます。

4

1 に答える 1

0

パニックモードのエラー回復の方法で答えを見つけましたが、それにもいくつかのバグがあります。私がしたことは、文法を編集して、入力ファイルの行で欠落している文字 (上記の場合はセミコロン) に遭遇すると、パーサーが同様の文字を見つけるまで続行するようにすることでした。これらの類似の文字は、同期トークンと呼ばれます。

以下の例を参照してください。最初に、文法内のすべてのセミコロン トークンをこれに置き換えました。

    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() メソッドを呼び出したものだからです)。 .

誰でもこの問題を解決する方法を提案できますか。

于 2012-03-10T17:53:26.457 に答える