我有一个使用 C 目标的 antlr 生成的 Java 解析器,它工作得很好。问题是我还希望它解析错误代码并生成有意义的 AST。如果我用一个导入提供一个最小的 Java 类,然后缺少一个分号,它会生成两个“树错误节点”对象,其中“导入”令牌和导入类的令牌应该是。
但是由于它正确解析了以下代码并为此代码生成了正确的节点,因此它必须通过添加分号或重新同步来从错误中恢复。有没有办法让 antlr 反映它在 AST 内部产生的这个固定输入?或者我至少可以以某种方式获得产生“树节点错误”的令牌/文本吗?
在第 200 行附近的 C 目标 antlr3commontreeadaptor.c中,以下片段表明 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目标产生的错误节点才能让我检索错误节点的文本?