Алгоритм переписывания модифицированной семантики goto

У меня есть большая куча устаревшего кода на старом придуманном мной языке сценариев, который мы компилируем / переводим в javascript.

В этом языке есть условный переход, переход к метке. Отличие от обычного оператора goto в том, что обратный переход невозможен. В этом языке нет вложенных операторов if или циклов.

Поскольку goto не существует в javascript, я ищу алгоритм, который преобразует goto mylabel и mylabel: в семантически эквивалентную структуру.

Я подумал об использовании ifs , но обнаружил, что это нетривиально из-за произвольной вложенности меток goto.

Пример:

if cond1 goto a
do something1
if cond2 goto b
do something2
a:
do something3
if cond3 goto c
do something4
c:
do something5
b:

Можно переписать как:

lbl_b=false;
lbl_c=false;

lbl_a = cond1;
if (!cond1) {
  do something1;
  lbl_b = cond2;
  if (!lbl_b) {
    do something2;
  }
}
if (!lbl_b) {
  do something3;
  lbl_c = cond3;
  if (!lbl_c) {
    do something4;
  }
  do something5;
}

Однако мне не удалось вывести из этого общий алгоритм.

5
задан flolo 6 October 2011 в 08:20
поделиться