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

Сборники > Problems from everywhere > задача:


VologdaInterUni-H. 50648 - Транслятор

Гость
• Обсуждение задачи (1)

Задачи сборника

• 50644 - Столица
• TopCoder-1. 50761 - Magic Words
• TopCoder-2. 50246 - Making Potions
• TopCoder-5. 50760 - Hexatridecimal...
• VologdaInterUni-A. 50628 - Матрица
• VologdaInterUni-E. 50619 - Марсоход
• VologdaInterUni-F. 50638 - Сообще...
• VologdaInterUni-G. 50639 - Скобки
• VologdaInterUni-H. 50648 - Тра...

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

Если у вас есть предложения или пожелания по работе 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