我想将 CFG 渲染为高级代码。通常这很容易;遍历树,依次渲染每个基本块,用 goto 将它们粘合在一起。
不幸的是,这些天 goto 已经过时了,大多数现代语言都不支持它们。所以我需要一些方法来将我的基本块粘合在一起,只使用语言中存在的那些控制流语句:for
, while
, do
... while
, if
,break
和continue
. (我不愿意考虑使用变量构建状态机。)
看起来虽然有算法可以做到这一点,但它们并非在所有情况下都有效。也就是说,仅使用上述有限的一组控制流结构,就可以构建一个不能被扁平化为结构化代码的 CFG。
这对我来说似乎很直观,但我无法证明它(我发现的算法的文档没有更详细)。而且我还没有找到一个不能像这样展平的CFG的例子。
我想明确地知道这是否可能。
选项(a):有没有人有一个如上所述不能展平的 CFG 示例?(这会告诉我这是不可能的。)
选项 (b):是否有人证明 CFG可以如上所述被展平?(这会告诉我这是可能的。)做它的算法也是非常可取的,因为我必须让它工作......