2

在 Java 中访问和修改 AST 的最先进方法是什么?我只找到了旧示例,其中包含大量已弃用的代码。我发现了一些描述,而且我对像 antlr 这样的工具如何在整个概念中发挥作用的看法还不清楚。也许我应该补充一点,我想解析现有程序,而不是从头开始编写 AST。

我想用这个 AST 做的是对其进行转换,以便可以轻松地为规则引擎提取业务规则。也许你对这个想法有一个很好的方法。

4

1 回答 1

3

我相信 Java 社区主要使用的是 Eclipse AST 接口(或 Java 编译器提供的对 AST 的访问)之类的东西。这基本上是树节点和大量程序​​计算来测试节点类型和上下树。我不认为这是一般的“最先进的技术”。我认为 Eclipse 确实提供了一些信息,标识符如何与定义相关联(“名称解析”)。

ANTLR 解析器将帮助您构建 AST,我确信 ANTLR 已经有一个完整的 Java 前端可以做到这一点,请查看他们的网站。我认为树行走与 Eclipse AST 相同。我不认为 ANTLR 的前端提供名称解析。

更好的方案涉及属性语法,它允许您使用跨树节点的数据流计算来构建分析器。您可以在SilverJastAdd中找到 Java 实现。这些在 Java 社区中似乎并不广为人知。JastAdd 提供对名称解析和数据流信息的访问,恕我直言,这两者都是进行任何有趣的代码分析所必需的。

模式导向方案更好;您描述了感兴趣的语法片段和相应的操作。(属性语法有点像仅限于单个树节点的模式导向方案;模式导向方案在您个人不必知道其结构的树节点集上运行)。 诸如 Stratego、DMS 和 TXL 之类的程序转换系统 (PTS)提供这些。然而,这些都不是用 Java 编码。我很确定 Stratego 和 TXL 有完整的 Java 语法和现成的树,但除此之外没有。DMS 为包括 Java 在内的多种语言提供属性语法、名称解析、流分析、使用模式重写树,甚至基于数据流的模式匹配器。

您需要尽可能多的分析信息来支持“业务规则提取”。如果你认为这很容易,那你就大吃一惊了。虽然代码分析能力是必要条件,但要识别业务规则,您需要从系统外部获得有关业务词汇和感兴趣的操作以及它们如何映射到代码的知识。该代码不包含该信息。

编辑:根据评论中的讨论,OP 提出了一个半自动化的过程,这意味着一个人将这些额外的知识带到了这个过程中;我非常同意这是必要的。他可能会发现此关于提取业务规则的演示有助于了解原因以及对此可能采取的措施。

于 2013-10-15T12:30:42.223 回答