
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •1 Языковые процессоры
- •1.1 Практическое применениеискусственных языков
- •1.2 Практический пример
- •1.3 Понятие и структура языкового процессора
- •2Обзор существующих систем и обоснование выбора инструментальных средств и класса грамматики
- •2.1 Обзор существующей символьной спецификации моделей гс в среде исма
- •2.1.1 Лексемы языка исма
- •2.1.2 Грамматика языка исма
- •2.1.3 Семантические действия в языковом процессоре исма
- •2.1.4 Заключение
- •2.2 Обоснование выбора инструментальных средств и класса грамматики
- •3 Постановка задачи исследования
- •3.1 Характеристика задачи исследования
- •3.2 Входная информация
- •3.3 Выходная информация
- •3.4 Архитектура среды исма с расширенным языком описания гс
- •4 Программно-математическое обеспечение
- •4.1Лексический анализатор
- •4.1.1 Функции лексического анализатора
- •4.1.2 Спецификация токенови входного алфавита символов
- •4.1.3 Распознавание токенов
- •4.1.4 Иерархия классов модуля
- •4.2 Синтаксический анализатор
- •4.2.1 Функции синтаксического анализатора
- •4.2.2 Спецификация грамматики
- •4.2.3 Метод разбора
- •4.2.4 Восстановление после ошибок
- •4.2.5 Иерархия классов модуля
- •4.3 Семантический анализ
- •4.3.1 Промежуточное представление программы
- •4.3.2 Грамматика с семантическими правилами
- •4.3.3 Модифицированныйметодразбора
- •4.3.4 Семантический анализ. Таблица символов
- •4.3.5 Семантический анализ. Проверка корректности типа
- •4.4 Генерация кода
- •4.5 Система сбора диагностических сообщений
- •5 Тестирование
- •5.1 Лексический анализатор
- •5.2 Синтаксическийанализатор
- •5.3 Семантический анализатор
- •Заключение
- •Список использованных источников
- •ПриложениеA Диагностические сообщения
- •Диагностические сообщения сканера
- •Диагностические сообщения парсера
- •Диагностические сообщения семантического анализатора
- •ПриложениеБ
- •Б.1.3 Установка системы
- •Б.2 Работа с системой б.2.1 Запуск системы и начало работы
- •Б.2.2Ввод программной модели
- •Б.2.3Трансляция модели и просмотр результата
- •Б.2.4Сохранение программной модели
- •Б.2.6Завершение работы с системой
- •Приложение в
- •Листинг программы
- •В.1 Модуль лексического анализатора
- •Файл abstractLexer.H
- •Файл lexer.H
- •Файл lexer.Cpp
- •В.2 Модуль синтаксического анализатора Файл abstractParser.H
- •Файлparser_ll1.H
- •Файл parser_ll1.Cpp
- •В.3 Модуль семантического анализатора Файл symbolTable.H
- •Файл SymbolTableFactory.H
- •Файл checker.H
- •В.4 Модулькодогенератора ФайлastVisitor.H
- •Файл astCodeGen.H
4.3.5 Семантический анализ. Проверка корректности типа
Следующим этапом семантического анализа после построения таблицы символов будут семантические проверки на корректность типа идентификаторов используемых в операторах и операциях.
Для выявления необходимых проверок проведём анализ всех языковых конструкций, части которых чувствительны к контексту. Приведём основные конструкции с идентификаторами, представленные в общемвиде как последовательность токенов и нетерминалов:
ID[ expr_i ]=literal ;// заданиеГНУ
ID= literal ;
ID’ = expr ;// уравнения
ID’ [ expr_i ]= expr ;
IF( Bool )THEN ID[ expr_i ] = expr ; ID = expr ; ENDIF// условныйоператор
ID[ Bool ] IS ID’[ expr_i ] = expr ; ID’= expr; ID[ expr_i ]= expr; ID = expr; FROM ID[ Bool ] , ID[ Bool ] ; // локальноесостояние
Заметим, что при построении таблицы символов были проверены на соответствие типов все левые части для уравнений и операторов заданий ГНУ, поэтому в дальнейших проверках они не будут участвовать, поэтому конструкцию 2) можно убрать из рассмотрения.Теперь опираясьна очевидные требования к языковым конструкциям с индексами,сформулируем ограничения для приведённых выше конструкций:
индексом (expr_i) может быть либо положительная целочисленная константа, либо арифметическое выражение, в котором присутствуют переменные-счётчики, обыкновенные иименованные константы целого типа. Такие ограничения связаны с тем, что индексявляется целым положительным числом по определению, и при генерации кода онподлежит вычислению;
Переменные с индексами, макросы с параметрами и переменные-счётчики могутприсутствовать только в параметризованных конструкциях, таких как 1),4) и косвенно в теле конструкций 5),6). Таким образом, в правой части 3) ,а также в логических выражениях(Bool) 5), 6)такие переменные не корректны;
В каждой языковой конструкции с индексами должна встречаться единственная переменная-счётчик. А также в уравнениях с индексом, если в левой части встречается счётчик, то и в правой должен присутствовать такой же счётчик;
Вместо переменных макро определений необходимо подставить соответствующую им замену, предварительно проверив подставляемое выражение на корректность типов;
Обобщим выше сказанное, необходимо проверить выполнение всех требований, предъявляемых к языковым конструкциям, подставить макро определенияи для каждого идентификатора проверить наличие корректного типа в таблице символов. Все проверки корректности типов основаны на сравнениях.
На рис. 4.11 приведём обобщённый алгоритм семантических проверок, в котором проверка конкретного вида конструкций будет представлена соответствующей процедурой. Входными данными будет являться таблица символов и указатель на корень синтаксического дерева, на выходе алгоритм либо подтвердит корректность программы, либо сообщит об ошибках. Так же алгоритм модифицирует синтаксическое дерево:заменяет узлы макросов на их тело, добавляет атрибут –указатель на счётчик к узлам конструкций с индексами.
Рисунок 4.11 – Обобщённый алгоритм проверки корректности типов
В качестве примера проверяющих функций рассмотрим проверку индекса. Алгоритм этой функции представлен на рис. 4.12. Входными данными являются указатель на узел выражения, на выходе алгоритм либо подтвердит корректность программы, либо сообщит об ошибках. Функция, проверяющая индексное выражение, является рекурсивной, это связано с тем, что она работает с рекурсивной структурой данных - поддеревомабстрактного синтаксиса. При встрече узла арифметических выражений функция рекурсивно вызывает себя для проверки операндов этого выражения.
Рисунок
4.12– Алгоритм проверки корректности
индексного выражения
А при встрече листовых элементов таких, как идентификатор или числовая константа, проверяет корректность их типа.
Таким же образом проверяется корректность всех остальных конструкций.
Листинг этой фазы языкового процессора представлен в Приложении В в разделе семантическими анализатор.