B. Forth
Ограничения: время – 1s/2s, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Вася Пупкин нашел старую программу на языке Forth и хочет перевести ее на язык С++. Чтобы избежать ошибок,
неизбежных при переводе вручную, Вася обратился за помощью в написании транслятора к вашей команде.
Язык Forth использовался для программирования встраиваемых микрокомпьютеров и мог оперировать только целыми числами
в диапазоне от –32768 до 32767. В основе вычислительной модели языка Forth лежит стековая машина и все
вычисления записываются в обратной польской записи. В обнаруженной программе были только команды
арифметических действий, загрузки целых констант и обращения к переменным. Команды +, -,
*, /, MOD заменяют два верхних элемента стека результатом соответствующего
арифметического действия. Имя переменной в Forth рассматривается как команда, которая должна загрузить
на стек адрес ячейки памяти. Команда @ заменяет адрес на вершине стека значением из ячейки памяти по этому адресу.
Для сохранения результата вычислений в ячейке памяти используется команда !, которая снимает со стека
два верхних элемента и по адресу, заданному первым элементом, записывает второе снятое значение.
Целое число в программе означает, что это число нужно загрузить на вершину стека.
Программа "X @ 1 - 2 * Y !" после перевода на язык С++ будет выглядеть так: "Y=(X-1)*2;".
Команде MOD в языке C++ соответствует операция %.
Напишите программу, выполняющую перевод найденной программы на язык С++.
В первой строке ввода содержится программа на языке Forth. Длина строки не превышает 1000 символов.
Команды в строке разделены пробелами. Имена переменных состоят только из прописных латинских букв и цифр
и начинаются с буквы. Длина имен не превышает 31 символа. Программа корректна, перед выполнением
программы и после ее завершения стек пустой, при выполнении всех команд в стеке достаточно элементов,
арифметические операции выполняются только над числами, при выполнении команд ! и @ в верхнем элементе
стека содержится адрес ячейки памяти, а вторым элементом стека при выполнении команды ! является число.
Вывести несколько строк на языке С++. Каждая строка должна содержать один оператор присваивания,
оканчивающийся символом ';'. Порядок операторов должен соответствовать порядку выполнения команд !
в программе на Forth. Нельзя производить никаких оптимизаций вычислений, менять порядок операндов или выполнения действий.
Если порядок выполнения действий в программе на языке Forth не соответствует приоритету или ассоциативности этих
операций на языке С++, то нужно использовать скобки. Последовательность символов "--" в C++ является специальной операцией, поэтому, чтобы не было ошибок при компиляции, между двумя знаками
минус нужно поставить один пробел, других пробелов в выводимых операторах не должно быть.
Пример ввода
4 2 -1 - * X ! 9 1 X @ 2 * + Y ! X !
Пример вывода
X=4*(2- -1);
Y=1+X*2;
X=9;
Пояснения: В программе на Forth не производится изменения переменных после загрузки их значений в стек, т.е. такой последовательности команд (или аналогичной) не встречается:
5 X ! X @ 6 X ! Y !
Приоритет: Операции
* / % имеют приоритет выше, чем
+ -, поэтому "
1 2 3 * +"
`→` "
1+2*3", а "
1 2 3 + *"
`→` "
1*(2+3)".
Ассоциативность: Операции с одинаковым приоритетом выполняются слева направо, поэтому "
1 2 - 3 -"
`→` "
1-2-3" (скобки не нужны), но "
1 2 3 - -"
`→` "
1-(2-3)". Аналогично "
1 2 + 3 +"
`→` "
1+2+3", а "
1 2 3 + +"
`→` "
1+(2+3)".