Skip to content

sl84702/forth-interpreter

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Интерпретатор диалекта языка Forth

Первая и вторая лабораторные работы по Языкам Системного Программирования, 2 курс.

Особенности:

  • Базовая Forth-машина
  • Комлилятор Forth-команд
  • Bootstrapped

Сборка

Интерпретатор расчитан для работы на Linux с 64-ех битной архитектурой и установленным nasm
Совместимо с Windows 10 Linux Subsystem
Совместимость с MacOS X не установлена
Сборка:

nasm -felf64 -g "interpreter.asm" -o interpreter.o
ld -o interpreter interpreter.o
chmod +x interpreter

Реализованные возможности

Интерпретатор Forth

  • .S -- не разрушая стек печатает всё его содержимое.
  • +, -, *, / -- Арифметика
  • <, >, = -- сравнение (кладёт на вершину стека 1, если условие истинно)
  • and, or, not -- логика (истина -- число, отличное от нуля)
  • rot -- a b c -> b c a
  • swap -- меняет два последних элемента стека местами
  • dup -- дублирует элемент на вершине стека
  • drop -- снимает элемент с вершины стека
  • . -- снимает элемент с вершины стека и печает на экран
  • key читает символ с stdin и помещает на вершину стека
  • emit -- снимает с вершины стека символ и печатает в stdout
  • number -- читает с stdin знаковое число и помещает в стек
  • mem -- загрузит в стек константу – адрес начала пользовательской памяти.
  • ! -- снимает элемент с вершины стека и записывает, по адресу, лежащему на новой вершине стека
  • @ -- читает содержимое памяти по адресу, указанному на вершине стека
  • : -- переход в режим комплилирования
  • exit -- Выход из интерпретатора

Команды комлилятора

  • ; -- Выход из режима компилирования

Команды диалекта

  • branch n -- безусловный переход на n слов вперёд (доступно только в режиме комплирирования)
  • branch0 n -- переход на n слов вперёд, если на вершине стека нуль

Комплирование собственных команд

Интерпретатор Forth позволяет кодировать команду через последовательность уже известных команд. Синктаксис:

: имя_команды [команда/число] ;

Если вместо команды указано число, оно будет положено на вершину стека.

Пример создания собственной команды

: sq dup * ;
: discr rot 4 * * swap sq swap - ;
1 2 3 discr .

Результатом выполнения этой команды discr будет дискриминант квадратного уравения 1x2+2x+3=0 на вершине стека.

IOLib-tester.py

Форк тестера функций библиотеки по вводу и выводу. Требуется Python 2.7.x

Всю дополнительную информацию можно узнать в группе курса

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Assembly 54.2%
  • Python 45.8%