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

4.5 Система сбора диагностических сообщений

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

В данном языковом процессоре используется два способа для сообщения об ошибках:

  1. хранение и накопление в специальном классе (Logger). Используется для стадий с восстановлением;

  2. выброс исключений. Используется на стадиях, где не возможно восстановление после ошибки.

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

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

Рассмотрим более подробно класс (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 ']'