使用类型转换AntlrInputStream到CharStream的问题。在类型化时,Eclipse很高兴(可以访问生成的代码);但运行时 - 抛出异常。我之间有标记的景点 ///////////////// 线。
对我来说,一个令人困惑的地方是当我尝试导入一个包/类来解析一个类时,Eclipse会找到其中的多个 - 一些在org.antlr.v4.runtime
;同一个是org.antlr.runtime
,依此类推。
一些明确的说明将有所帮助。 ANTLR Works developer
(现在在隧道视觉实验室)确实试图阐明它(非常明智;快速到答案点) - 但使用NetBeans,使用Antlr-3开发Antlr 4的一部分,以及解释的其他方面,只是增加了混乱......
我为听起来很沮丧而道歉,但在某种程度上,这是因为我已经使用了超过8年的oTLR版本的ANTLR并将其作为一种非常愉快的体验回忆起来 - 使用它编译SNMP MIB以创建HTML - 并且像魅力一样工作。
这一次,面对这个n度多边形的每个角落的路障; n倾向于上帝知道多少。
这是代码(在ANTLR Works 2.1中验证的语法)
package com.mycompany.devcfg;
import java.io.FileInputStream;
import java.io.InputStream;
import org.antlr.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mycompany.antlr4gencode.VCFGLexer;
import com.mycompany.antlr4gencode.VCFGParser;
public class AntlrMain {
public static final String DSLFile = "../tpep.dsl";
public static final String GrammarFile = "../VCFG.g4";
public static final Logger log = LoggerFactory.getLogger(AntlrMain.class);
public static void main(String[] args) {
log.debug ("main.start");
try {
log.debug ("try.start");
InputStream is = new FileInputStream(DSLFile);
ANTLRInputStream input = new ANTLRInputStream(is);
//////////////////////////////////////////
// type cast to CharStream is allowed. But exception's thrown anyway.
VCFGLexer lexer = new VCFGLexer((CharStream) input);
///////////////////////////////////////////
Validate.notNull(lexer);
log.debug("lexer created");
CommonTokenStream tokens = new CommonTokenStream(lexer);
VCFGParser parser = new VCFGParser(tokens);
Validate.notNull(parser);
log.debug ("parser created");
/*
ModuleContext entryPoint = parser.module();
Validate.notNull(entryPoint);
ParseTreeWalker walker = new ParseTreeWalker();
ListenerDelegator listener = new ListenerDelegator();
walker.walk(listener, entryPoint);
log.debug ("walker/listener invoked at 'module');
*/
// NOTE: eventually I need the walker.walk (listener, entryPoint)
} catch (Exception e) {
Util.throwRuntimeException (e);
}
finally {
log.info ("main.finally.end");
}
}
在我记得的任何地方,都试图将公司名称替换为“mycompany”。它仍然可能会蔓延:)
命令运行窗口中的异常(在Eclipse中运行):
01:10:23,069 DEBUG AntlrMain:27 - main.start
01:10:23,129 ERROR Util:18 - com.viasat.devcfg.AntlrMain.main(AntlrMain.java:36).
Msg: (
org.antlr.runtime.ANTLRInputStream cannot be cast to org.antlr.v4.runtime.CharStream)
Exception in thread "main" java.lang.RuntimeException: com.mycompany.devcfg.AntlrMain.main
/////////////////////////////////////////////////////////////////////////////////
(AntlrMain.java:36). Msg: (org.antlr.runtime.ANTLRInputStream cannot be cast to
org.antlr.v4.runtime.CharStream)
/////////////////////////////////////////////////////////////////////////////////
at com.viasat.devcfg.Util.throwRuntimeException(Util.java:19)
at com.viasat.devcfg.AntlrMain.main(AntlrMain.java:60)
答案 0 :(得分:2)
看起来您正在使用两个不同的运行时,并且您尝试将ANTLRInputStream
从一个运行时转换为另一个运行时的CharStream
。由于这些类不相关,因此无法正常工作。
仅使用v4
运行时(删除import org.antlr.runtime.ANTLRInputStream;
)并查看会发生什么。另外,请确保使用antlr网站上的v4运行时jar (here's why)。
免责声明:我自己使用.Net版本,所以我可能在这里错了。