据我所知,在解析器构建AST之后,这个结构被转换为一个“中间层”' IR,例如三个地址代码或任何其他代码。然后,为了进行一些分析,将该IR转换成控制流程图。我的问题是,如果有可能从AST表示到CFG而不经过另一个IR,然后通过CFG执行数据流分析并获得成功的结果?
答案 0 :(得分:2)
如果没有先做范围然后进行名称解析,就无法构建CFG。
您需要范围解析来确定"范围"隐式控制转移的边界,例如,if-then-else的边界,try-statement,带有" break语句",返回语句等的块。这通常相当容易,因为范围倾向于遵循语言的语法结构,您已经使用AST。
您还需要范围解析来确定标识符的定义位置,如果您的语言允许控制转移到命名实体(" goto")," call"。您无法知道哪个goto目标而不知道哪个范围包含goto,以及范围如何控制命名标签的查找。
使用范围分辨率,您可以实现名称解析;这允许您为包含它们的定义范围指定名称,并附加名称的定义(例如,知道"转到x"指的是特定范围内的x,因此指向第750行,其中x在该范围内定义。
一旦你有名字解析(所以你可以在#34; goto x")中查找x的定义, now 你可以构建一个控制流图。
您可以使用属性语法完成所有这三个,这些语法基本上是直接在AST上进行的计算。所以,不,你不需要除AST以外的任何东西来实现它们。 {您可以了解有关属性计算的更多信息at my SO answer describing them。当然,你可以用正式的属性计算做任何事情,你也可以通过简单地编写遍历树的大量递归过程来计算等效结果;这是在实践中编译的属性语法。
您可以在这里找到some details on how to extract the control flow graph by attribute computation
一个混乱的小故障是像" goto @" (GCC允许这样做)。要执行此操作正确,您需要计算标签变量的数据流(这在技术上要求您首先构建CFG :-()。您可以通过构建保守的答案来避免数据流: #34; goto @"可以转到任何标签,其地址取自找到goto的函数。你也可以用属性语法计算它。
对于只有 结构化控制流的语言,您实际上可以通过属性语法直接实现数据流分析。