java - Antlr异常: there is no serialized ATN

标签 java antlr4

我试图了解如何使用 ParseTreePattern为了从我的输入中获取特定元素。 所以首先我尝试了以下方法:

 ParseTreePattern p = parser.compileParseTreePattern("<NODE>", GraphParser.RULE_input);

哪里NODE是我语法中的一个标记,我最终得到

Unknown token NODE in pattern: <NODE>

那么为什么这个标记不被识别,因为它是我语法的一部分?

当我使用规则名称<quantifier>的树模式时这又是我最终得到的语法的一部分:

Exception in thread "main" java.lang.UnsupportedOperationException: there is no serialized ATN
at org.antlr.v4.runtime.Recognizer.getSerializedATN(Recognizer.java:134)
at org.antlr.v4.runtime.Parser.getATNWithBypassAlts(Parser.java:458)
at org.antlr.v4.runtime.tree.pattern.ParseTreePatternMatcher.tokenize(ParseTreePatternMatcher.java:414)
at org.antlr.v4.runtime.tree.pattern.ParseTreePatternMatcher.compile(ParseTreePatternMatcher.java:218)
at org.antlr.v4.runtime.Parser.compileParseTreePattern(Parser.java:506)
at org.antlr.v4.runtime.Parser.compileParseTreePattern(Parser.java:492)
at main.Main.main(Main.java:47)

那么第二个错误是什么意思呢?只是为了澄清我正在使用 ANTLR 4.2(显然 ParseTreePattern 不是 4.1 库的一部分)。

最佳答案

这意味着您的语法是使用 ANTLR 4.1 生成的。我们非常小心地确保从 4.1 升级到 4.2 的用户的现有代码不会中断,但要使用 4.2 中的新功能,您需要使用最新版本的工具重新生成解析器。

如果您还没有这样做,我强烈建议您将解析器生成过程集成到您的构建系统(例如 Maven、Ant)中,以确保始终使用正确的版本。

关于java - Antlr异常: there is no serialized ATN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21687043/

相关文章:

java - 如何连接桌面 java 应用程序和在线 mysql 数据库并执行查询?

java - 将Python语法中的ANTLR4嵌入java转换为C#

unicode - 如何在 Antlr 中指定需要超过四个十六进制数字的 unicode 文字?

antlr4:如何知道在给定上下文的情况下选择了哪个选项

java - 在集合上适当使用 Java 泛型

java - java.util.concurrent.CountDownLatch 的实现是否可以处理向上递增的初始计数?

java - 使用Java代码将.sql文件导入MySQL

java - 创建多个 InternalResourceViewResolver

java - 通过 ANTLR 4 仅使用 java 文件的注释 (/** ..... */) 部分并跳过其余部分

grammar - 将终端分组