2014-10-16 48 views
0

问题:在ANTLR v4中,在解析时构建自定义分析树有没有(更直接)的方法?在ANTLR v4中构建自定义分析树

我猜测可以遍历并重写自动构建的树,但是我想知道在解析时是否仍然可以手动构建树(或者对此进行调整)(类似于ANTLR v3和ealier)。这个想法是,根据一个人写他/她的语法的方式,我们在ANTLR构建的树中得到了很多无用的节点,虽然我知道你只能覆盖你感兴趣的那些侦听器方法,但仍然需要检查并跳过无用的令牌类型等。

回答

2

不,我们与ANTLR 3的经验是手动AST功能不可避免地导致代码更难以维护和理解,从而导致开发人员进行任何更改时出现高回报错误率语法。因为很难判断未来版本的应用程序将需要哪些终端,因此不需要更改/验证在分析树上运行的所有代码,因为令牌不再需要从树中删除。以前未使用的是现在需要的新组件或功能。

+0

感谢您的清理!当你改变/重新组织一些语法规则时,你确实有一个强大的优势,就是保持客户端代码不变......我从性能的角度思考,但我认为开销通常几乎没有。 – 2014-10-16 12:13:02

+0

@OctavianTheodor ANTLR 4的当前设计在我的评估中未被证明是一个重大的性能限制,而这一点我都非常沉迷。其他领域,包括规则本身的实际结构(前瞻性,模糊性等)总是会有更显着的影响。 – 2014-10-16 12:36:36

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

} 
+0

谢谢!虽然我从这个“问题”开始,但这似乎确实是一个很好的结果。 (实际上还没有尝试过,但通过检查https://github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/v4/runtime/Parser.java我会说你是正确!) – 2015-01-21 13:45:27

+0

不用担心 - 目前它似乎对我有用 - 我的应用程序缓存解析树,并且由于我只需要它们用于符号表信息(函数/变量定义),创建稀疏树的功能可以节省大量时空。 – mounds 2015-01-22 00:04:46