问题:在 ANTLR v4 中是否有一种(更直接的)在解析时构建自定义解析树的方法?
我想人们可以遍历并重写自动构建的树,但我想知道我们是否仍然可以在解析时进行手动树构建(或调整)(类似于 ANTLR v3 和 ealier)。这个想法是,根据一个人如何编写他/她的语法,我们在 ANTLR 构建的树中得到了很多无用的节点,虽然我知道你可以只覆盖你感兴趣的侦听器方法,但仍然需要检查并跳过无用的令牌类型等。
问题:在 ANTLR v4 中是否有一种(更直接的)在解析时构建自定义解析树的方法?
我想人们可以遍历并重写自动构建的树,但我想知道我们是否仍然可以在解析时进行手动树构建(或调整)(类似于 ANTLR v3 和 ealier)。这个想法是,根据一个人如何编写他/她的语法,我们在 ANTLR 构建的树中得到了很多无用的节点,虽然我知道你可以只覆盖你感兴趣的侦听器方法,但仍然需要检查并跳过无用的令牌类型等。
不,我们对 ANTLR 3 的经验是,手动 AST 功能不可避免地导致代码更难维护和理解,从而导致开发人员对语法进行任何更改时出现很高的回归错误。令牌不再从树中省略,因为很难判断未来版本的应用程序将需要哪些终端,并且您不想更改/验证在解析树上运行的所有代码,如果终端以前未使用过的组件现在需要新组件或功能。
您可以覆盖org.antlr.v4.runtime.Parser.addContextToParseTree()
以控制创建哪些节点。不确定这就是您所说的自定义。
@parser::members {
@Override
protected void addContextToParseTree() {
// code is a rule enabled by semantic predicate 'full'
// that matches generic lines of code.
if(!full && _ctx instanceof CodeContext){
return;
}
// otherwise add the node to the tree..
super.addContextToParseTree();
}
}