
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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.5 Система сбора диагностических сообщений
В ходе любой из четырёх стадий работы языкового процессора могут быть обнаружены ошибки в программе, рассмотрим способы вывода сообщения об ошибке.
В данном языковом процессоре используется два способа для сообщения об ошибках:
хранение и накопление в специальном классе (Logger). Используется для стадий с восстановлением;
выброс исключений. Используется на стадиях, где не возможно восстановление после ошибки.
Стадии лексического и синтаксического анализа имеют методы для восстановления, поэтому сообщения об ошибкахна этих стадиях накапливаются в специальном классе.
На стадиях семантического анализа, а также на стадии кода генерации при обнаружении ошибки восстановление реализовать проблемно, поэтому имеет смысл прервать выполнение функции, в которой возникла ошибка и сообщить о ней, т.е. использовать механизм исключений.
Рассмотрим более подробно класс (Logger) хранения диагностических сообщений. За основу был взят паттерн “одиночка”, который гарантирует, что существуетединственный экземпляр данного класса. В этом классе имеется метод, который позволяет получить указатель на его экземпляр через статический метод, тем самым в любоммодуле языкового процессора можно вызвать статический метод и добавить запись об ошибке[5].
Таблица со всеми диагностическими сообщениями представлена в приложении А.
5 Тестирование
Тестирование языкового процессора будет проводиться на программной модели задачи реакции-диффузии, описанной в 1 разделе.
Цель тестирования – показать, как языковой процессор справляется с ошибками на различных фазах анализа. Согласно цели для каждой фазы анализа текстовой модели ГС приведено по одному тестовому примеру.
5.1 Лексический анализатор
На рис. 5.1 приведена входная программная модельcдвумяошибками в первой строке: неверный суффикс числовой константы и переполнения целого типа.
N = 20q; k = 1000000000000000; C2 = 16;
phi = 2;
count i = [1-10];
countj = [2-9];
arrayy[20]; // объявлениемассива
// начальные условия
y[2*i -1] = 0;
y[2*i] = 1;
// макросспараметром
macro alpha[i] = 2*pow(i/N - 1, 3)/C2;
macro beta[i] = 2*pow(i/N - 1, 4)/C2;
// явноезаданиеправыхчастейСДУ
y'[1] = alpha[1]*(y[3]- phi)*N/2 + beta[1]*(phi - 2*y[1] + y[3])*N*N - k*y[1]*y[2];
y'[2] = -k*y[2]*y[1];
y'[19] = -k*y[20]*y[19] ; y'[20] = -k*y[19]*y[20] ;
// алгоритмическая форма задания правых частей СДУ
y'[2*j-1] = alpha[j]*(y[2*j + 1] - y[2*j - 3])*N/2 + beta[j]*(y[2*j - 3] - 2*y[2*j-1] + y[2*j+1]) *N*N - k*y[2*j -1]*y[2*j];
y'[2*j] = -k*y[2*j]*y[2*j-1];
// гибридность
change_phi [TIME>= 5] is
phi~=0;
frominit;
Рисунок 5.1 – Входная программная модель
Языковой процессор выдаст следующие диагностики (нумерация строк начинается с нуля):
lexer error - 0: invalid suffix on constant
lexer warning - 0: overflow integer consant
5.2 Синтаксическийанализатор
На рис. 5.2 приведена входная программная модельcтремяошибками во 2, 4, 5 строке:пропущены символы “;”, “=” и“]”.
N = 20; k = 100; C2 = 16;
phi = 2
count i = [1-10];
countj [2-9];
arrayy[20; // объявлениемассива
// начальные условия
y[2*i -1] = 0;
y[2*i] = 1;
// макросспараметром
macro alpha[i] = 2*pow(i/N - 1, 3)/C2;
macro beta[i] = 2*pow(i/N - 1, 4)/C2;
// явноезаданиеправыхчастейСДУ
y'[1] = alpha[1]*(y[3]- phi)*N/2 + beta[1]*(phi - 2*y[1] + y[3])*N*N - k*y[1]*y[2];
y'[2] = -k*y[2]*y[1];
y'[19] = -k*y[20]*y[19] ; y'[20] = -k*y[19]*y[20] ;
// алгоритмическая форма задания правых частей СДУ
y'[2*j-1] = alpha[j]*(y[2*j + 1] - y[2*j - 3])*N/2 + beta[j]*(y[2*j - 3] - 2*y[2*j-1] + y[2*j+1]) *N*N - k*y[2*j -1]*y[2*j];
y'[2*j] = -k*y[2*j]*y[2*j-1];
// гибридность
change_phi [TIME>= 5] is
phi~=0;
frominit;
Рисунок 5.2 – Входная программная модель
Языковой процессор выдаст следующие диагностики:
syntax error - 1: expected token ';'
syntax error - 3: expected token '='
syntax error - 4: expected token ']'