Язык Форт и его реализации



         

Интерпретация входного потока - часть 2


Оно имеет признак немедленного исполнения и поэтому всегда исполняется назависимо от текущего состояния текстового интерпретатора. Его исполнение состоит в прекращении интерпретации данного входного потока и тем самым позволяет избежать дополнительных проверок на исчерпание. Обычно в реализациях языка Форт определяется слово INTERPRET (интерпретировать), выполняющее интерпретацию текущего входного потока. Оно представляет собой бесконечный цикл по вводу и исполнению (или компиляции) слов:

: INTERPRET ( ---> ) BEGIN BL WORD FIND ?DUP IF ( ПРОВЕРИТЬ ПРИЗНАК IMMEDIATE) 1+ IF EXECUTE ELSE STATE @ IF , ELSE EXECUTE THEN THEN ELSE ( МОЖЕТ БЫТЬ ЭТО ЧИСЛО?) NUMBER DPL @ 1+ IF [COMPILE] 2LITERAL ELSE DROP [COMPILE] LITERAL THEN THEN AGAIN ;

В приведенном примере конструкция BEGIN-AGAIN определяет бесконечный цикл.

Слово AGAIN выполняет безусловный переход на начало цикла.

В случае если очередное введенное слово не найдено в словаре, исполняется слово NUMBER, которое пытается воспринять его как запись числа в соответствии с текущим основанием системы счисления — значением переменной BASE. Если это удалось, то слово NUMBER возвращает значение числа как значение двойной длины и дополнительно в переменной DPL сообщает позицию десятичной точки в нем (-1, если точки в записи числа не было). В противном случае возникает ошибочная ситуация «Слово не найдено», и интерпретация прекращается. Если же введенное слово оказалось числом, то в зависимости от наличия в нем точки оно рассматривается как число двойной или одинарной точности. Таким образом, пустое слово-ограничитель входного потока-прекращает исполнение слова INTERPRET и возобновляет исполнение слова, его вызвавшего:

: X ( ---> ) R> DROP ; IMMEDIATE

Здесь X обозначает пустое слово.

Таким образом, работу форт-системы можно задать таким бесконечным циклом:

: ФОРТ-СИСТЕМА ( ---> ) BEGIN CR ." >" ( ПРИГЛАШЕНИЕ К ВВОДУ) TIB 80 EXPECT ( ВВЕСТИ ТЕКСТ С ТЕРМИНАЛА) SPAN @ #TIB ! ( УСТАНОВИТЬ ЕГО ДЛИНУ) 0 TIB #TIB @ + C! ( УСТАНОВИТЬ ОГРАНИЧИТЕЛЬ) 0 >IN ! 0 BLK ! ( УСТАНОВИТЬ ВХОДНОЙ ПОТОК) INTERPRET ( ИНТЕРПРЕТИРОВАТЬ ВВЕДЕННЫЙ ТЕКСТ) STATE @ 0= IF ." OK" THEN ( ПОДТВЕРЖДЕНИЕ) AGAIN ;




Содержание  Назад  Вперед