printЗадачи командного чемпионата

printB. Forth

Ограничения: время – 1s/2s, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод copy
Послать решение 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)".
loading