HomeVolumesContestsSectionsForumsUsersPrintHelpAbout

Volumes > Vologda InterUni 2006 > problem:


H. Транслятор

Volume problems

• A. Матрица
• B. 2-10
• C. Минусы
• E. Марсоход
• F. Сообщение
• G. Скобки
• H. Транслятор

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.
Автор: Фёдор Меньшиков, ВГПУ.

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