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



         

Стек возвратови реализация структур управления - часть 4


Слово IF имеет признак немедленного исполнения, поэтому будет не скомпилировано, а исполнено.

Состояние II показывает результат исполнения слова IF. На вершину словаря скомпилирована ссылка на статью ?BRANCH, вслед за которой отведено еще 2 байта под адрес перехода, и адрес зарезервированного места сохранен на стеке данных.

Дальнейшие слова C и D будут опять компилироваться. Состояние III соответствует моменту перед вводом слова THEN.

Слово THEN, как и IF, имеет признак немедленного исполнения, поэтому будет исполняться; в результате возникнет состояние IV. В этот момент определяется адрес перехода для скомпилированной словом IF ссылки на статью ?BRANCH; это текущее значение указателя вершины словаря HERE, которое и вписывается в зарезервированные ранее 2 байта. Результат дальнейшей компиляции приводит к состоянию V.

Аналогичным образом исполняется и определение слова ELSE, которое компилирует обход части «иначе» и вписывает адрес ее начала в качестве адреса перехода для ссылки ?BRANCH. В свою очередь, адрес перехода для скомпилированного обхода будет вписан завершающим условный оператор словом THEN.

Можно повысить надежность программирования условного оператора введением контроля за соответствием слов IF, THEN и ELSE с помощью вспомогательного слова ?PAIRS:

: ?PAIRS ( A1,A2 ---> ) - ABORT" НЕПАРНЫЕ СКОБКИ" ;

которое снимает два значения со стека и, если они не равны между собой (их разность не нуль), выдает сообщение об ошибке с пояснительным текстом «Непарные скобки». Стандартное слово ABORT" (выброс и кавычка) А --> (исполнение) по своему употреблению аналогично слову ." (точка и кавычка): оно снимает значение со стека и, рассматривая его как логическое, сигнализирует об ошибке, печатая следующий за ним текст до кавычки, если это значение ИСТИНА (не нуль). Усиленные таким контролем определения слов условного оператора выглядят следующим образом:

: IF ( ---> A,1 ) COMPILE ?BRANCH HERE 2 ALLOT ; IMMEDIATE : THEN ( A,1 ---> ) 1 ?PAIRS HERE SWAP ! ; IMMEDIATE : ELSE ( A1,1 ---> A2,1 ) 1 ?PAIRS COMPILE BRANCH HERE 2 ALLOT HERE ROT ! ; IMMEDIATE




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