在ANTLR v4中构建自定义解析树

时间:2014-10-16 10:43:20

标签: antlr4 parse-tree

问题:在ANTLR v4中是否有一种(更直接)的方式在解析时构建自定义解析树?

我想可以遍历并重写自动构建的树,但我想知道我们是否仍然可以在分析时进行手动树构建(或调整)(类似于ANTLR v3和ealier)。这个想法是,根据人们如何编写他/她的语法,我们在ANTLR构建的树中获得了许多无用的节点,而我得到它只能覆盖你感兴趣的监听器方法,我们仍然需要检查并跳过无用的令牌类型等。

2 个答案:

答案 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();
}

}