Antlr4语法要求我使用setInterpreter
Antlr4 grammar requires me to use setInterpreter
当我使用 antlr4 设置语法并生成它时,我在整个解析器中看到以下行
_errHandler.sync(this);
反过来,
getInterpreter()
然后调用它的方法。默认情况下这个 returns null,因此解析会抛出 NPE。
我 gloed 在一起 something
解决了这个问题
myparser.setInterpreter(new ParserATNSimulator(myparser, myparser.getATN(), mylexer.getInterpreter().decisionToDFA,
new PredictionContextCache()));
但我确定那是错误的。奇怪的是我没有看到任何示例解决这个要求,所以我想知道我做错了什么甚至需要完成。
有趣的 TestRig 工作正常,w/o setInterpreter 行,这是我正在做的:
PelLexer pl = new PelLexer(CharStreams.fromString(s));
CommonTokenStream tokens = new CommonTokenStream(pl);
SecureRandom r = new SecureRandom();
String clsName = Parser.class.getPackage().getName() + ".eval.Eval" + Math.abs(r.nextLong());
PelParser pp = new PelParser(tokens, clsName);
pp.setBuildParseTree(false);
// pp.setInterpreter(new ParserATNSimulator(pp, pp.getATN(), pl.getInterpreter().decisionToDFA, new PredictionContextCache()));
pp.addErrorListener(new PELErrorListener());
pp.blockStatements();
byte[] clzData = pp.getClassBytes();
PELClassLoader pcl = AccessController.doPrivileged(new PrivilegedAction<PELClassLoader>() {
@Override
public PELClassLoader run() {
return new PELClassLoader(Thread.currentThread().getContextClassLoader());
}
});
pcl.addClass(clsName, clzData);
Class<Evaluable> c = (Class<Evaluable>) pcl.loadClass(clsName);
return c.newInstance();
答案在这里。
当您向解析器添加构造函数时,您不想调用
super(tokens);
您想打电话给
this(tokens);
正如在您的解析器中创建的默认构造函数所做的那样
public PelParser(TokenStream input) {
super(input);
_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
}
当我使用 antlr4 设置语法并生成它时,我在整个解析器中看到以下行
_errHandler.sync(this);
反过来,
getInterpreter()
然后调用它的方法。默认情况下这个 returns null,因此解析会抛出 NPE。
我 gloed 在一起 something
解决了这个问题
myparser.setInterpreter(new ParserATNSimulator(myparser, myparser.getATN(), mylexer.getInterpreter().decisionToDFA,
new PredictionContextCache()));
但我确定那是错误的。奇怪的是我没有看到任何示例解决这个要求,所以我想知道我做错了什么甚至需要完成。
有趣的 TestRig 工作正常,w/o setInterpreter 行,这是我正在做的:
PelLexer pl = new PelLexer(CharStreams.fromString(s));
CommonTokenStream tokens = new CommonTokenStream(pl);
SecureRandom r = new SecureRandom();
String clsName = Parser.class.getPackage().getName() + ".eval.Eval" + Math.abs(r.nextLong());
PelParser pp = new PelParser(tokens, clsName);
pp.setBuildParseTree(false);
// pp.setInterpreter(new ParserATNSimulator(pp, pp.getATN(), pl.getInterpreter().decisionToDFA, new PredictionContextCache()));
pp.addErrorListener(new PELErrorListener());
pp.blockStatements();
byte[] clzData = pp.getClassBytes();
PELClassLoader pcl = AccessController.doPrivileged(new PrivilegedAction<PELClassLoader>() {
@Override
public PELClassLoader run() {
return new PELClassLoader(Thread.currentThread().getContextClassLoader());
}
});
pcl.addClass(clsName, clzData);
Class<Evaluable> c = (Class<Evaluable>) pcl.loadClass(clsName);
return c.newInstance();
答案在这里。
当您向解析器添加构造函数时,您不想调用
super(tokens);
您想打电话给
this(tokens);
正如在您的解析器中创建的默认构造函数所做的那样
public PelParser(TokenStream input) {
super(input);
_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
}