2014-02-10 24 views
0

我想了解如何使用ParseTreePattern以從我的輸入中獲取特定元素。 首先,我嘗試了以下內容:Antlr異常:沒有序列化的ATN

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

這意味着您的語法是使用ANTLR 4.1生成的。我們非常謹慎地確保用戶從4.1升級到4.2的現有代碼不會中斷,但要使用4.2中的新功能,您需要使用最新版本的工具重新生成解析器。

如果您還沒有這樣做,我強烈建議您將解析器生成過程集成到您的構建系統(例如Maven,Ant)中,以確保始終使用正確的版本。