Реалізуйте обчислювач для дуже простої підмножини Forth.
Forth належить до стекових мов програмування. Реалізуйте дуже простий обчислювач для невеликої підмножини Forth.
Обчислювач має підтримувати такі слова:
+, -, *, / (арифметика з цілими числами)DUP, DROP, SWAP, OVER (операції зі стеком)Обчислювач також має підтримувати визначення нових слів за допомогою звичного синтаксису: : word-name definition ;.
Задля простоти потрібно підтримувати лише один тип даних: знакові цілі числа розміром щонайменше 16 біт.
Для синтаксису діють такі правила: число - послідовність з однієї або більше (ASCII) цифр, а слово - послідовність з однієї або більше літер, цифр, символів або розділових знаків, яка не є числом. (Forth, імовірно, використовує дещо інші правила, але це досить близько.)
Слова не чутливі до регістру.
У Forth функції називаються words, і вони працюють зі стеком даних.
Кожне слово бере свої параметри зі стека й повертає результат назад на стек.
Документація Forth завжди містить стан стека даних до виконання слова й після його виконання в такому вигляді: ( p1 p2 ... pN --- r1 r2 ... rN ).
Значення від p1 до pN позначають параметри слова на стеку до виклику (вище в стеку можуть бути ще якісь дані, тут не показані), а значення від r1 до rN позначають результати слова на стеку після виклику.
Роздільник --- відокремлює стан стека до виконання слова від стану після нього.
Слова, які треба реалізувати, визначено так:
| слово | стан стека | опис |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
дублює значення на вершині стека |
drop |
( a --- ) |
прибирає значення з вершини стека |
swap |
( a b --- b a ) |
міняє місцями два значення на вершині стека |
over |
( a b c --- a b c b ) |
копіює друге значення на вершину стека |
Якщо хочеться погратися з онлайн-інтерпретатором Forth або дізнатися більше про слова, які треба реалізувати, зазирнімо до Easy Forth (зокрема до розділів Adding Some Numbers, Defining Words і Stack Manipulation).