使用Java从具有访问者模式的AST构建控制流图

我正在试图弄清楚如何实现我的LEParserCfgVisitor类,以便从已经用JavaCC生成的Abstract-Syntax-Tree构建控制流图。 我知道有些工具已经存在,但我正在尝试为我的编译器最终做准备。

我知道我需要有一个数据结构,将图形保存在内存中,我希望能够在每个节点中保留IN,OUT,GEN,KILL等属性,以便以后能够进行控制流分析。

我的主要问题是我还没弄清楚如何将不同的块连接在一起,因为根据它们的性质在每个块之间有正确的边缘:分支,循环等。换句话说,我还没有找到一个明确的算法,可以帮助我建立我的访客。

这是我的空访客。 你可以看到它适用于基本的语言表达式,比如if,while和基本操作(+, – ,x,^,…)

public class LEParserCfgVisitor implements LEParserVisitor { public Object visit(SimpleNode node, Object data) { return data; } public Object visit(ASTProgram node, Object data) { data = node.childrenAccept(this, data); return data; } public Object visit(ASTBlock node, Object data) { } public Object visit(ASTStmt node, Object data) { } public Object visit(ASTAssignStmt node, Object data) { } public Object visit(ASTIOStmt node, Object data) { } public Object visit(ASTIfStmt node, Object data) { } public Object visit(ASTWhileStmt node, Object data) { } public Object visit(ASTExpr node, Object data) { } public Object visit(ASTAddExpr node, Object data) { } public Object visit(ASTFactExpr node, Object data) { } public Object visit(ASTMultExpr node, Object data) { } public Object visit(ASTPowerExpr node, Object data) { } public Object visit(ASTUnaryExpr node, Object data) { } public Object visit(ASTBasicExpr node, Object data) { } public Object visit(ASTFctExpr node, Object data) { } public Object visit(ASTRealValue node, Object data) { } public Object visit(ASTIntValue node, Object data) { } public Object visit(ASTIdentifier node, Object data) { } } 

任何人都可以帮我一把吗?

谢谢!

要对数据流进行推理(gen / kill / use / def),首先需要一个控制流图。

要在每个树节点(例如,在每个特定节点访问者内部)构建一个节点,构建节点所代表的图形片段; 将该图的入口点弧和出口弧传递给父“访客”。 纯粹独立的游客将无法工作,因为您需要将信息传递给父母。 [您可以向访问者设置的每个节点添加进入/退出弧形槽,并由父级进行检查。]

一些节点(例如,用于“assignmentstmt”)将制造一个动作节点,该动作节点引用用于分配的AST(在流程图中认为“矩形”); 没有任何子图弧需要担心。 一些节点(例如,用于“if”)将制造条件分支节点(引用条件表达式的AST节点),(在流程图中认为“菱形”),流连接节点,并组成结构化的(如果 – 那么 – 其他)子图通过将该条件分支节点与then和else子句的子图(由当时的入口和出口弧表示)与流连接节点组合在一起。 然后,您将入口和出口弧传递给此复合子图到父级。

该方案适用于结构化控制流程。 非结构化控制流(例如,“GOTO x”)需要一些有趣的调整,例如,首先构建图形的结构化部分,将生成的控制流与标签相关联,然后返回并修改GOTO动作以使弧形成为相关联的标签。

记得担心例外; 它们也是GOTO,但通常在结构化控制流程图中更高一点。 这些通常通过将最里面的exception处理程序节点传递到树中来处理; 现在,您的访问者需要查找树以查看最新的exception处理程序。

使用生成的命令的更复杂的方案称为http://en.wikipedia.org/wiki/Attribute_grammar”>属性语法,它通过传递感兴趣的值(在这种情况下,基本上为您管理所有信息流)作为参数和结果在树上上下移动。你需要一个属性语法工具来做这个;你还需要指定节点构建逻辑。我们使用属性语法,基本上是上面的控制流图使用我们的DMS软件再造工具包逐件构建,为许多语言提供通用的控制流分析工具。

获得控制流图后,您可以通过遍历控制流图来实现所描述类型的数据流解算器。 您需要重新访问CF节点指向的AST来收集原始使用/原始def信息。

如果您的语言只有结构化控制流,那么您可以使用ASTs节点来表示控制流节点,并直接计算数据流。

有关一般过程的更多详细信息,请参见此处 。