如何使ANTLR解析器严格?

How to make ANTLR parser strict?

提问人:Bachir Bendrissou 提问时间:9/29/2023 更新时间:10/4/2023 访问量:43

问:

下面是一个简单的 ANTLR 语法:

grammar EXAMPLE;

document
            :  Name+ EOF ;

Name
            : 'k'+ ;

生成的 antlr 解析器接受任何包含子字符串“k”的字符串。

但是,我希望解析器只接受符合语法的字符串。也就是说,包含“k”以外的字符的字符串应触发错误。

有没有办法确保这一点?

我尝试修改语法。并使用不同的输入进行测试。但是没有修复效果。

语法错误 语法 严格

评论

0赞 sepp2k 9/30/2023
你是说生成的解析器没有报告任何与语法不匹配的输入错误(它应该)?或者你是在谈论即使有错误它仍然返回解析树的事实?
0赞 kaby76 9/30/2023
Antlr4 词法分析器丢弃给定语法的无法识别的字符。因此,词法分析器只能识别“k”的序列。默认情况下,词法分析器将打印错误,但不会跟踪是否有错误。要启动,解析器错误计数根本不包括词法分析器错误。因此,如果您检查解析器错误计数,一切都很好。您需要为词法分析器实现错误侦听器,重写错误报告方法。为了保持一致,最好也对解析器执行相同的操作。这是我不喜欢 Antlr 工作方式的原因之一。但事实就是如此,您可以解决这个问题。
0赞 kaby76 9/30/2023
作为替代方案,您可以在语法末尾添加词法分析器规则。解析器现在将跟踪错误。Fubar: .;
0赞 Bachir Bendrissou 10/4/2023
@sepp2k 我说的是错误报告。
0赞 Bachir Bendrissou 10/4/2023
@kaby76 谢谢你的回答。我尝试了您添加词法分析器规则的最后一个建议,它有效。

答:

0赞 Bachir Bendrissou 10/4/2023 #1

在阅读了 Ken 的评论并重新访问了我的代码后,事实证明我的主函数中有以下行:

lexer.removeErrorListeners()

删除该行后,现在会报告词法分析器错误。

谢谢大家。