| 
Лимит времени 2000/4000/4000/4000 мс. Лимит памяти 65000/65000/65000/65000 Кб.  Автор: Фёдор Меньшиков, ВГПУ. 
Сложность Дельта
  
Требуется реализовать перевод условного оператора, содержащего сложное
условие (может включать and, or, not) на язык, в котором допустимы
только элементарные сравнения и переход на метку. См. примеры ввода и вывода. 
 
Ввод 
Первая строка ввода удовлетворяет следующей грамматике: 
УсловныйОператор = 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. Не
допускается наличие двух строк подряд, содержащих определения меток
(между двумя строками с определениями меток должна быть строка с if
или something). Не допускается определение метки, на которую нет
перехода (кроме меток true и false, которые должны
быть определены всегда). 
 
| 
Ввод
 |  
if (a<b) and (c<d) or ((e=f) and (g>=h)) or not (i<j) then something; 
 |  
| 
Вывод
 |  
   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: 
 |   
 Для отправки решений необходимо выполнить вход.
  
 |