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