首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从AST建造CFG

从AST建造CFG
EN

Stack Overflow用户
提问于 2016-05-30 15:22:59
回答 1查看 1.4K关注 0票数 2

据我所知,在解析器构建AST之后,这个结构将被转换为一个“中间层”IR,例如三个入口代码或任何其他代码。然后,为了便于分析,将该IR变换成一个控制流图。我的问题是,如果不经过另一个IR就可以从AST表示到CFG,然后通过CFG执行数据流分析,并取得了成功的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-30 16:23:35

如果不首先执行作用域,然后进行名称解析,就无法构造CFG。

您需要范围解析来确定隐式控制传输的“范围”,例如if--然后--否则,一个try-语句的边界,带有“easy语句”的块,返回语句等等。这通常相当容易,因为作用域倾向于遵循语言的语法结构,而AST已经具有这种语法结构。

如果您的语言允许将控件传输到指定的实体(“goto ")、”调用“,则还需要范围解析来确定在何处定义标识符。不知道哪个范围包含goto,以及范围如何控制命名标签的查找,就无法知道goto的目标是什么。

使用范围解析,您可以实现名称解析;这允许您将名称分配给包含名称的定义范围,并附加名称的定义(例如,知道"goto x“指特定作用域中的x,因此可以在该范围中定义x的第750行)。

一旦您有了名称解析(因此您可以在"goto x“中查找x的定义),现在您就可以构造一个控制流图了。

您可以使用属性语法来完成这三项任务,这实际上是在AST上直接进行的计算。所以,不,除了AST,您不需要其他任何东西来实现这些。{您可以了解有关属性计算at my SO answer describing them的更多信息。当然,对于一个正式的属性计算,您可以做的任何事情都可以通过编写大量递归过程来完成,这些过程遍历树并计算等效的结果;这就是在实践中将属性语法编译成的结果。

在这里你可以找到some details on how to extract the control flow graph by attribute computation

一个杂乱无章的问题是像"goto“这样的计算(GCC允许这样做)。要正确地执行此操作,需要计算标签变量的数据流(从技术上讲,这需要首先构造一个CFG :-( )。您可以通过构造一个保守的答案来避免执行数据流:"goto @“可以转到其地址位于查找goto的函数中的任何标签。您也可以使用属性语法来计算这个值。

对于只有结构化控制流的语言,实际上可以通过属性语法直接实现数据流分析。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37529165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档