ГлавнаяСборникиТурнирыРазделыФорумыУчастникиПечатьПомощьО системе

Разделы > Неотсортированные > задача:


Транслятор

Задачи раздела

• Степень двойки
• Степень двойки
• Столица
• Строки
• Сумма цифр делится на K
• Сумма цифр числа
• Счастливые билеты
• Таймер
• Транслятор
• Ход конём
• Чётные на чётных
• Чем больше, тем лучше
• Числа делятся на K
• Шашечная доска

Обратная связь

Если у вас есть предложения или пожелания по работе Contester, посетите форум сайта www.contester.ru.

Лимит времени 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:

Для отправки решений необходимо выполнить вход.

www.contester.ru