修改解析树

问题描述

我有一个 sql grammar 的 ANTLR ParseTree。

示例:

Random query

我的目标是编辑这棵树,以便我可以删除它们之间的所有中间(booleanExpression、predicated、valueExpression、primaryExpression)节点。 我已经探索了访问者和听众,但他们没有为我生成树。而且我不想触及语法,因为它是官方来源。

那我该怎么办? 谢谢

解决方法

ANTLR 的 API 中没有这样的功能(删除/改变 ParseTree)。您必须自己遍历树并创建 ParseTree 的副本并忽略您不想要/不需要的某些子树。

,

我通常发现 ParseTree 太笨重了(正是你展示的原因)。我不知道有什么自动化的方法可以改变内存中的树。 (可能是一个值得尝试的有趣项目。)

我编写了一些通用方法来简化过程。 “最好的”是我写了一个小的 DSL 来定义我想要的结构。它为这些类生成了类以及 ANTLR 风格的访问者和侦听器。然后,我使用侦听器将 ANTLR ParseTree 转换为我的理想 树,并使用该结构编写其余的代码,该结构更简单。您可以让侦听器/访问者生成您自己设计的树作为处理 ParseTree 的工件,但我已经接近了。

在流程的早期设置它实际上是一个相对较小的工作,并且在实现该语言的整体工作中所占的比例很小(因此,非常值得付出努力)。