如何解决为什么使用 ANTLR4 创建正确的错误消息如此复杂?
我正在尝试用 Java 编写一个命题逻辑程序,以确定公式是否格式正确。显然,ANTLR 是一个不错的选择,因为我可以在 CFG 中编写所有规则。所有这些都很好,而且我的语法工作得很好(它检测公式何时格式正确或不正确)。然而,这个程序是针对该主题的初学者的,我希望能够告诉他们输入公式时出错的地方。
如果我输入公式 (A -> B
,解析器会识别出它的格式不正确,因为它缺少右括号。然而,它产生的错误至少可以说是乏善可陈:line 1:5 no viable alternative at input '(A -> B'
(这是从 vanilla ANTLR 稍微修改以包含行号 iirc)。我见过人们使用notifyErrorListener(...) 将规则 嵌入到语法中,但这意味着我的所有规则都必须是非左递归的。例如,我有规则
propImpRule: OPEN_PAREN propWff IMPLIES propWff CLOSE_PAREN;
propImpRule: OPEN_PAREN propWff IMPLIES propWff {notifyErrorListener("Missing ')'");};
如果我想对左括号(或两者都这样做)做同样的事情,我不能,因为 ANTLR 的解析器是如何工作的(而且我真的不想经历转换每个规则是非左递归的。另外,在语法中嵌入规则似乎很麻烦,也是解决实际问题的一种方法)。
我尝试遵循过去 StackOverflow answers 中的示例并阅读 ANTLR 手册/文档,但没有任何内容真正提供我想要或需要的(或足够的文档)。任何人都可以指出我正确的方向吗?谢谢!
解决方法
标准的“没有可行的替代方案”消息还将列出预期的字符。这些信息也可用于生成您自己的消息。
话虽如此,我怀疑这仍然不能满足您的需求。
通用工具很难为初学者提供出色的信息。
一个可能有帮助的建议:
继续编写与您可能预期的错误相匹配的解析器规则。这有点违反直觉,因为大多数人希望语法只能识别有效的结构。但是,这并不是真正的“规则”。您还可以识别无效的构造,然后,当它们出现在您的解析树中时,您可以添加语义处理以提供您愿意制作的“漂亮”和信息丰富的错误消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。