HomeVolumesContestsSectionsForumsUsersPrintHelpAbout

Volumes > Problems from everywhere > problem:


VologdaInterUni-H. 50648 - Translator

Guest
• Discussion of problem (1)

Volume problems

• 50644 - Capital
• TopCoder-1. 50761 - Magic Words
• TopCoder-2. 50246 - Making Potions
• TopCoder-5. 50760 - Hexatridecimal...
• VologdaInterUni-A. 50628 - Matrix
• VologdaInterUni-E. 50619 - The Mar...
• VologdaInterUni-F. 50638 - Message
• VologdaInterUni-G. 50639 - Brackets
• VologdaInterUni-H. 50648 - Tr...

Feedback

If you notice incorrect translations in Contester, please let author know.

Time limit 2000/4000/4000/4000 ms. Memory limit 65000/65000/65000/65000 Kb.
Автор: Фёдор Меньшиков, ВГПУ. Difficulty Delta

Требуется реализовать перевод условного оператора, содержащего сложное условие (может включать 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