由于访问者的解析错误,antlr4 处理不完整的规则匹配

antlr4 handling incomplete rule match because of parse error in visitor

我是 antlr4 的新手,我正在尝试充分利用 antlr 从解析器错误中恢复并继续的能力。我发现它可以继续访问解析树,即使出现解析错误并且它会匹配规则但有时并非所有规则元素都存在。这会导致我的访问者代码出现问题,因为我的代码期望规则匹配的所有元素都存在,但它会抛出异常。

我想到的两个方案:

1) 解析后,检查 parser.getNumberOfSyntaxErrors() > 1 如果是,则不要继续访问解析树。这将阻止抛出异常,但不会给用户尽可能好的反馈。 antlr4 确实可以很好地从错误中恢复,并且可以到达我正在尝试解析的下一个独立部分,所以这比我想要的更强大。

2) 我可以将每个 self.visit() 包裹在可以捕获的东西中 一个例外并做出相应的反应。我认为这会起作用。

但是,我想知道 ctx 中是否有某些东西或其他东西会告诉我解析树中它下面的内容是不完全匹配的?

如果相关,我将 python 与 antlr 4 一起使用。

如您所见,一旦遇到错误,ANTLR4 会尝试 re-synchronize 将输入流添加到规则结构中。这通常是通过尝试检测单个丢失的令牌或单个附加令牌来完成的。其他一切通常都会导致错误节点一直到输入的末尾。

当然,如果无法成功解析输入,那么解析树将是不完整的,至少从错误的角度来看,这可能比实际错误所在的位置早得多。发生这种情况是因为变量前瞻,它可能会消耗大量输入以在解析过程的早期找到预测(因此这可能会提前失败)。

事实上,我建议遵循路径 1)。一旦遇到语法错误,解析树中就没有多少可用的了。这完全取决于语法结构,哪一部分将被成功解析(不要假设它总是直到错误位置,正如我刚刚解释的那样)。