我正在尝试分析Java代码结构。
因此,我使用ANTLRv3和Java语法代码生成了一个java解析器和词法分析器……
但我不知道如何使用生成的解析器和词法分析器生成上下文流图。
我试着通过教程页面学习如何做到这一点,但是教程页面已经消失了。
你能告诉我怎么做吗?还是教程页面?
谢谢。
发布于 2012-04-03 16:26:50
AFAIK,ANTLR在构建控制流图方面没有提供具体的帮助。
您可以通过遍历AST,收集动作(无条件语句)和条件(表达式节点控制条件)的知识,并根据这些信息组装图形,从而自己构建一个表达式。请注意,switch语句是一种复合条件,需要作为一组决策或特殊的N-way条件来处理。
异常处理可能会改变您所认为的“无条件操作”;每个方法调用都有可能将控制流重定向到异常处理程序(或函数的退出),您需要决定是否要将这些重定向到控制流图中。如果你想推断程序做了什么(尤其是数据流),你需要对它们进行建模。
您将需要创建控制流节点(只是一种类),这些节点可以引用AST的一部分("this is the action")和另外两个控制流节点(处理if-then-else);其中的这两个退出是"true exit“和"false exit”,或者是"continue to“和"trap to”退出。它的子类将表示纯计算、IF语句、TRY块等。
Java是一种纯粹的“结构化”语言,这意味着您可以“自下而上”地构建控制流图;您可以在向上遍历叶子时构建控制流图的一部分,并在爬树时组合来自子级的控制流图。您需要做的是将到目前为止组装好的控制流图(最初在叶子处是空的)在树中向上传递,并引用该图中希望将控制传递给异常处理程序的控制流节点列表。然后,在爬树时,扩展控制流图。
大多数工作都发生在一个条件节点上,比如IF-THEN-ELSE节点;在这种情况下,两个控制流子图和两组异常被传递到该节点。然后创建一个控制流节点来表示条件,将其操作设置为指向条件表达式,将其两个子级设置为指向传入的两个子图,并将其异常集设置为异常集的并集。
子例程调用获取其操作是方法调用的流节点,其中一个出口指向下面的语句/子表达式,另一个出口(未填充)最终将指向catch子句。将子例程调用节点添加到向上传递的异常列表中。
以同样的方式对待投掷语句,尽管它们没有“下一步”操作。
当您遇到TRY构造时,使用指向try主体的操作生成一个条件节点,其中一个出口指向try的末尾或终结子例程调用。最后,修补异常列表中的所有控制流节点以指向catch子句。
您需要将catch子句作为一系列if语句链接在一起。
您必须将"finally“视为从try子句和各种catch子句调用的子例程调用。
发布于 2012-04-18 15:12:50
最近,我发现了一个生成Java Control Flow Graph的Eclipse插件:Control Flow Graph Factory。这个插件完美地生成了CFG,并将其存储在XML文件中。
https://stackoverflow.com/questions/9988541
复制相似问题