Редактирование:
INTERPRET
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == Выход из бесконечного цикла [[BEGIN]]…[[AGAIN]] внутри INTERPRET происходит странным, но привычным для раннего Форта образом. Его обеспечивает служебное [[Пустое слово|«пустое слово»]] через манипуляцию [[Стек возвратов Каллисто|стеком возвратов]], когда исчерпывается входной поток. Слова, исполняемые словом INTERPRET, могут вызывать [[Авост приложения|авост]]. <pre> 3381 ;#INTERPRET 3382 ; INTERPRET ( −− ) Интерпретировать входной поток. 3383 LINTER: .DB 9 3384 .TEXT "INTERPRET" 3385 .DW LQSTAC 3386 INTER: .DW CALL ; Интерпретировать последовательность слов, пока во входном потоке что−то есть. 3387 IT1: .DW BL,WORD 3388 .DW DUP,TWOP,CAT, SAVIN,CSTOR ; Сохранить вторую литеру, важную для обработки литерных констант в NUMBER 3389 .DW FIND, ZBRAN,IT3, STATE,UAT, LESS 3390 .DW ZBRAN,IT2, N2CFA, COMMA, BRAN,IT5 3391 IT2: .DW N2CFA, EXEC, BRAN,IT5 3392 IT3: .DW HERE, NUMB, DPL,AT, ONEP, ZBRAN,IT4, FL, FLITE, BRAN,IT5 3393 IT4: .DW LITER 3394 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> Реализация из SP-Forth 4.20: <pre> : INTERPRET_ ( -> ) \ интерпретировать входной поток BEGIN PARSE-NAME DUP WHILE SFIND ?DUP IF STATE @ = IF COMPILE, ELSE EXECUTE THEN ELSE S" NOTFOUND" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN THEN ?STACK REPEAT 2DROP ; VARIABLE &INTERPRET ' INTERPRET_ ' &INTERPRET TC-ADDR! : INTERPRET &INTERPRET @ EXECUTE ; </pre> === Советская реализация === Юрий Семёнов приводит следующее определение слова INTERPRET (стр. 140): : INTERPRET BEGIN ( начало бесконечного цикла) FINDN ( поиск очередного имени в словаре) IF ( если слово найдено) STATE @ < ( в стеке байт длины, STATE ; проверяется, не является ли слово оператором немедленного исполнения) IF ( если обычное слово) NAME> , ( запись CFA найденного слова в новое описание) ELSE ( если слово немедленного исполнения) NAME> EXECUTE ( исполнение найденного слова) THEN ELSE ( если слово не найдено, проверяется - может быть это число ?) HERE NUMBER DPL @ 1+ ( преобразование пос- ледовательности кодов ASCII в число) IF ( если число двойной длины) DLITERAL ( запись последовательности "LIT, число" в описание нового слова) ELSE DROP LITERAL ( запись в описание числа одинарной длины) THEN THEN ?STACK ( указатель стека в норме ?) AGAIN ; У Баранова-Ноздрунова определение слова INTERPRET выглядит так (стр. 79): : INTERPRET ( ---> ) BEGIN BL WORD FINDN ?DUP IF ( Проверить признак IMMEDIATE) 1+ IF NAME> EXECUTE ELSE NAME> STATE @ IF , ELSE EXECUTE THEN THEN ELSE ( Может быть это число?) NUMBER DPL @ 1+ IF [COMPILE] 2LITERAL ELSE DROP [COMPILE] LITERAL THEN THEN AGAIN ; Описание и определение слова INTERPRET в ядре ФОРТ-ЕС: <PRE> INTERPRET + -> ИНТЕРПРЕТИРОВАТЬ ВХОДНОЙ ПОТОК 40 Экран номер 40 ( 31.03.84 EXPECT OUERY INTERPRET ФОРТ-СИСТЕМА X ) : INTERPRET ( ->) BEGIN -FIND ?DUP IF 1+ IF EXECUTE ELSE STATE @ IF , ELSE EXECUTE THEN THEN ELSE NUMBER DPL @ 1+ IF [COMPILE] 2LITERAL ELSE DROP [COMPILE] LITERAL THEN THEN ?STACK AGAIN ; </PRE> Определение слова INTERPRET в FORTH ИТЭФ: <PRE> HEAD 211Q,'INTERPRE',324Q,INTER,$COL ; INTERPRET IT1: DW DFIND,ZBRAN,IT3-$,STATE,AT,LESS DW ZBRAN,IT2-$,COMMA,BRAN,IT5-$ IT2: DW EXEC,BRAN,IT5-$ IT3: DW HERE,NUMB,DPL,AT,ONEP,ZBRAN,IT4-$,DLITE,BRAN,IT5-$ IT4: DW DROP,LITER IT5: DW QSTAC,BRAN,IT1-$ </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице