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 ターゲットが生成するエラー ノードだけがエラー ノードのテキストを取得できるのでしょうか?