Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

4.3.5 Семантический анализ. Проверка корректности типа

Следующим этапом семантического анализа после построения таблицы символов будут семантические проверки на корректность типа идентификаторов используемых в операторах и операциях.

Для выявления необходимых проверок проведём анализ всех языковых конструкций, части которых чувствительны к контексту. Приведём основные конструкции с идентификаторами, представленные в общемвиде как последовательность токенов и нетерминалов:

  1. ID[ expr_i ]=literal ;// заданиеГНУ

  2. ID= literal ;

  1. ID’ = expr ;// уравнения

  2. ID’ [ expr_i ]= expr ;

  3. IF( Bool )THEN ID[ expr_i ] = expr ; ID = expr ; ENDIF// условныйоператор

  1. ID[ Bool ] IS ID’[ expr_i ] = expr ; ID’= expr; ID[ expr_i ]= expr; ID = expr; FROM ID[ Bool ] , ID[ Bool ] ; // локальноесостояние

Заметим, что при построении таблицы символов были проверены на соответствие типов все левые части для уравнений и операторов заданий ГНУ, поэтому в дальнейших проверках они не будут участвовать, поэтому конструкцию 2) можно убрать из рассмотрения.Теперь опираясьна очевидные требования к языковым конструкциям с индексами,сформулируем ограничения для приведённых выше конструкций:

  1. индексом (expr_i) может быть либо положительная целочисленная константа, либо арифметическое выражение, в котором присутствуют переменные-счётчики, обыкновенные иименованные константы целого типа. Такие ограничения связаны с тем, что индексявляется целым положительным числом по определению, и при генерации кода онподлежит вычислению;

  2. Переменные с индексами, макросы с параметрами и переменные-счётчики могутприсутствовать только в параметризованных конструкциях, таких как 1),4) и косвенно в теле конструкций 5),6). Таким образом, в правой части 3) ,а также в логических выражениях(Bool) 5), 6)такие переменные не корректны;

  3. В каждой языковой конструкции с индексами должна встречаться единственная переменная-счётчик. А также в уравнениях с индексом, если в левой части встречается счётчик, то и в правой должен присутствовать такой же счётчик;

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

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

На рис. 4.11 приведём обобщённый алгоритм семантических проверок, в котором проверка конкретного вида конструкций будет представлена соответствующей процедурой. Входными данными будет являться таблица символов и указатель на корень синтаксического дерева, на выходе алгоритм либо подтвердит корректность программы, либо сообщит об ошибках. Так же алгоритм модифицирует синтаксическое дерево:заменяет узлы макросов на их тело, добавляет атрибут –указатель на счётчик к узлам конструкций с индексами.

Рисунок 4.11 – Обобщённый алгоритм проверки корректности типов

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

Рисунок 4.12– Алгоритм проверки корректности индексного выражения

А при встрече листовых элементов таких, как идентификатор или числовая константа, проверяет корректность их типа.

Таким же образом проверяется корректность всех остальных конструкций.

Листинг этой фазы языкового процессора представлен в Приложении В в разделе семантическими анализатор.