Обычно это называется Удаление Goto , у нас была однажды студенческая работа, где была задача реализовать ее для C. В общем, вы должны работать с циклами (к сожалению, мы не выложили эту работу онлайн ). Но поскольку у вас есть ограничение, что вы можете прыгать только вперед, это относительно просто:
Разобрать все строки и собрать все метки. Создайте для каждой метки флаг "skip_to_label". Инициализировать в начале все флаги на ложь Когда вы соответствуете условному переходу для метки X, вы теперь добавляете каждую строку до строки метки с помощью «если не skip_to_label» и устанавливаете для флага значение true.
Этого должно хватить и на работу, но конечно не очень оптимально.
Как вы можете оптимизировать это: вместо того, чтобы предварительно добавлять if, просто сохраняйте набор флагов для каждой строки, и вместо того, чтобы устанавливать что-то в false, просто добавьте для строк соответствующий флаг в наборе.
Теперь вы можете сделать if для группы, которая содержит все строки, где набор не изменяется, а условием являются логические флаги набора.
Пример с вашим заданным кодом:
set your code
empty if cond1 goto a
skip_to_a, do something1
skip_to_a, if cond2 goto b
skip_to_a, skip_to_b do something2
skip_to_a, skip_to_b a:
skip_to_b do something3
skip_to_b, skip_to_c if cond3 goto c
skip_to_b, skip_to_c do something4
skip_to_b, skip_to_c c:
skip_to_b do something5
skip_to_b b:
Теперь вы пишете перед каждой строкой либо if (s), либо начинаете сверху и делаете блок if, пока набор остается неизменным.
Итак, когда вы начинаете, вы получаете свой первый на пустом месте, это условный переход, поэтому вместо этого вы устанавливаете свой флаг
if cond1 goto skip_to_a=true;
теперь набор меняется, и вы вводите свой блок с if из набора:
if (!skip_to_a) BEGIN
do something1
if cond2 skip_to_b=true;
END
следующее изменение в наборе, поэтому новый блок if:
if (!skip_to_a and !skip_to_b) BEGIN
do something2
END
и так далее (я думаю, вы поняли идею).
РЕДАКТИРОВАТЬ : Как можно хорошо видеть на множествах в примере, в целом невозможно моделировать его с помощью вложенных if, например строки с skip_to_a и строки с skip_to_b перекрываются, но ни одна из них не содержит другой завершенной.