| 
 
 
 | Лимит времени 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:
 
 | 
 Для отправки решений необходимо выполнить вход.
 
 
 |