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);
}