我可以强制Antlr解析语法无效的程序并返回解析树吗



我正在处理一个项目,该项目需要解析各种语法无效的程序,这些程序是通过向种子程序随机插入连续的令牌列表或从中删除一些令牌而生成的。我想将这些无效程序解析为不完整的解析树。以以下代码片段为例:

{
printf("hello");
int 
}

int之后没有标识符。

我可以强制Antlr将其解析为这样一个部分正确的树吗?

- code snippet
- LeftBrace             {
- ExpressionStatement   printf("hello");
- unknown node          int
- RightBrace            }

另一个例子:

{
printf("hello");
}(

语句后面有一个多余的(。这是我想要的:

- code snippet
- LeftBrace             {
- ExpressionStatement   printf("hello");
- RightBrace            }
- unknown node          (

取决于您想要识别的程度"坏的";输入,ANTLR默认情况下会这样做。

ANTLR的一个功能是它的错误恢复过程,它将在尝试解析输入时执行这种令牌插入和令牌忽略。DefaultErrorStrategy将忽略或插入单个令牌以恢复解析。如果这不起作用,它将消耗令牌(忽略它们(,直到找到有效的";下一个令牌";并继续处理。应该清楚的是,输入与有效输入的偏差越大,我们对错误恢复的期望就越低。

当然,它会识别输入点上的错误,但我认为您希望保留这种行为。当然,您可以放置自己的ErrorHandler并覆盖该行为。

您还可以提供自己的ANTLRErrorStrategy实现。(可能扩展了DefaultErrorStrategy,它已经非常好了,也是ANTLR开发中备受关注的焦点。(

错误恢复在最终ANTLR 4参考文献中有相当广泛的介绍。如果你要对ANLTR做更多深入的研究(正如你的问题所暗示的那样(,我建议这本书非常"有趣";强制阅读";

最新更新