我可以强制 Antlr 解析语法无效的程序和 return 解析树吗?

Can I force Antlr to parse a syntactically invalid program and return a parse tree?

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

{
 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 开发中备受关注的焦点。)

The Definitive ANTLR 4 Reference 中相当广泛地介绍了错误恢复。如果你打算深入研究 ANLTR(正如你所暗示的那样),我建议这本书几乎是“必读的”