CFG をハイレベル コードにレンダリングしたいと考えています。通常、これは非常に簡単です。ツリーをたどり、各基本ブロックを順番にレンダリングし、goto ですべてを接着します。
残念ながら、最近 goto は時代遅れになっており、最新の言語のほとんどは goto をサポートしていません。そのため、言語に存在する制御フロー ステートメントのみを使用して基本ブロックを接着する何らかの方法が必要です: for
、while
、do
... while
、if
、break
およびcontinue
. (変数を使用してステート マシンを構築することは考えたくありません。)
これを行うアルゴリズムはありますが、すべての場合に機能するとは限りません。つまり、上記の限られた一連の制御フロー構造のみを使用して、構造化コードにフラット化できない CFG を構築することが可能です。
これは私には直感的に明らかなように思えますが、それを証明することはできません (そして、私が見つけたアルゴリズムのドキュメントでは、これ以上詳しく説明されていません)。そして、このように平坦化できない CFG の例を見つけることができませんでした。
これが可能かどうか、はっきりと知りたいです。
オプション (a): 上記のように平坦化できない CFG の例はありますか? (それは不可能だと教えてくれます。)
オプション (b):上記のように CFG を平坦化できるという証拠を誰かが持っていますか? (それが可能であることがわかります。)それを機能させる必要があるため、それを行うアルゴリズムも非常に望ましいでしょう...