Транслятор.

Требуется реализовать перевод условного оператора, содержащего
сложное условие (может включать and, or, not) на язык, в котором
допустимы только элементарные сравнения и переход на метку.
См. примеры ввода и вывода.

Пример ввода:



Пример вывода:

   if a>=b then goto 01;
   if c<d then goto true;
01:
   if e<>f then goto 02;
   if g>=h then goto true;
02:
   if i<j then goto false;
true:
   something;
false:

Формализация.
РБНФ входного языка:

   УсловныйОператор = if пробел Выражение пробел then пробел something ';' CRLF
   Выражение = ЭлементарноеСравнение | СоставноеВыражение
   СоставноеВыражение = Слагаемое {пробел or пробел Слагаемое}
   Слагаемое = Множитель {пробел and пробел Множитель}
   Множитель = not пробел Множитель | '(' Выражение ')'
   ЭлементарноеСравнение = буква ЗнакСравнения буква
   ЗнакСравнения = '=' | '<>' | '<' | '<=' | '>' | '>='
   буква = 'a'..'z'
   CRLF = #13 #10
   пробел = #32

   В выражении буквы (имена переменных) не повторяются.

РБНФ выходного языка:

   УсловныйОператор = ОсновныеСтроки ЗаключительнаяЧасть
   ОсновныеСтроки = {ОпределениеЧисловойМетки | УсловныйПереход}
   ОпределениеЧисловойМетки = ДвузначноеЧисло ':' CRLF
   УсловныйПереход =
      ТриПробела if пробел буква ЗнакСравнения буква пробел then пробел
      goto пробел ИспользованиеМетки ';' CRLF
   ИспользованиеМетки = ДвузначноеЧисло | true | false
   ЗаключительнаяЧасть =
      true ':' CRLF
      ТриПробела something ';' CRLF
      false ':' CRLF
   ЗнакСравнения = '=' | '<>' | '<' | '<=' | '>' | '>='
   ТриПробела = пробел пробел пробел
   ДвузначноеЧисло = цифра цифра
   буква = 'a'..'z'
   цифра = '0'..'9'
   CRLF = #13 #10
   пробел = #32

   В выходном тексте буквы (имена переменных) должны встречаться в том же
   количестве и в том же порядке, что и во входном тексте.
   Числа в определениях числовых меток должны идти в порядке возрастания,
   начиная с 01. Не допускается наличие двух строк подряд, содержащих
   определения меток. Не допускается определение метки, на которую нет
   перехода (кроме меток true и false, которые должны быть определены всегда).
