1

C ターゲットを使用する antlr で生成された Java パーサーがあり、非常にうまく機能します。問題は、エラーのあるコードを解析して、意味のある AST を生成することも望んでいることです。1 つのインポートで最小限の Java クラスをフィードすると、その後にセミコロンがありません。「インポート」トークンとインポートされたクラスのトークンが存在する 2 つの「ツリー エラー ノード」オブジェクトが生成されます。

ただし、次のコードを正しく解析し、このコードの正しいノードを生成するため、セミコロンを追加するか再同期してエラーから回復する必要があります。antlr が AST で内部的に生成するこの固定入力を反映させる方法はありますか? または、少なくとも「ツリーノードエラー」を生成したトークン/テキストを何らかの形で取得できますか?

C ターゲットの antlr3commontreeadaptor.cの 200 行付近にある次のフラグメントは、C ターゲットがこれまでダミー エラー ノードのみを作成していることを示しています。

static  pANTLR3_BASE_TREE
errorNode                               (pANTLR3_BASE_TREE_ADAPTOR adaptor,   pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e)
{
    // Use the supplied common tree node stream to get another tree from the factory
    // TODO: Look at creating the erronode as in Java, but this is complicated by the
    // need to track and free the memory allocated to it, so for now, we just
    // want something in the tree that isn't a NULL pointer.
    //
    return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node");
}

ここで私は不運で、Java ターゲットが生成するエラー ノードだけがエラー ノードのテキストを取得できるのでしょうか?

4

2 に答える 2

0

考えられるすべての誤ったステートメントに対して新しい代替規則を文法に追加することで、この問題を解決しました。

各 Java インポート ステートメントは、人工シンボル IMPORT をルートとする AST サブツリーに変換されます。正しいコードと誤ったコードの AST を確実に区別できるようにするために、誤ったステートメントのルールは、ERR_ という接頭辞が付いたルート シンボルを使用して AST に書き換えます。したがって、インポート ステートメントの例では、人工的なルート シンボルは ERR_IMPORT になります。

より多くの異なるルート シンボルを使用して、解析エラーに関するより詳細な情報をエンコードできます。

私のパーサーは今では必要なだけエラー耐性があり、必要なときにいつでも新しい種類の誤った入力に対するルールを非常に簡単に追加できます。ただし、文法にあいまいさが生じないように注意する必要があります。

于 2010-06-14T07:50:41.430 に答える
0

私は antlr をあまり使用していませんが、通常、このタイプのエラーを処理する方法は、間違った構文に一致するルールを追加し、エラー ノードを生成させ、解析を継続できるようにエラー後に修正を試みることです。最後まで、1 つのエラーが新しいトークンごとにさらに多くのエラーをトリガーすることを望まないため、後で修正することが問題です。

于 2010-05-14T17:39:46.727 に答える