
Стековые методы
Бауэр и Замельзон. Основные его компоненты СТЕК и таблица ПЕРЕХОДОВ. Анализатор использует два стека: один стек используется непосредственно при трансляции выражения, а второй стек – во время исполнения.
Стек транслятора имеет метку Т, а исполнительный – метку Е.
Транслятор прочитывает выражение один раз слева на право и вырабатывает последовательность команд двух видов:
KI (I – есть идентификатор) является командой « Выбрать число по имени I и заслать его в стек Е »
K§ (§ - операция) является командой « Выбрать два верхних операнда из стека Е, произвести над ними операцию § и занести результат в вершину стека Е ».
Когда при просмотре входной строки считываемый символ является ОПЕРАНДОМ выдается команда KI и транслятор переходит к следующему символу.
Когда считываемый символ является операцией § производится одно из нескольких фиксированных действий. Как правило, либо § засылается в стек Т, либо выдается команда К§.
В таблице переходов указывается, какие действия должен выполнять транслятор. В этой таблице каждой операции соответствует СТРОКА и СТОЛБЕЦ.
Элементами таблицы являются директивы транслятору.
Возможны 4 действия транслятора после прочтения операции § (операция в вершине стека Т обозначается h):
I: |
Заслать § в Т; читать следующий символ |
II: |
Генерировать Кh; заслать § в Т. Читать следующий символ |
III: |
Читать из Т; Читать следующий символ (используется для удаления скобок) |
IV: |
Генерировать Кh; Читать из Т; Повторить с тем же самым входным символом. |
Имеется еще две специальные команды: Конец процесса и Ошибка, которые приказывают транслятору остановится и выдать соответствующую команду. ПРОЦЕССОР выбирает элементы таблицы, используя в качестве одного индекса h, верхнюю операцию стека Т, и в качестве второго, §, операцию, прочитанную последней из входной строки. Таблицу мы приведем для трансляции с языка простых арифметических выражений. В этой таблице L обозначает символ пробела, или пустую строку. Если стек Т пуст или пуста входная строка, то считается что прочитано L § - входной символ h - вершина стека Т.
Таблица переходов для простых алгебраических выражений.
Стек T\Строка |
L |
( |
+ |
- |
* |
/ |
) |
L |
Конец |
I |
I |
I |
I |
I |
Ошибка |
( |
Ошибка |
I |
I |
I |
II |
II |
III |
+ |
IV |
I |
II |
II |
I |
I |
IV |
- |
IV |
I |
II |
II |
I |
I |
IV |
* |
IV |
I |
IV |
IV |
II |
II |
IV |
/ |
IV |
I |
IV |
IV |
II |
II |
IV |
Применим этот процесс к конкретному выражению (a*b+c*d)/(a-d)
Т |
Прочитанный символ |
Действие |
Выдать |
L |
( |
I |
|
( |
a |
|
Ka |
( |
* |
I |
|
(* |
b |
|
Kb |
(* |
+ |
IV |
K* |
( |
Повторить |
I |
|
(+ |
c |
|
Kc |
(+ |
* |
I |
|
(+* |
d |
|
Kd |
(+* |
) |
IV |
K* |
(+ |
Повторить |
IV |
K+ |
( |
Повторить |
III |
|
L |
/ |
I |
|
/ |
( |
I |
|
/( |
a |
|
Ka |
/( |
- |
I |
|
/(- |
d |
|
Kd |
/(- |
) |
IV |
K- |
/( |
Повторить |
III |
|
/ |
+ |
IV |
K/ |
Получается последовательность команд, имеющая вид:
Ka, Kb, K*, Kc, Kd, K*, K+, Ka, Kd, K -, K/
Более простая запись получается, если опустить все скобки и использовать польскую запись (польский математик Лукасевич): ab*cd*+ad-/bc*+
Исполняющая программа использует стек Е и читает польскую запись слева направо.
При чтении операнда он засылается в стек при чтении операции она применяется к двум верхним элементам E. Для записи, выдаваемой транслятором, не возникает явных или неявных проблем старшинства. Программа выполняется в точности слева направо. Временная память автоматически управляется стеком E, содержащим все временные промежуточные значения. Не требуется стек T для хранения операндов.