我是antlr4的新手,我试图充分利用antlr从解析器错误中恢复的能力并继续进行。我发现它可以继续访问解析树,即使存在解析错误并且它将匹配规则但有时并非所有规则元素都存在。这会导致访问者代码出现问题,因为我的代码期望规则的所有元素都匹配,并且会抛出异常。
我想到的两个选择:
1)解析后,检查parser.getNumberOfSyntaxErrors()> 1,如果是的话,不要继续访问解析树。这将停止抛出异常,但不会给用户提供尽可能好的反馈。 antlr4确实可以很好地从错误中恢复,并可以进入我试图解析的下一个独立部分,因此这比我喜欢的更强。
2)我可以将每个self.visit()包装在可以捕获的东西中 一个例外并作出相应的反应我认为这会奏效。
但是,我想知道ctx中是否有某些内容会告诉我解析树中它下面的内容是不完整的匹配?
如果它是相关的,我使用python和antlr 4。
答案 0 :(得分:0)
正如您所看到的,一旦遇到错误,ANTLR4会尝试将输入流重新同步到规则结构。这通常是通过尝试检测单个丢失令牌或单个附加令牌来完成的。其他所有内容通常会导致错误节点一直到输入结束。
当然,如果无法成功解析输入,则解析树将不完整,至少从错误点开始,这可能比实际错误的位置早得多。这是因为变量前瞻,它可能消耗大量输入以在解析过程的早期找到预测(因此可能提前失败)。
事实上,我建议遵循路径1)。一旦出现语法错误,您可以使用的解析树中没有太多内容。这完全取决于语法结构将成功解析哪一部分(不要假设它总是一直到错误位置,正如我刚才解释的那样)。