В продолжении предыдущей статьи про процессор Forth ji в FPGA.. Мне удалось написать на форте простой интерпретатор. Он принимает из консоли через последовательный порт строки и разбирает их. Если выбранное слово из потока это число, то оно остается на стеке. Если не число, то возможно это форт слово. Интерпретатор пытается найти слово с своем словаре и если находит, то исполняет его.

На видео выше я попробовал продемонстрировать и записать работу интерпретатора.

Код интерпретатора выглядит вот так:

: main
    2drop
	begin \начало вечного цикла
        tib d# 80 accept cr	\ строка из консоли записывается в tib (text input buffer) длиной 80 байт
        tib# !				\ длина принятой из консоли строки записывается в переменную tib#
		d# 0 >in !			\ изначально разбор строки начинается с нулевого символа, запишем 0 в переменную >in
			begin			\ начнем поиск всех слов в принятой строке
			  parse-name	\ возьмем из tib слова по очереди, на стеке останется адрес строки и длина строки, "name" -- c-addr u 
			  dup			\ возьмем на стек длину слова еще раз, на стеке c-addr u u
			  while			\ зайдем в обработку слова, если его длина не ноль
				\ msg-word print-str space 2dup type
				2dup d# 0. 2swap >number \ попробуем преобразовать строку в число
				0=			\ если в строке не осталось символов, значит была строка-число
				if
					2drop	\ удалим лишнее со стека
					\ space msg-numb print-str
					rot rot 2drop \ оставим на стеке только полученное число и сверху адрес строки с длиной
				else
					drop 2drop \ было не число, так что удалим лишние слова со стека
					sfind	\ попробуем найти слово в словаре
					if
						\ space msg-exec print-str
						\ drop
						execute \ исполним найденное слово
					else
						drop \ слово не найдено в словаре, удалим лишнее слово со стека
						space msg-unkn print-str \ напечатаем сообщение об ошибке
					then
				then
				\ cr
			repeat
			2drop \ удалим адрес последней строки и ее длину со стека
	again \ к началу вечного цикла
;

Я надеюсь комментарии помогут разобраться, как это работает.

Полный исходник проекта лежит на github: https://github.com/marsohod4you/M02mini/tree/master/forth_j1

 


Добавить комментарий