Задача 2. Стековый калькулятор / интерпретатор.

Оригинальное условие задачи для Java

Стековый язык программирования (Дополнительная задача)

Из стекового калькулятора можно сделать полноценный (полный по Тьюрингу) язык программирования, если добавить в него циклы и условные переходы, а также несколько специальных команд (функций):

Цикл можно обозначить следующей конструкцией: [ <тело цикла> ].

Семантика цикла следующая: если на вершине стека находится true-значение (то есть не равное 0), то верхний элемент удаляется со стека, выполняется тело цикла, затем снова проверяется условие цикла.

(Вместо PUSH N можно для простоты писать просто N).

Например, следующая программа распечатает числа от 5 до 1:

5 dup [ print 1 - dup ]

Программа для вычисления факториала числа 5:

5
1 swap dup [ dup rot * swap 1 - dup ] drop print

(Вложенные циклы)

Для вычисления факториала можно обойтись без интерпретации вложенных циклов, но правильная их реализация нужна.

(!) Требования

Примеры.

Сумма двух чисел

2 3 + print

Вывод: 5

Факториал числа 5

5
1 swap dup [ dup rot * swap 1 - dup ] drop print

Вывод: 120

Условный print

0 1 < [ 1 print 0 ]

Вывод: 1

Минимум двух чисел (1)

5 7
dup rot dup rot 1 rot rot  <
[ drop swap drop 0 0 ] 
[ drop 0 ] 
print

Вывод: 5

Минимум двух чисел (2)

7 5
dup rot dup rot 1 rot rot  <
[ drop swap drop 0 0 ] 
[ drop 0 ] 
print

Вывод: 5

5
dup [ print 1 - dup ]

Вывод:

5
4
3
2
1
5
dup [ dup dup [ print 1 - dup ] drop 1 - dup ]

Вывод:

5
4
3
2
1
4
3
2
1
3
2
1
2
1
1

ant build.xml

Пример build.xml для второй задачи, который копирует файлы ресурсов в Lab.jar и в тесты.