【问题标题】:Building custom Parse Trees in ANTLR v4在 ANTLR v4 中构建自定义解析树
【发布时间】:2014-10-16 10:43:20
【问题描述】:

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

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

【问题讨论】:

    标签: antlr4 parse-tree


    【解决方案1】:

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

    【讨论】:

    • 感谢您的清理!当您更改/重新组织一些语法规则时,您确实有一个优势,即保持客户端代码不变......我是从性能角度考虑的,但我想开销通常几乎为零。
    • @OctavianTheodor 在我的评估中,ANTLR 4 的当前设计并没有被证明是一个重大的性能限制,这是我几乎痴迷的东西。其他领域,包括规则本身的实际结构(前瞻、歧义等)总是具有更显着的影响。
    【解决方案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();
    }
    
    }
    

    【讨论】:

    • 谢谢!虽然我已经摆脱了那个“问题”,但这似乎确实是一个不错的选择。 (实际上还没有尝试过,但是通过检查github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/…我会说你是对的!)
    • 不用担心 - 到目前为止它似乎对我有用 - 我的应用程序缓存解析树,因为我只需要它们来获取符号表信息(函数/变量定义),因此能够创建稀疏树正在节省大量空间/时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多