Antlr例外:没有序列化的ATN

时间:2014-02-10 20:16:21

标签: 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库的一部分)。

1 个答案:

答案 0 :(得分:1)

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

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