我正在尝试分析Java代码结构。
所以,我使用ANTLRv3和java语法代码生成了一个Java解析器和词法分析器......
但我不知道如何使用生成的解析器和词法分析器生成上下文流图。
我试图通过教程页面学习如何做到这一点,但教程页面已经消失了。
你能告诉我怎么做的吗?或教程页?
谢谢。
答案 0 :(得分:4)
AFAIK,ANTLR在构建控制流图时没有提供任何具体帮助。
您可以通过遍历AST,收集操作(无条件语句)和条件(表达式节点控制条件)的知识,并根据该信息组装图表来自行构建一个。请注意,switch语句是一种复合条件,需要作为一组决策或特殊的N路条件处理。
异常处理可能会改变您所认为的“无条件行为”;每个方法调用都有可能将控制流重定向到异常处理程序(或函数的退出),您需要决定是否要在控制流图中包含这些。如果你想推断程序的功能(特别是数据流),你需要对它们进行建模。
你需要创建控制流节点(只是一种类),它可以引用AST的部分(“这就是动作”)和其他两个控制流节点(处理if-then-else) ;这些出口中的这些出口是“真正的退出”和“错误退出”,或者“继续”和“陷阱”退出。这个子类将代表纯计算,IF语句,TRY块等。
Java是一个纯粹的“结构化”语言,这意味着您可以“自下而上”构建控制流图;您可以在向上遍历叶子时构建控制流图的位,并在爬树时组合来自子项的控制流图。您需要做的是将一个迄今为止组装的控制流图(最初在叶子处为空)传递到树上,并引用该图中希望将控制传递给异常处理程序的控制流节点列表。然后在爬树时,扩展控制流图。
大部分工作都是在条件下进行的,例如IF-THEN-ELSE节点;在这种情况下,将两个具有两组异常的控制流子图传递给该节点。然后创建一个控制流节点来表示条件,将其动作设置为指向条件表达式,将其两个子节点设置为指向传入的两个子图,并将其异常集设置为异常集的并集。 p>
子例程调用获取流动节点,其动作是方法调用,退出到以下语句/子表达式,另一个退出(未填充)最终将指向catch子句。将子例程调用节点添加到传递的异常列表中。
尽管他们没有“下一步”行动,但同样对待THROW法则。
当遇到TRY构造时,生成一个条件节点,其动作指向try主体,一个出口指向try的结尾或者finally子例程调用。最后,修补例外列表中的所有控制流节点以指向catch子句。
您需要将catch子句链接在一起作为if语句的序列。
您必须将“finally”视为从try子句调用的子例程调用以及各种catch子句。
答案 1 :(得分:0)
现在,我发现了一个生成Java控制流图的Eclipse插件:Control Flow Graph Factory。 该插件可以完美地生成CFG并通过XML文件存储它。