- •Задание
- •Символьный преобразователь
- •Входная грамматика
- •Функции переходов преобразователя
- •Лексический анализатор
- •Грамматика лексических единиц
- •Диаграмма состояний
- •Структуры данных и таблицы
- •Семантика анализа и символы действия.
- •3.5 Спецификация функций
- •3.6 Структура программы
- •Синтаксический анализатор
- •4.1 Неформальное описание семантики
- •4.2 Атрибутная грамматика
- •4.3 Описание символов действия
- •5. Атрибутный преобразователь
4.3 Описание символов действия
{ ЗРМ}XYR1R2
Запись размера массива в структуру идентификатора.
X-номер идентификатора в ТИ (куда нужно записать)
Y-номер числа в ТЧ (что нужно записать)
R1-порядковый номер числа, описывающего количество элементов в R1-ом уровне (номер уровня массива)
R2-возвращает порядковый номер следуюшего числа, описывающего количество эл-ементов в R2-ом уровне. R2=R1+1.
{ФМБ}ABX ({ФМЧ}ABX)
Формирвание массва Bool({ФМБ}) или Char({ФМЧ})
A-номер очередной свободной ячейки ТЗ откуда можно начинать формирование
B-возвращает новый номер очередной свободной ячейки ТЗ
X-номер идентификатора в ТИ, в структуре которого находится информация о мас-сиве.
Проверяет допустимую размерность массива и допустимое количество элементов. Ес-ли все в порядке, то формирует в ТЗ массив.
{ФСД}XYR1R2P1P2
Формирование сдвига элемента массива относительно начала массива
X-номер идентификатора массива в ТИ
Y-номер числа в ТЧ (числа-индекс элемента массива)
R1-порядковый номер числа, описывающего индекс элемента массива
R2-возвращает порядковый номер следуюшего числа, описывающего индекс элемента массива. R2=R1+1.
P1-текущее значение сдвига
P2-новое значение сдвига
Если P1=0, то P2=число с номером Y в ТЧ
иначе P2=P1*dimc[R1]+число с номером Y в ТЧ
Проверяет возможность сдвига.
{ФУТЗЭМ}XPT
Формирование указателя на ячейку памяти элемента массива
X-номер в ТИ идентификатора массива
P-сдвиг элемента массива относительно начала массива
T-вычисленное значение номера ячейки памяти данного элемента массива
{ВПБ}ABX ({ВПБ}ABX)
Выделение памяти под переменную Bool ({ВПБ}) или Char ({ВПЧ})
A-номер ячейки памяти, которую можно выделить.
В-номер следующей свободной ячейки
X-идентификатор переменной, для которой выделяем память.
Устанавливает указатель на таблицу значений в структуре идентификатора.
{ЗТЗ}XZ
Запись в ТЗ значения переменной
X-номер идентификатора в ТИ переменной
Z-номер ячейки таблице констант где хранится значение константы.
Проверяет по значению поля type структуры ячейка памяти типы Оп1 и Оп2, если они совпадают, то формирует атом (=,Оп1,Оп2), где Оп1-номер ячейки памяти, на которую указывает указатель в структуре идентификатора с номером X в ТИ, Оп2-номер ячейки в таблице констант, в которой хранится значение константы.
{ЗТЗМБ}XZP1P2 ({ЗТЗМЧ}XZP1P2)
Запись в ТЗ значения элемента массива
X-идентификатор массива, которому принадлежит элемент
Z-номер ячейки в таблице констант где хранится значение константы.
P1-сдвиг элемента массива относительно начала массива
P2-сдвиг следующего элемента массива
P2=P1+1
Проверяет по значению поля type структуры ячейка памяти типы Оп1 и Оп2, если они совпадают, то формирует атом (=,Оп1,Оп2,Оп1), где Оп1-номер ячейки памяти элемента массива, Оп2-номер ячейки таблицы констант, в которой хранится значение константы.
{ФAT=}T1T2T3
Формирование атома (=,Оп1,Оп2,Рез)
T1-номер ячейки памяти в ТЗ, где хранится Операнд1
T2-номер ячейки памяти в ТЗ, где хранится Операнд2
T3-номер ячейки памяти в ТЗ, куда поместить Результат операции
Проверяет по значению поля type структуры ячейка памяти типы Оп1 и Оп2, если они совпадают, то формирует атом (=,Оп1,Оп2,Оп1).
{ФAT&}T1T2T3
Формирование атома (&,Оп1,Оп2,Рез)
T1-номер ячейки памяти в ТЗ, где хранится Операнд1
T2-номер ячейки памяти в ТЗ, где хранится Операнд2
T3-номер ячейки памяти в ТЗ, куда поместить Результат операции
Проверяет по значению поля type структуры ячейка памяти типы Оп1 и Оп2, если они совпадают, то формирует атом (&,Оп1,Оп2,Оп1).
{ФATv}T1T2T3
Формирование атома (v,Оп1,Оп2,Рез)
T1-номер ячейки памяти в ТЗ, где хранится Операнд1
T2-номер ячейки памяти в ТЗ, где хранится Операнд2
T3-номер ячейки памяти в ТЗ, куда поместить Результат операции
Проверяет по значению поля type структуры ячейка памяти типы Оп1 и Оп2, если они совпадают, то формирует атом (v,Оп1,Оп2,Оп1).
{ФAT!}T1T2T3
Формирование атома (!,Оп1,NULL,Рез)
T1-номер ячейки памяти в ТЗ, где хранится Операнд1
T2-NULL, т.к. в перации участвует всего один Операнд1
T3-номер ячейки памяти в ТЗ, куда поместить Результат операции
Формирует атом (!,Оп1,NULL,Оп1).
{УК}B1B2
Получение номера очередной свободной ячейки.
B1-номер какой-либо ячейки
B2-возвращаемый номер очередной свободной ячейки
{ФУТЗИ}XT
Формироваание указателя на ТЗ переменной
X-номер идентификатора переменной в ТИ
T-возвращаемый номер ячейки памяти в ТЗ, на которую указывает указатель в струк-туре идентификатор
4.4 Пример вывода в атрибутной грамматике
Выведем цепочку
{<bool>a7</bool>;<ass>a7 <not>’false’</not></ass>;}
<I>5 B1 {<Опис.>5 B2<Опер.>A3 B3}5 B1
{<bool><Тип bool>5 B9</bool>;<R5>A10 B10 5 B2<Опер.> A3 B3}5 B1
{<bool><Ид.>1{ВПБ}5 6 1<R6>6 B16</bool>;<R5>A10 B10 5 B2<Опер.> A3 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;<R5>6 B10 5 B2<Опер.> A3 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<Опер.> 6 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<ass><Оп.1> 1 ’ ‘<Л.опер.>6 B62 T24</ass>;<R10> A51 B51 6 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<ass><Ид.>X57{ФУТЗИ}X58T9 ’ ‘<Л.опер.>6 B62 T24</ass>;<R10> A51 B51 6 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<ass>A7 1{ФУТЗИ}1 1 ’ ‘<Л.опер.>6 B62 T24</ass>;<R10> A51 B51 6 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<ass>A7 1{ФУТЗИ}1 1 ’ ‘
<not><Оп.2>A63 B63 T25{ФАТ!}T26 T27 T28 {УК}B64 B65</not>6 B62T24</ass>;
<R10> A51 B51 6 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<ass>A7 1{ФУТЗИ}1 1 ’ ‘
<not><Оп.2>A63 B63 T25{ФАТ!}NULL 1 6 {УК}6 7</not>6 7 6</ass>;
<R10> 7 B51 6 B3}5 B1
{<bool>a7 1 {ВПБ}5 6 1 6 6</bool>;6 6<ass>A7 1{ФУТЗИ}1 1 ’ ‘
<not><Оп.2>A63 B63 T25{ФАТ!}NULL 1 6 {УК}6 7</not>6 7 6</ass>;
<R10> 7 7 6 7}5 6