Слова CASE (выбор) и ENDCASE (конец выбора)

Слова CASE (выбор) и ENDCASE (конец выбора) ограничивают конструкцию и обеспечивают правильную компиляцию вложенных операторов. Слово CASE , проверив, что текстовый интерпретатор находится в состоянии компиляции, сменяет глобальную переменную CSP (сокращение от CURRENT STACK POINTER — текущий указатель стека), сохраняя на стеке ее прежнее значение (слово !CSP засылает в переменную CSP адрес текущей вершины стека). Слова OF (из) и ENDOF (конец из) ограничивают отдельную ветвь. Во время работы скомпилированного определения перед началом исполнения каждой ветви на стеке лежат два значения: число, представляющее условие выбора, и номер данной ветви.

Слово OF компилирует текст OVER = = IF DROP , который обеспечивает передачу управления на данную ветвь, если эти два значения совпали, причем в этом случае они оба снимаются со стека. Если же значения оказались разными, то управление передается на текст, следующий за словом ENDOF для данной ветви, которое эквивалентно слову ELSE . Наконец, слово ENDCASE компилирует операцию DROP , чтобы снять со стека оставшееся там значение условия, и разрешает все накопившиеся на стеке выходы из ветвей на текущую точку, исполняя для этих ветвей слово THEN . Его последним действием является восстановление прежнего значения переменной CSP , которое к этому моменту оказывается на вершине стека.

В приведенных определениях можно несколько уменьшить объем кода, компилируемого для входа в каждую ветвь, если ввести для этого специальное слово, вслед за которым в шитый код компилируется адрес перехода на следующую ветвь.

Исполнение слова (OF) аналогично PBRANCH , в зависимости от условия оно переустанавливает указатель интерпретации, либо обходя скомпилированную за ним ссылку, либо устанавливая указатель по значению этой ссылки. Аналогичным образом наряду со словами (OF) и ОФ можно определить пары (<OF) и <OF, (> OF) и > OF , (<OF<) и <OF< , выполняющие сравнение значения условия с заданным значением, выбирающим данную ветвь, не на равенство, а на неравенство указанного вида. При этом слово (<OF<) сравнивает значение условия с двумя значениями, определяющими интервал.

В данном примере множества выбирающих значений пересекаются, и выбор ветви определяется для этого случая порядком расположения ветвей в конструкции выбора.

Метки: , ,

Записи по теме

Комментировать

Введите код