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