【问题标题】:Antlr4: Confusing error message (concatenates correct and incorrect lines) for Java grammarAntlr4:Java 语法的混淆错误消息(连接正确和不正确的行)
【发布时间】:2022-01-10 19:16:11
【问题描述】:

我正在尝试基于现有的 Java 语法构建自己的解析器。

即使我使用来自 the source repo 的 Java7 语法,生成解析器并使用来自 antlr-4.9.3-complete.jar 的 TestRig 给定代码:

1  public class Test {
2    public static void main() {
3      test
4      int b = 1;
5    }
6  }

我收到以下错误:

第 4:8 行在输入 'test\n int' 处没有可行的替代方案

因此,由于某种原因,它将不正确的“test”行与正确的“int”行连接起来。 当它应该指向“test”(第3行)时,它还说“line 4:8”指向“int”行。

(在常规的 Java 编辑器中,我会看到“测试”一词的正确错误突出显示,听起来像):

“语法错误,插入“VariableDeclarators”以完成LocalVariableDeclaration”

我该怎么做才能在 ANTLR 中遇到类似的错误,所以它只会选择错误的“测试”行? 很可能只是我误解了antlr如何解释错误,那么我该如何让听众至少正确报告起跑线?

【问题讨论】:

  • 不是 ANTLR 用户,但 Java 不是面向行的。第 3 行和第 4 行是单个语句或声明。 test 后跟某些符号(例如,'='、'['、'(')可能没问题。在处理完下一行之前,您不能说它是错误的。

标签: java antlr4 grammar


【解决方案1】:

您无法将复杂的编辑器/IDE 与解析器(由 ANTLR 生成)进行比较。文本编辑器/IDE 对输入源有更多了解,可以查找 test 是否为有效类型,如果找不到该类型,则给出有意义的错误消息。

ANTLR 的解析器规则“看到”test int bIdentifierINT 和另一个 Identifier 令牌,并且无法匹配这些令牌的任何解析器规则,导致从标识符 test 开始的错误。

例如,如果class test {} 在类路径中,那么没有int 的输入将是有效的:

public class Test {
  public static void main() {
    test
    /*int*/ a = 1;
  }
}

它当然不会编译,但语法是正确的:

【讨论】:

  • 谢谢,巴特。目前,syntaxError 使它看起来像问题从“int”开始,因为它给了我第 4 行。如果它给了我测试的开始(第 3 行),我会完全理解它,所以我可以处理多行“test \n int” " 构造。
  • 是的,因为 Java 语法接受 test 然后在它“看到”int 然后放弃:所以它是 int 发生错误的地方。就像我在回答中显示的那样:如果您删除 int,它解析得很好:所以 ANTLR 认为 int 是问题所在。
  • 知道了。所以从那时起,我们只能依靠树和访问者/听众来进一步发展。
猜你喜欢
  • 2015-07-03
  • 2014-01-16
  • 1970-01-01
  • 2010-12-27
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2012-09-23
相关资源
最近更新 更多