Редактирование: INTERPRET
Перейти к навигации
Перейти к поиску
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.
Текущая версия | Ваш текст | ||
Строка 54: | Строка 54: | ||
== Реализация == | == Реализация == | ||
Выход из бесконечного цикла [[BEGIN]]…[[AGAIN]] внутри INTERPRET происходит | Выход из бесконечного цикла [[BEGIN]]…[[AGAIN]] внутри INTERPRET происходит необычным образом. Его обеспечивает служебное [[Пустое слово|«пустое слово»]] через манипуляцию [[Стек возвратов Каллисто|стеком возвратов]], когда исчерпывается входной поток. | ||
Слова, исполняемые словом INTERPRET, могут вызывать [[Авост приложения|авост]]. | Слова, исполняемые словом INTERPRET, могут вызывать [[Авост приложения|авост]]. | ||
Строка 72: | Строка 72: | ||
3393 IT4: .DW LITER | 3393 IT4: .DW LITER | ||
3394 IT5: .DW QSTAC, BRAN,IT1 | 3394 IT5: .DW QSTAC, BRAN,IT1 | ||
</pre> | </pre> | ||
Строка 179: | Строка 136: | ||
IT4: DW DROP,LITER | IT4: DW DROP,LITER | ||
IT5: DW QSTAC,BRAN,IT1-$ | IT5: DW QSTAC,BRAN,IT1-$ | ||
</PRE> | |||
Реализация транслятора строки INTERPRET из СП-Форта 3.07: | |||
<PRE> | |||
:INTERPRET | |||
BEGIN | |||
BL WORD DUP C@ \ выделяем слова, пока не исчерпаем строку | |||
WHILE | |||
FIND ?DUP \ ищем в словаре | |||
IF | |||
STATE @ = \ в зависимости от состояния компилируем или выполняем | |||
IF COMPILE, ELSE EXECUTE THEN | |||
ELSE | |||
?LITERAL \ если не нашли, то проверяем "на литеральность" | |||
THEN | |||
?STACK | |||
REPEAT DROP | |||
; | |||
</PRE> | </PRE> | ||