gpt4 book ai didi

java - 我如何使用 antlr 生成 Java CFG(控制流图)?

转载 作者:行者123 更新时间:2023-11-30 07:27:04 28 4
gpt4 key购买 nike

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

因此,我使用 ANTLRv3 和 java 语法代码生成了 Java 解析器和词法分析器...

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

我试图通过教程页面了解如何执行此操作,但教程页面已经消失了。

你能告诉我如何做到这一点吗?还是教程页面?

谢谢。

最佳答案

据我所知,ANTLR 在构建控制流图方面没有提供具体的帮助。

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

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

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

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

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

子程序调用获取其 Action 为方法调用的流节点,有一个导出到后面的语句/子表达式,另一个导出(未填充)最终将指向 catch 子句。将子程序调用节点添加到向上传递的异常列表中。

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

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

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

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

关于java - 我如何使用 antlr 生成 Java CFG(控制流图)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988541/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com