Antlr4语法要求我使用setInterpreter

时间:2017-06-10 12:53:58

标签: java parsing antlr4

当我使用antlr4设置语法并生成它时,我在整个解析器中看到以下行

_errHandler.sync(this);

反过来,

getInterpreter()

然后调用它上面的方法。默认情况下,它返回null,因此解析会抛出NPE。

我齐心协力something围绕着这个

myparser.setInterpreter(new ParserATNSimulator(myparser, myparser.getATN(), mylexer.getInterpreter().decisionToDFA,
                new PredictionContextCache()));

但我确定这是错的。奇怪的是我没有看到任何例子解决这个要求,所以我想知道我做错了甚至还需要这样做。

有趣的TestRig工作正常,没有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();

1 个答案:

答案 0 :(得分:0)

这是答案。

当您向解析器添加构造函数时,不要想要调用

<!DOCTYPE html>
<html>

<head>
    <title>Image processing</title>
    <style type="text/css">

    </style>
</head>

<body>
    
    <canvas id="mycanvas" width="100" height="100">
    </canvas>
    <img src="test1.png" alt="" id="image" style="display: none;" />
    <script src="img22.js">
    </script>
</body>

</html>

你想打电话

super(tokens);

在解析器中创建的默认构造函数

this(tokens);