Я хотел бы сделать CFG для кода высокого уровня. Обычно это очень легко; пройтись по дереву, сделать каждый базовый блок по очереди, склеить его вместе с gotos.
К сожалению, gotos вышли из моды в наши дни, и большинство современных языков их не поддерживают. Поэтому мне нужен какой-то способ склеить мои основные блоки, используя только те операторы потока управления, которые существуют на языке: for
, while
, do
... while
, if
, break
и continue
. (Я не хочу рассматривать создание конечного автомата с использованием переменных.)
Может показаться, что, хотя для этого есть алгоритмы, они будут не работать в каждом случае. Таким образом, можно построить CFG, который не может быть сведен к структурированному коду, используя только вышеупомянутый ограниченный набор структур потока управления.
Это кажется мне интуитивно очевидным, но я не могу доказать это (и документация по алгоритмам, которые я обнаружил, более подробно не рассматривается). И я не смог найти пример CFG, который не может быть сплющен, как это.
Я хотел бы знать, окончательно, возможно ли это или нет.
Вариант (а): есть ли у кого-нибудь пример CFG, который нельзя сплющить, как описано выше? (Что скажет мне, что это невозможно.)
Вариант (b): есть ли у кого-нибудь доказательства того, что CFG можно выровнять, как описано выше? (Это скажет мне, что это возможно возможно.) Алгоритм, чтобы сделать это, было бы также очень желательно, поскольку я тогда должен был бы заставить это работать ...