Требуется реализовать перевод
условного оператора, содержащего сложное условие (может включать and, or, not)
на язык, в котором допустимы только элементарные сравнения и переход на метку.
См. примеры ввода и вывода.
Первая строка входного
файла удовлетворяет следующей грамматике:
УсловныйОператор = ОсновныеСтроки ЗаключительнаяЧасть
ОсновныеСтроки = {ОпределениеЧисловойМетки | УсловныйПереход}
ОпределениеЧисловойМетки = ДвузначноеЧисло ':' 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:
|