В продолжении предыдущей статьи про процессор 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
Подробнее...