2

我正在尝试分析 Java 代码结构。

所以,我使用 ANTLRv3 和 java 语法代码生成了一个 Java 解析器和词法分析器......

但我不知道如何使用生成的解析器和词法分析器生成上下文流图。

我试图通过教程页面学习如何做到这一点,但是教程页面已经消失了。

你能给我一个如何做到这一点的方法吗?或教程页面?

谢谢你。

4

2 回答 2

5

AFAIK,ANTLR 在构建控制流图方面没有提供具体帮助。

您可以通过遍历 AST 并收集有关操作(无条件语句)和条件(表达式节点控制条件)的知识,并根据该信息组装图表来自己构建一个。请注意,switch 语句是一种复合条件,需要作为一组决策或特殊的 N 路条件来处理。

异常处理可能会改变您认为的“无条件操作”;每个方法调用都有可能将控制流重定向到异常处理程序(或函数的出口),您需要决定是否要将这些包含在控制流图中。如果你想推理程序做了什么(尤其是数据流),你需要对这些进行建模。

您将需要创建可以引用 AST 片段(“这是动作”)和其他两个控制流节点(处理 if-then-else)的控制流节点(只是一种类);这些退出中的这些退出为“真正退出”和“虚假退出”,或者“继续”和“陷阱到”退出。它的子类将代表纯计算、IF 语句、TRY 块等。

Java 是一种纯粹的“结构化”语言这一事实​​意味着您可以“自下而上”构建控制流图;您可以在向上遍历叶子时构建控制流图的一部分,并在爬树时组合来自子级的控制流图。您需要做的是将到目前为止组装的控制流图(最初在叶子处为空)传递到树上,并引用该图中想要将控制传递给异常处理程序的控制流节点列表。然后当你爬树时,扩展控制流图。

大部分工作发生在条件条件下,例如 IF-THEN-ELSE 节点;在这种情况下,具有两组异常的两个控制流子图被传递到该节点。然后创建一个控制流节点来表示条件,将其操作设置为指向条件表达式,将其两个子节点设置为指向传入的两个子图,并将其异常集设置为异常集的并集。

子例程调用获取其动作是方法调用的流节点,退出到下面的语句/子表达式,另一个退出(未填充)最终将指向 catch 子句。将子例程调用节点添加到传递的异常列表中。

类似地对待 THROW 语句,尽管它们没有“下一步”动作。

当您遇到一个 TRY 构造时,生成一个条件节点,其中操作指向 try 主体,一个出口指向 try 结束或 finally 子例程调用。最后,修补异常列表中的所有控制流节点以指向 catch 子句。

您需要将 catch 子句作为一系列 if 语句链接在一起。

您必须将“finally”视为从 try 子句和各种 catch 子句调用的子例程调用。

于 2012-04-03T08:26:50.433 回答
0

这几天,我发现了一个生成Java控制流图的Eclipse插件:控制流图工厂。该插件完美生成CFG并以XML文件形式存储。

于 2012-04-18T07:12:49.560 回答