68
ИНФОРМАЦИОННЫЕ СТРУКТУРЫ И ИХ
ПРЕОБРАЗОВАНИЕ
тетрад, так как при прямолинейной генерации кода приходится порождать по
одной временной переменной на каждую операцию в программе.
Триады (также называемые "тройками" или двухадресным кодом),
построены аналогичным образом, но не содержат явного указания на
результат операции, хотя на эти результаты по-прежнему можно ссылаться в
последующих командах. Подразумевается, что задачу отслеживания и
нумерации всех триад выполняет сам компилятор. Понятно, что триады
компактнее тетрад, но, с другой стороны, отсутствие явного указания на
результат операции может затруднить фазу оптимизации. Эту проблему
можно решить путем использования косвенных триад, в которых вместо
ссылки на ранее использовавшуюся триаду используется ссылка на элемент
специальной таблицы указателей на триады.
Естественно, триады и тетрады также могут быть расширены для
записи всех операций, поддерживаемых на данной целевой платформе.
Перевод индексной записи в тетрады
21
ТАТ*
ВСТ
+
- префиксная запись.
Сканер, распознавая идентификатор, выдает два значения: некоторую
внутреннюю форму и его физические имя. На имя, где происходит замена
Е+Т на Е, семантическая программа должна выдать тетраду. Однако это
сделать нельзя, так как сентенциальная форма не содержит информации о
физических именах Е и Т, эта информация была потеряна в первой редукции,
когда было использовано правило F:=i.
При польской записи эта проблема не возникала, так как выходная
цепочка формировалась при первой редукции. Для решения этой задачи
используем некоторую семантическую подпрограмму, которая будет
передавать имя встретившегося идентификатора поэтапно в процессе
редукции.
Назовем ее:
FSEM = i(A);
EProg(+, ESEM, TSEM, R
e
);
TSEM = FSEM;
вызывается, как только встречается Е+Т;
ESEM = TSEM;
R
e
– результат.