Ограничения: время – 200ms/500ms, память – 32MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Транслятор переводит программу на языке высокого уровня в
программу на машинном языке. Напишите транслятор для
упрощенного языка Basic-. В языке Basic- всего 26 переменных,
обозначаемых прописными латинскими буквами от A до Z.
Так как все переменные целые, то операторы объявления переменных
отсутствуют. Для упрощения задачи в языке также отсутствуют
операторы ввода-вывода, ветвления и цикла, комментарии,
а также все операции и функции, кроме бинарных операций + и –.
В результате программа на языке Basic- состоит из
последовательности операторов присваивания вида:
<переменная> = <выражение>
где <выражение> это <операнд> или <выражение> + <операнд> или <выражение> - <операнд>
а <операнд> это <переменная> или ( <выражение> )
Каждый оператор присваивания записывается на отдельной строке, не содержит пробелов, длина оператора не превышает 80 символов. Пример программы:
A=B
D=A+(B-C)
Машинный язык, на который транслируется программа, состоит всего из 4 команд:
LOAD <переменная>
Загружает значение переменной в стек.
SAVE <переменная>
Сохраняет вершину стека в переменной.
ADD
Складывает два числа на вершине стеке, сумма помещается в стек.
SUB
Вычисляет разность на двух чисел на вершине стека, разность помещается в стек.
Результат трансляции вышеуказанной программы из двух операторов может выглядеть следующим образом:
LOAD B
SAVE A
LOAD C
LOAD A
LOAD B
ADD
SUB
SAVE D
Это не единственный вариант машинного кода. Результат
вычислений не изменится, если поменять местами, например,
команды LOAD A и LOAD B.
Во входном файле программа на языке Basic- (один или
более операторов присваивания).
В выходной файл вывести результат трансляции программы
на машинный язык. Не делайте оптимизирующий транслятор!
Последовательность блоков кода для операторов
присваивания должна совпадать
с последовательностью этих операторов в программе на языке Basic-.
Для каждого оператора присваивания должна быть команда SAVE,
которая должна быть последней в соответствующем блоке кода.
Каждому появлению переменной в правой части оператора
присваивания должна соответствовать команда LOAD в машинном коде.
В пределах блока кода порядок машинных команд
может быть достаточно произвольным, требуется лишь
соответствие результата вычислений выражению
в правой части оператора присваивания.
Пример ввода
A=B
D=A+(B-C)
Пример вывода
LOAD B
SAVE A
LOAD A
LOAD C
LOAD B
SUB
ADD
SAVE D