问题:在ANTLR v4中是否有一种(更直接)的方式在解析时构建自定义解析树?
我想可以遍历并重写自动构建的树,但我想知道我们是否仍然可以在分析时进行手动树构建(或调整)(类似于ANTLR v3和ealier)。这个想法是,根据人们如何编写他/她的语法,我们在ANTLR构建的树中获得了许多无用的节点,而我得到它只能覆盖你感兴趣的监听器方法,我们仍然需要检查并跳过无用的令牌类型等。
答案 0 :(得分:2)
不,我们使用ANTLR 3的经验是手动AST功能不可避免地导致代码更难以维护和理解,导致开发人员对语法进行任何更改的高回归错误率。树中不再省略标记,因为很难分辨应用程序的未来版本将需要哪些终端,并且您不希望必须更改/验证在该树上运行的所有代码。如果新组件或功能现在需要先前未使用的终端,则解析树。
答案 1 :(得分:2)
您可以覆盖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();
}
}