Uploaded by em_taz

Методические указания в выполнению курсовой работы по дисциплине Системное программное обеспечение

advertisement
Министерство образования и науки Российской Федерации
ФГБОУ ВО «Саратовский государственный технический университет
имени Гагарина Ю.А.»
М.Ф.Степанов
Методические указания
к выполнению курсовой работы
по дисциплине
Системное программное обеспечение
для студентов 27.03.04
("Управление в технических системах")
Одобрено
редакционно–издательским Советом
Саратовского государственного
технического университета
Саратов 2017
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ВВЕДЕНИЕ
Курсовая работа предназначена для закрепления теоретических знаний
посредством решения практических задач построения программных систем.
При этом каждый студент разрабатывает необходимое программное
обеспечение для решения поставленной задачи в соответствии с индивидуальным
заданием.
1. ЗАДАНИЕ НА ВЫПОЛНЕНИЕ КУРСОВОЙ РАБОТЫ
Разработать заданный фрагмент распределенной информационной системы,
осуществляющей решение заданной задачи обработки информации.
Обязательными для разработки являются:
 Программный модуль – функция языка С++ (далее функциональный программный
модуль), осуществляющая вычислительные действия по решению заданной
функциональной задачи.
 Автономное тестовое приложение, служащее для проверки работоспособности
функционального программного модуля.
 Библиотека динамической загрузки, содержащая функциональный программный
модуль.
 Средства идентификации и аутентификации пользователя.
 Средства криптографической защиты информации.
 Лингвистическое обеспечение взаимодействия с пользователем (лексический
анализатор, синтаксический анализатор, генератор выходного кода).
В заданиях повышенной сложности:
 Клиентское приложение, обеспечивающее интерфейс с пользователем,
формирование постановки задачи обработки информации, передаваемой на
обработку серверу с последующей визуализацией полученных результатов для
пользователя.
 Серверное приложение, осуществляющее анализ постановки задачи пользователя,
вызов функционального программного модуля для её решения, передача
клиентскому приложению результатов работы функционального программного
модуля.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Выполнение заданий осуществляется в следующей последовательности (этапы
выполнения курсовой работы):
1. Разработка алгоритма решения функциональной задачи.
2. Разработка контрольного примера функциональной задачи для проверки
работоспособности функционального программного модуля и его решение
средствами системы Матлаб.
3. Разработка функционального программного модуля.
4. Разработка
тестового
приложения
для
проверки
работоспособности
функционального программного модуля и решение контрольного примера
функциональной задачи.
5. Разработка библиотеки динамической загрузки, содержащей функциональный
программный модуль и средств его использования в приложении.
6. Разработка средств идентификации и аутентификации пользователей, средств
обеспечения конфиденциальности (криптографической защиты) информации.
7. Разработка лингвистического обеспечения взаимодействия с пользователем
(входного языка для постановки функциональных задач). Построение и
исследование грамматики входного языка.
8. Разработка лексического анализатора входного языка.
9. Разработка синтаксического анализатора входного языка.
10. Разработка генератора выходного (внутреннего) представления.
11. *Разработка серверного приложения, осуществляющего решение функциональной
задачи по её постановке на входном языке, используя функциональный
программный модуль, вызываемый из библиотеки динамической загрузки с
протоколированием хода работы (взаимодействие с клиентским приложением,
трансляция постановки задачи, решение задачи функциональным программным
модулем).
12. *Разработка клиентского приложения, позволяющего пользователю осуществить
постановку задачи на входном языке для её решения на сервере и визуализизации
полученных результатов с протоколированием хода работы.
13. *Решение контрольного примера, задаваемого на входном языке.
14. Составление программной документации в соответствии с Единой системой
программной документации (ЕСПД) на разработанные компоненты распределенной
информационной системы.
15. Подготовка пояснительной записки к курсовой работе.
16. Защита курсовой работы.
Распределение работ по срокам выполнения
Неделя 1
Этап
1-2
*Этап 1-2
2
3
3
3
4
4
4
5
5
5
6
6
6
7
7
7
8
8
8
8
8
9
8
9
10
9
9
11
9
10
12
9
11
13
10
11
14 15 16
10 14 15
12 13-14 15
17
16
16
*) для заданий повышенной сложности
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
3
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2. МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ
Изложение методики выполнения курсовой работы проводится на конкретном
примере.
Рассмотрим
процесс
разработки
системы
обработки
информации,
осуществляющей решение дифференциального уравнения вида
x Ax , x R n , A R n R n
при начальных условиях
x(t0 )
на временном отрезке t [t0 , t k ] .
x0
2.1. Разработка алгоритма решения функциональной
задачи
Пусть
в
качестве
метода
интегрирования
задано
использование
экстраполяционного метода Адамса первого порядка, расчетные формулы которого:
y k 1 f ( yk )
y1 y0 h( y0 ) / 10
yk 1 yk h(3 y k y k 1) / 2 , k 1
где h - шаг интегрирования.
Разработаем алгоритм решения функциональной задачи и запишем его на
псевдокоде.
1. Создать
обнулить
вещественный
массив
at с числом элементов
N (tk t0 ) / h 2 .
2. Создать вещественный массив ax с числом элементов n N .
3. Установить x x0 .
4.
5.
6.
7.
8.
Установить t t0 .
Установить номер шага k 0 .
Сохранить текущие значения at [ k ] t , ax[ k ] x .
Вычислить dx1 f ( x) .
Вычислить x x h (dx1) / 10 (начальный шаг методом Эйлера).
9. Цикл пока t t k
10.
Вычислить dx f (x) .
11.
Вычислить x x h (3 dx dx1) / 2 .
12.
Установить t t h .
13.
Сохранить текущие значения at [ k ] t , ax[ k ]
14.
Установить dx1 dx .
15. Конец цикла
16. Завершить работу.
x.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2.2. Разработка контрольного примера функциональной
задачи для проверки работоспособности
функционального программного модуля и его решение
средствами системы МАТЛАБ
В качестве контрольного примера функциональной задачи примем следующий
вариант численных значений исходных данных функциональной задачи:
n =3
A
0
0
1
0
0
1
1.5
2.6
3.7
, x(t 0 )
1 .9
0 , t0
0
0 , tk
10 , h 0.01.
Для решения контрольного примера используется тестовая программа на
входном языке системы МАТЛАБ (см. листинг 1).
Листинг 1. Тестовая программа на входном языке системы МАТЛАБ
a=[0 1 0;0 0 1;-1 -2 -3]
b=[0;0;1]
c=[1 0 0;0 1 0;0 0 1]
sys=ss(a,b,c,0)
x0=[1;0;0]
initial(sys,x0)
Результаты решения контрольного примера (выполнения тестовой программы на
входном языке системы МАТЛАБ), приведены на рисунке 1.
Рис. 1. Результаты решения контрольного примера в системе МАТЛАБ
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
5
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2.3. Разработка функционального программного модуля
Исходными данными в данной задаче являются параметры дифференциального
уравнения (матрица A ), начальные условия x0 , интервал анализа [t0 , tk ] , шаг
интегрирования h .
Искомым результатом в данной задаче являются массивы чисел ax и at ,
представляющие собой значения вектора x в моменты времени t .
Имя создаваемого функционального программного модуля должно включать
аббревиатуру имени автора. Например, автор – Михаил Федорович Степанов, тогда
имя модуля может быть, например, MFSmodule.
Для удобства взаимосвязи с функциональным программным модулем
разработаем структуру данных, включающую как постановку задачи, так и результаты
ее решения.
Целесообразно создать класс, методы которого осуществляют соответствующие
действия при необходимости. Например, см. листинг 2. В файле TTask.cpp должен
быть записан программный код реализации объявленных методов класса TTask.
Листинг 2. Объявление класса TTask (файл TTask.h)
//------------------------------------------------------------------------#ifndef TTaskH
#define TTaskH
//------------------------------------------------------------------------class TTask
{
private:
int n;
double *dA;
double *dx0;
double t0, tk;
double h;
int N;
double
*at;
double
*ax;
char
*szText;
public:
TTask();
TTask(int n, double t0, double tk, double h);
~TTask();
void setSizeX(int n);
int getSizeX();
void setElemA(int iRow, int jCol, double aij);
double getElemA(int iRow, int jCol);
void setElemX0(int iRow, double xi);
double getElemX0(int iRow);
void setT0(double _t0);
double getT0();
void setTk(double _tk);
double getTk();
void setH(double _h);
double getH();
int getN();
void setElemAx(int iNum, int k, double xik);
double getElemAx(int iNum, int k);
void setElemAt(int k, double _tk);
double getElemAt(int k);
const char* getText();
};
//------------------------------------------------------------------------#endif
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
6
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2.3. Разработка тестового приложения для проверки
работоспособности функционального программного
модуля и решение контрольного примера
функциональной задачи
Тестовое приложение TaskSolve должно предоставлять возможность
постановки задачи и визуализации результатов работы функционального программного
модуля.
На рисунках 2 – 4 приведены соответствующие экранные формы. Считывание
исходных данных задачи, заданных пользователем в полях экранной формы,
формирование экземпляра класса TTask, содержащего атрибуты поставленной задачи,
вызов функционального программного модуля, получение и визуализация результатов
решения задачи осуществляется функцией обработки щелчка на кнопке "Решить
задачу!".
Результаты решения контрольного примера с помощью приложения TaskSolve
приведены на рисунках 5 – 7.
Рис. 2. Экранная форма приложения проверки функционального программного модуля.
Страница исходных данных
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
7
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рис. 3. Экранная форма приложения проверки функционального программного модуля.
Страница визуализации графиков
Рис. 4. Экранная форма приложения проверки функционального программного модуля.
Страница протокола
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
8
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рис. 5. Исходные данные для решения контрольного примера
Рис. 6. Результаты решения контрольного примера
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
9
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рис. 7. Страница протокола решения контрольного примера
2.6. Разработка средств идентификации и аутентификации
пользователя, криптографической защиты
информации
Традиционно в информационных системах идентификация пользователя
осуществляется по его регистрационному имени. Контроль корректности его
использования (аутентификация) осуществляется посредством проверки констрольного
слова (пароля). Очевидно, что программа должна где-то хранить эту информацию,
обеспечивая при этом её конфиденциальность. Наиболее простым средством хранения
информации является использование файлов. Однако, несмотря на наличие различных
встроенных в операционную систему, и дополнительных средств обеспечения
безопасности посредством шифрования, в составе информационных систем имеются
собственные средства защиты. Наиболее распространенными являются средства,
основанные на шифровании информации. Как правило [35], они реализуются в виде
функций, вызываемых перед размещением данных в областях, где они могут
несанкционированно быть использованы постронними, а также после получения
данных из мест хранения перед использованием. Заданный вариант криптографической
защиты должен быть реализован в виде двух функций, например, codeTxt(…) и
decodeTxt(…).
Помимо идентификационной и аутентификационной информации следует
защищать информацию пользователей. Для этого также часто используются средства
криптографической защиты [35].
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
10
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2.7. Разработка входного языка для постановки
функциональных задач пользователем
Исходными данными в данной задаче являются параметры дифференциального
уравнения (матрица A ), начальные условия x0 , интервал анализа [t0 , tk ] , шаг
интегрирования h .
Входной язык должен быть проблемно-ориентированным и предоставлять
удобные средства для описания исходных данных задачи. Например, наподобие
входного языка системы МАТЛАБ:
n=3;
A=[0 1 0; 0 0 1; -1,5 -2,6 -3.7];
x0=[-1,9;0;0];
t0=-1,1;
tk=+10,5;
h=0,01;
Семантика обозначений переменных здесь задана в соответствии с задачей.
Анализ входного языка включает несколько этапов:
лексический анализ,
синтаксический анализ,
семантический анализ,
подготовка к генерации,
генерация выходного текста.
На каждом из перечисленных этапов используется различная информация о
входном языке, а поэтому его описание на различных этапах анализа может быть
различным: наиболее упрощенное на этапе лексического анализа и более полное на
следующих этапах. Наиболее строго и формально язык можно описать с помощью
грамматики.
Для этапа лексического анализа разработаем правоассоциативную регулярную
грамматику, правила которой имеют вид
S::=t|tN, t VT, S,N VN.
Виды лексем:
Идентификатор;
Вещественное число;
Целое число;
Присваивание;
Разделитель;
Открывающаяся скобка;
Закрывающаяся скобка;
Идентификатор
Примеры записи
n, A, x0, t0, tk, h
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
11
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Скобочная форма записи
n
A
x
t
h
0
k
Синтаксический граф
окончание
идентификатор
n
0
A
k
x
t
h
Форма Бэкуса-Наура
<идентификатор>::= n<окончание>|
A<окончание>|
x<окончание>|
t<окончание>|
h<окончание>|
<окончание>::= 0| k |
Целое число
целое ::
чис
чис :: чис цифра | цифра
цифра :: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<целое> ::=
1|2|3|4|5|6|7|8|9|
0<целое> | 1<целое> | 2<целое> | 3<целое> | 4<целое> | 5<целое> |
6<целое> | 7<целое> | 8<целое> | 9<целое>
Действительное число
Примеры записи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
12
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
12.75, .1, 167., 3.14Е +5, .72Е -15, 84.Е 7
Скобочная форма записи
{d ...} [d ...]
E
{d ...}
d [d ...]
d
{d ...}
[d ...] E
d [d ...]
Синтаксический граф
+
E
d
d
d
-
d
d
d
<число>
<порядок без знака>
<остаток числа>
<порядок>
E
d
d
d
<остаток порядка>
+
-
d
d
d
<дробь1>
<дробь2>
Форма Бэкуса-Наура
<число> ::= d<остаток числа>|.<дробь 1>
<остаток числа> ::= d<остаток числа>|.<дробь 2>
<дробь 1> ::= d<дробь 2>
<дробь 2> ::= d<дробь 2>|E<порядок>|
<порядок> :: = +<порядок без знака>| -<порядок без знака>| d<остаток порядка>
<порядок без знака> ::= d<остаток порядка>
<остаток порядка> ::= d<остаток порядка>|
Разделители
<Присваивание> ::= =
<Открывающаяся скобка> :: [
<Закрывающаяся скобка> ::= ]
<Разделитель> ::= ;
Данный язык может быть задан, например, грамматикой
G1(VT,VN,P, <лексема>),
где
<задача> - начальный символ грамматики,
VT = {n|A|x|t|k|h|0|1|2|3|4|5|6|7|8|9|E|.|+|-|[|]|;|,|=|⊔} – словарь
символов, где "⊔" – обозначает пробел,
терминальных
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
13
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
VN = {<лексема> | <идентификатор> | <окончание> | <число> | <остаток числа> |
<дробь 1> | <дробь 2> | <порядок> | <порядок без знака> | <остаток порядка> | <целое> |
<чис> | <цифра> | <Присваивание> | <Открывающаяся скобка> | <Закрывающаяся
скобка> | <Разделитель> }
Правила подстановки
<лексема> ::=
n<окончание>|
A<окончание>|
x<окончание>|
t<окончание>| h<окончание>| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0<целое> | 1<целое> | 2<целое> |
3<целое> | 4<целое> | 5<целое> | 6<целое> | 7<целое> | 8<целое> | 9<целое> | 1<остаток
числа> | 2<остаток числа> | 3<остаток числа> | 4<остаток числа> | 5<остаток числа> |
6<остаток числа> | 7<остаток числа> | 8<остаток числа> | 9<остаток числа> | .<дробь 1>
<окончание>::= 0| k |
<остаток числа> ::= 0<остаток числа> | 1<остаток числа> | 2<остаток числа> |
3<остаток числа> | 4<остаток числа> | 5<остаток числа> | 6<остаток числа> | 7<остаток
числа> | 8<остаток числа> | 9<остаток числа> | .<дробь 2>
<дробь 1> ::= 0<дробь 2> | 1<дробь 2> | 2<дробь 2> | 3<дробь 2> | 4<дробь 2> |
5<дробь 2> | 6<дробь 2> | 7<дробь 2> | 8<дробь 2> | 9<дробь 2>
<дробь 2> ::= 0<дробь 2> | 1<дробь 2> | 2<дробь 2> | 3<дробь 2> | 4<дробь 2> |
5<дробь 2> | 6<дробь 2> | 7<дробь 2> | 8<дробь 2> | 9<дробь 2> |E<порядок>|
<порядок> :: = +<порядок без знака>| -<порядок без знака>| 0<остаток порядка> |
1<остаток порядка> | 2<остаток порядка> | 3<остаток порядка> | 4<остаток порядка> |
5<остаток порядка> | 6<остаток порядка> | 7<остаток порядка> | 8<остаток порядка> |
9<остаток порядка>
<порядок без знака> ::= 0<остаток порядка> | 1<остаток порядка> | 2<остаток
порядка> | 3<остаток порядка> | 4<остаток порядка> | 5<остаток порядка> | 6<остаток
порядка> | 7<остаток порядка> | 8<остаток порядка> | 9<остаток порядка>
<остаток порядка> ::= 0<остаток порядка> | 1<остаток порядка> | 2<остаток
порядка> | 3<остаток порядка> | 4<остаток порядка> | 5<остаток порядка> | 6<остаток
порядка> | 7<остаток порядка> | 8<остаток порядка> | 9<остаток порядка> |
<Присваивание> ::= =
<Открывающаяся скобка> :: [
<Закрывающаяся скобка> ::= ]
<Разделитель> ::= ;
Анализ построенной грамматики показывает, что все правила подстановки
имеют вид
S::=t|tN, t VT, S,N VN,
а, следовательно, удовлетворяют требованиям, предъявляемым к грамматикам 3-го
типа, т.е. грамматика относится к типу регулярных грамматик.
В данном простейшем случае, очевидно, что может быть построена и более
компактная грамматика, описывающая этот же самый язык. При этом и реализация
лексического анализатора, как следствие, также окажется более компактной.
Стремление к лаконичности оправдывает себя!
2.8. Разработка лексического анализатора входного языка
Анализ постановки задачи на входном языке включает
 лексический,
 синтаксический,
 семантический анализ.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
14
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
На этапе лексического анализа распознаются и выделяются в исходном тексте
все лексемы. В рассматриваемом примере лексемами являются:
 Тип 1: идентификаторы компонентов постановки задачи – в данном
случае это фактически ключевые слова: "n", "A", "x0", "t0", "tk", "h".
 Тип 2: разделитель: точка с запятой ";".
 Тип 3: вещественные десятичные константы со знаком - произвольная
последовательность цифр (от "0" до "9"), начинающаяся с любой цифры
или знаков "+" или "-", в составе которой может присутствовать
десятичная точка "." или запятая ",".
 Тип 4: целые десятичные константы без знака – произвольная
последовательность цифр (от "0" до "9"), начинающаяся с любой цифры.
 Тип 5: знак операции присваивания "=".
 Тип 6: открывающаяся квадратная скобка "[".
 Тип 7: закрывающаяся квадратная скобка "]".
В связи с тем, что входной язык описывается регулярной грамматикой, то на
этапе лексического анализа в качестве распознавателя лексем можно использовать
конечный автомат.
Построение конечного автомата лексического анализатора
Конечный автомат может быть задан с помощью пяти параметров:
M (Q, , , q0 , F ) ,
где
Q – конечное множество состояний автомата;
– конечное множество допустимых входных символов (входной алфавит);
– заданное отображение множества Q во множество подмножеств P(Q), т.е.
:Q
P(Q) – функция переходов автомата;
q0 Q – начальное состояние автомата;
F Q – множество заключительных состояний автомата.
Другим способом задания конечного автомата является граф переходов –
графическое представление множества состояний и функций переходов. Граф
переходов – это нагруженный однонаправленный граф, в котором вершины
представляют состояния конечного автомата, дуги изображают переходы из одного
состояния в другое, а символы пометки (нагрузки) дуг соответствуют функции
перехода конечного автомата. Если функция перехода конечного автомата
предусматривает переход из состояния q в q' по нескольким символам, то между ними
строится одна дуга, которая помечается всеми символами, по которым происходит
переход из состояния q в q'.
Границами лексем для данного распознавателя служат "⊔" – пробел, знаки
перевода строки "\n" и возврата каретки "\r", "," – запятая, ";" – точка с запятой,
открывающаяся и закрывающаяся квадратные скобки "[", "]", знак равенства "=",
которые, в свою очередь также являются лексемами (кроме пробела, знаков перевода
строки и возврата каретки).
В связи с этим границы лексем являются эффективно распознаваемыми, а,
следовательно, нет необходимости во взаимодействии с синтаксическим анализатором.
Построим конечный автомат, эквивалентный грамматике G1.
Шаг 1.
Строим множество состояний автомата. Начальное состояние автомата –
Н=<лексема>.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
15
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Q = VN {H}= {<лексема> | <идентификатор> | <окончание> | <число> | <остаток
числа> | <дробь 1> | <дробь 2> | <порядок> | <порядок без знака> | <остаток порядка> |
<целое> | <чис> | <цифра> | <Присваивание> | <Открывающаяся скобка> |
<Закрывающаяся скобка> | <Разделитель> | <Успех>}.
Шаг 2.
В качестве алфавита входных символов принимаем множество терминальных
символов грамматики.
= {"A"|"x"|"t"|"0"|"k"|"h"|"E"|"0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"|"E"|"."|"+"|
""|"["|"]"|";"|","|"⊔"}.
Шаг 3.
Рассматриваем множество правил грамматики и строим функцию переходов
автомата.
Для начального правила
<лексема> ::=
n<окончание>
(Н,"n")={<окончание>}.
Для правила
<окончание>::= 0| k |
(<окончание>,"0")={<Успех>}.
(<окончание>,"k")={<Успех>}.
(<окончание>," ")={<Успех>}.
И так далее для всех правил грамматики.
Построенный конечный автомат, очевидно, является детерминированным.
Поэтому его преобразование не требуется.
На основании этого конечного автомата несложно построить программную
реализацию лексического анализатора.
Формирование текстового представления постановки задачи
Вначале модифицируем тестовое приложение TaskSolve, использующее
функциональный программный модуль, введя формирование текстового представления
постановки задачи на основе визуального представления, заданного пользователем на
экранной форме. Для этого на экранную форму добавим страницу «Постановка задачи»
и разместим на ней Memo-поле, назвав его, например, TaskTextMemo, в которое и
будем записывать текстовое представление постановки задачи.
Разработаем функцию setTextTask(), осуществляющую формирование
текстового представления постановки задачи на основании данных, заданных
пользователем в полях экранной формы.
Программная реализация лексического анализатора входного
языка
Предварительно создадим на экранной форме тестового приложения элементы
для визуализации результатов работы лексического анализатора. Поэтому вначале
определим сведения, которые должны сохраняться для каждой лексемы. К
традиционным относятся:
1) текст лексемы;
2) тип лексемы;
3) значение лексемы для целочисленных лексем типа "константа";
4) значение лексемы для вещественных лексем типа "константа";
5) номер строки, где встретилась лексема;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
16
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
6) позиция лексемы в строке;
7) позиция лексемы относительно начала исходного текста.
Для хранения сведений о лексеме разработаем структуру данных. Оформим ее в
виде класса TLexem языка С++, снабдив необходимой функциональностью.
Пусть заданием предусмотрено использование массива записей для организации
таблиц анализатора.
Поскольку идентификаторы являются разновидностью лексем, то построим
класс идентификаторов TIdent на основе класса лексем, а также и список
идентификаторов TIdentList на основе TLexemList.
На рисунках 13 - 15 приведены экранные формы с результатами работы
лексического анализа тестовой задачи.
Рисунок 13. Текстовое представление тестовой постановки задачи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
17
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рисунок 14. Результаты лексического анализа. Таблица лексем
Рисунок 15. Результаты лексического анализа. Таблица идентификаторов
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
18
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
2.9. Разработка синтаксического анализатора входного
языка для постановки функциональных задач
пользователем
Синтаксический анализатор (синтаксический разбор) – это часть транслятора,
которая отвечает за выявление и проверку синтаксических конструкций входного
языка. В задачу синтаксического анализа входит:
 Поиск и выделение синтаксических конструкций в исходно тексте;
 Установка типа и проверка правильности каждой синтаксической
конструкции;
 Представление синтаксических конструкций в виде, удобном для
дальнейшей генерации выходного текста.
Лексический анализатор только позволяет избавить сложный по структуре
синтаксический анализатор от решения примитивных задач по выявлению и
запоминанию лексем входного текста.
Выходом лексического анализатора является таблица лексем, поступающая на
вход синтаксического анализатора, который исследует только один компонент каждой
лексемы – ее тип.
Остальная информация о лексемах используется на более поздних фазах – при
семантическом анализе, подготовке к генерации и генерации результирующего
выходного текста.
Синтаксический анализатор воспринимает выход лексического анализатора и
разбирает его в соответствии с грамматикой входного языка. При этом на этапах
лексического и синтаксического анализа могут применяться различные, хотя и
совместимые по лексемам, грамматики входного языка. Обычно для этапа лексического
анализа используются регулярные грамматики для упрощения построения лексического
анализатора.
На этапе синтаксического анализа требуется более строгое описание
синтаксических конструкций, которое часто может быть получено лишь с
использованием более сложных КС-грамматик.
В рассматриваемом примере уточним параметры входного языка и для описания
его синтаксиса воспользуемся КС-грамматикой.
Вспомним, что на этапе лексического анализа идентификаторы, целые и
вещественные числа, разделители (скобки, пробел) выделены как отдельные лексемы и
сохранены в таблице лексем. Поэтому на этапе синтаксического анализа рассматривать
их терминальные символы не будем.
Проведем анализ типов лексем.
Тогда грамматика входного языка, используемая на этапе синтаксического
анализа примет вид:
G2(VT,VN,P, <задача>),
где
<задача> - начальный символ грамматики,
VT = {n|A|x|t|k|h|0|1|2|3|4|5|6|7|8|9|.|+|-|[|]|;|,|=|⊔} – словарь терминальных символов,
где "⊔" – обозначает пробел,
VN = {<задача> |<>} – словарь нетерминальных символов,
P – правила подстановки:
1: <задача>::=<массивыCразмерностью><началоАнализа><разделитель_";">
<конецАнализа><разделитель_";"><шаг><разделитель_";">
2: <размерность>::=<идентификатор_"n"><равно><целоеЧисло><разделитель_";">
3:
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
19
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
<началоАнализа>::=<идентификатор_"t0"><равно><вещественноеЧисло><разделит
ель_";">
4:
<конецАнализа>::=<идентификатор_"tk"><равно><вещественноеЧисло><разделите
ль_";">
5: <шаг>::=<идентификатор_"h"><равно><вещественноеЧисло>
6: <матрицаА>::=<идентификатор_"A"><равно><матрица><разделитель_";">
7: <векторX0>::= <идентификатор_"x0"><равно><матрица><разделитель_";">
8: <строкиМатрицы>::= <строкиМатрицы><строкаМатрицы><разделитель_";">
9: <строкиМатрицы>::= <строкиМатрицы><строкиМатрицы><строкаМатрицы>
10: <матрица>::=[<строкиМатрицы>]
11: <матрица>::=[<строкаМатрицы>]
12: <строкиМатрицы>::= <строкиМатрицы><строкиМатрицы>
13: <строкиМатрицы>::= <строкиМатрицы><строкаМатрицы>
14: <строкиМатрицы>::= <строкаМатрицы><разделитель_";">
15: <строкаМатрицы>::=<строкаМатрицы><вещественноеЧисло>
16: <массивыCразмерностью>::=<размерность><разделитель_";"><массивы>
17: <массивы>::=<матрицаА><векторX0>
18: <строкаМатрицы>::=<вещественноеЧисло>
19: <строкиМатрицы>::=<строкаМатрицы>
<идентификатор_"n">::=n
<идентификатор_"t0">::=t0
<идентификатор_"tk">::=tk
<идентификатор_"h">::=h
<идентификатор_"A">::=A
<идентификатор_"X0">::=x0
<открывающаясяСкобка>::=[
<закрывающаясяСкобка>::=]
<разделитель_";">::=;
<равно>::==
Пусть для этапа синтаксического анализа необходимо описать входной язык
грамматикой предшествования. Такие грамматики используются для синтаксического
разбора цепочек входного языка с помощью модификации алгоритма "сдвиг-свертка".
Распознаватель на основе грамматики предшествования исходит из того, что для
каждой упорядоченной пары символов в грамматике устанавливается отношение,
называемое отношением предшествования.
В процессе разбора автомат с магазинной памятью (МП-автомат) сравнивает
текущий символ входной цепочки с одним из символов, находящихся на верхушке
стека автомата.
В процессе сравнения проверяется, какое из возможных отношений
предшествования существует между этими двумя символами. В зависимости от
найденного отношения выполняется либо сдвиг, либо свертка.
При отсутствии отношения предшествования между символами алгоритм
сигнализирует об ошибке.
Необходимо
непротиворечивым
образом
определить
отношения
предшествования между символами грамматики.
Отношения предшествования будем обозначать знаками "=.", "<.", ".>".
Отношение предшествования единственно для каждой пары символов. Если между
какими-либо двумя символами не установлено отношение предшествования, то это
значит, что они не могут находиться рядом ни в одном элементе синтаксически
правильной цепочки.
Метод предшествования основан на том, что отношения предшествования
между двумя соседними символами распознаваемой строки соответствуют трем
следующим вариантам:
 Bi <. Bi+1, если символ Bi+1 - крайний левый символ некоторой основы (это
отношение можно назвать "предшествует основе" или просто "предшествует");
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
20
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
 Bi .> Bi+1, если символ Bi - крайний правый символ некоторой основы (это
отношение можно назвать "следует за основой" или просто "следует");
 Bi =. Bi+1, если символы Bi и Bi+1 – принадлежат одной основе (это отношение
можно назвать "составляют основу").
Разберем суть принципа разбора входной цепочки
в тот момент, когда
выполняется свертка цепочки (см. рис. 16).
н
<.
a
<.
=.
=.
=.
b
.>
к
Рисунок 16. Отношения между символами входной цепочки в грамматике
предшествования
Символ a является последним символом подцепочки , а символ b – первым
символом подцепочки .
Тогда, если в грамматике удастся установить непротиворечивые отношения
предшествования, то в процессе выполнения разбора по алгоритму "сдвиг-свертка"
можно всегда выполнять сдвиг до тех пор, пока между символом на верхушке стека и
текущим символом входной цепочки существует отношение <. или =..
А как только между этими символами будет обнаружено отношение .>, сразу
надо выполнять свертку.
Причем для выполнения свертки из стека следует выбирать все символы,
связанные отношением =.. Все различные правила в грамматике предшествования
должны иметь различные правые части – это гарантирует непротиворечивость выбора
правила при выполнении свертки.
На основании отношений предшествования строится матрица предшествования.
Строки матрицы предшествования помечаются первыми (левыми) символами,
столбцы – вторыми (правыми) символами отношений предшествования.
В клетки матрицы на пересечении соответствующих столбца и строки
помещаются знаки отношений.
При этом пустые клетки матрицы говорят о том, что между данными символами
нет ни одного отношения предшествования.
Выделяются следующие виды грамматик предшествования:
 Простого предшествования;
 Расширенного предшествования;
 Слабого предшествования;
 Смешанной стратегии предшествования;
 Операторного предшествования.
Построим
матрицу
предшествования,
воспользовавшись
двумя
дополнительными типами множеств символов – множествами крайних левых и
крайних правых символов, а также множествами крайних левых терминальных и
крайних правых терминальных символов для всех нетерминальных символов
грамматики.
Для грамматики G(VT,VN,P,S) :
 L(U)={ T | U
* Tz} – множество крайних левых символов относительно
нетерминального символа U;
 R(U)={ T | U
* zT} – множество крайних правых символов относительно
нетерминального символа U;
 Lт(U)={ t | U * tz или U * Сtz } – множество крайних левых терминальных
символов относительно нетерминального символа U;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
21
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
 Rт(U)={ t | U * zt или U * ztC } – множество крайних правых терминальных
символов относительно нетерминального символа U,
где U,C VN , T V , z V*, t VТ.
Множества L(U) и R(U) могут быть построены для каждого нетерминального
символа U VN по следующему алгоритму:
1. Для каждого U VN ищем все правила, содержащие U в левой части. Во
множество L(U) включаем самый левый символ из правой части правил, а во
множество R(U) - самый правый символ из правой части. Если в правой части правила
для символа U имеется только один символ, то он должен быть записан в оба
множества.
2. Для каждого U VN выполняем следующее преобразование: если множество
L(U) содержит нетерминальные символы грамматики U', U'', … , то его надо дополнить
символами, входящими в соответствующие множества L(U'), L(U''), … и не входящими
в L(U). Аналогичные действия следует выполнить и для R(U).
3. Если на предыдущем шаге хотя бы одно множество L(U) или R(U) для
некоторого символа грамматики изменилось, то следует вернуться к шагу 2, иначе –
построение закончено.
Для нахождения множеств Lт(U) и Rт(U) используется следующий алгоритм:
1. Для каждого нетерминального символа грамматики U VN строятся множества
L(U) и R(U).
2. Для каждого нетерминального символа грамматики U VN ищутся правила
вида U tz и U Сtz, где t VТ, C VN, z V*; терминальные символы t включаются во
множество Lт(U). Аналогично для множества Rт(U) ищутся правила вида U zt и
U ztС. Один и тот же терминальный символ t может быть записан в оба множества
Lт(U) и Rт(U).
3. Просматривается множество L(U), в которое входят символы U', U'', … .
Множество Lт(U) дополняется терминальными символами, входящими в L(U'), L(U''),
… и не входящими в Lт(U). Аналогичная операция выполняется и для множества Rт(U)
на основе множества R(U).
Для практического использования матрицу предшествования дополняют
терминальными символами н и к (начало и конец цепочки). Для них определены
следующие отношения предшествования:
н <. a, если а Lт(U);
к .> a, если а Rт(U);
На основе множеств Lт(U) и Rт(U) заполнение матрицы операторного
предшествования для КС-грамматики G(VT,VN,P,S) можно выполнить по следующему
алгоритму:
1. Взять первый терминальный символ ai VТ, i=1. Считаем этот символ
текущим терминальным символом.
2. Во всем множестве правил P ищем правила вида C xaiby или C xaiUby, где
ai - текущий терминальный символ, b VТ - произвольный терминальный символ,
U,C VN, а x,y V*. Фактически производится поиск таких правил, в которых в правой
части символы ai и bj стоят рядом или между ними есть не более одного
нетерминального символа, причем символ ai обязательно стоит слева от bj.
3. Для всех символов bj, найденных на шаге 2, ставим знак "=." ("составляет
основу") в клетки матрицы операторного предшествования на пересечении строки,
помеченной символом ai, и столбца, помеченного символом bj.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
22
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4. Во всем множестве правил P ищем правила вида C xaiUjy, где ai - текущий
терминальный символ, Uj,C VN, а x,y V*. Фактически производится поиск таких
правил, в которых в правой части символ ai стоит слева от нетерминального символа
Uj.
5. Для всех символов Uj, найденных на шаге 4, берем множество символов
Lт(Uj). Для всех терминальных символов ck, входящих в это множество, ставим знак
"<." ("предшествует") в клетки матрицы предшествования на пересечении строки,
помеченной символом ai, и столбца, помеченного символом ck.
6. Во всем множестве правил P ищем правила вида C xUjaiy, где ai - текущий
терминальный символ, Uj,C VN, а x,y V*. Фактически производится поиск таких
правил, в которых в правой части символ ai стоит справа от нетерминального символа
Uj.
7. Для всех символов Uj, найденных на шаге 6, берем множество символов
Rт(Uj). Для всех терминальных символов ck, входящих в это множество, ставим знак
".>" ("следует") в клетки матрицы предшествования на пересечении строки,
помеченной символом ck, и столбца, помеченного символом ai.
8. Если рассмотрены все терминальные символы ai VТ, то переходим к шагу 9,
иначе – берем очередной символ ai VТ, i=i+1, делаем его текущим терминальным
символом и возвращаетмся к шагу 2.
9. Берем множество Lт(S) для целевого символа грамматики S. Для всех
терминальных символов ck Lт(S) ставим знак "<." ("предшествует") в клетки
матрицы операторного предшествования на пересечении строки, помеченной символом
н ("начало цепочки") и столбца, помеченного символом ck.
10. Берем множество Rт(S) для целевого символа грамматики S. Для всех
терминальных символов ck Rт(S) ставим знак ".>" ("следует") в клетки матрицы
операторного предшествования на пересечении строки, помеченной символом ck и
столбца, помеченного символом к ("конец цепочки").
Построение закончено.
Если на всех шагах алгоритма построения матрицы предшествования не
возникло противоречий, когда в одну и ту же клетку матрицы надо записать несколько
различных символов предшествования, то матрица построена правильно (в каждой
клетке правильно построенной матрицы присутствует один из символов
предшествования либо клетка пуста).
Если возникли противоречия, то исходная грамматика не является грамматикой
предшествования. В этом случае можно попробовать преобразовать грамматику так,
что она станет удовлетворять требованиям предшествования, либо необходимо
использовать другой тип распознавателя.
Построение матрицы предшествования
Построим для грамматики G2(VT,VN,P, <задача>) вначале множества крайних
левых и крайних правых символов.
Далее условно будем считать нетерминальные символы:
<идентификатор_"n">, <идентификатор_"t0">, <идентификатор_"tk">,
<идентификатор_"h">, <идентификатор_"A">, <идентификатор_"x0">,
<целоеЧисло>, <вещественноеЧисло>
"условно" терминальными, поскольку на этапе синтаксического анализа они выступают
в качестве неделимой лексемы и отдельные символы в них не рассматриваются.
Представлять их будем их собственными значениями.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
23
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Шаг 1.
Таблица 1
Множества символов (результаты выполнения шага 1)
Символ U
Множество L(U)
Множество R(U)
<задача>
<массивыCразмерностью>
<разделитель_";">
<размерность>
<идентификатор_"n">
<разделитель_";">
<началоАнализа>
<идентификатор_"t0">
<вещественноеЧисло>
<конецАнализа>
<идентификатор_"tk">
<вещественноеЧисло>
<шаг>
<идентификатор_"h">
<вещественноеЧисло>
<матрицаА>
<идентификатор_"A">
<разделитель_";">
<векторX0>
<идентификатор_"x0">
<разделитель_";">
<строкиМатрицы>
<строкиМатрицы>,
<разделитель_";">,
<строкаМатрицы>,
<строкаМатрицы>,
<строкиМатрицы>,
<вещественноеЧисло>
<матрица>
[
]
<массивыCразмерностью>
<размерность>
<массивы>
<массивы>
<матрицаА>
<векторX0>
<строкаМатрицы>
<вещественноеЧисло>
<вещественноеЧисло>
Шаг 2. Дополним множества L(U) и R(U) символами для всех промежуточных
нетерминальных символов аналогично шагу 1.
Таблица 2
Множества символов (результаты выполнения шага 2)
Символ U
Множество L(U)
Множество R(U)
<задача>
<массивыCразмерностью>,
;
<размерность>
<массивы>
<размерность>
n
;
<началоАнализа>
t0
<вещественноеЧисло>
<конецАнализа>
tk
<вещественноеЧисло>
<шаг>
h
<вещественноеЧисло>
<матрицаА>
A
;
<векторX0>
x0
;
<строкиМатрицы>
<строкиМатрицы>,
;, <строкаМатрицы>,
<строкаМатрицы>,
<строкиМатрицы>,
<вещественноеЧисло>
<вещественноеЧисло>
<матрица>
[
]
<массивыCразмерностью>
<размерность>,
<массивы>,
n
<векторX0>, ;
<массивы>
<матрицаА>, A
<векторX0>, ;
<строкаМатрицы>
<вещественноеЧисло>
<вещественноеЧисло>
Построение множеств крайних правых и крайних левых
терминальных символов.
Здесь возьмем все крайние правые и крайние левые терминальные символы из
правил грамматики G2. Получим множества, представленные в таблице 3.
Таблица 3
Множества терминальных символов
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
24
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Символ U
<задача>
<размерность>
<началоАнализа>
<конецАнализа>
<шаг>
<матрицаА>
<векторX0>
<строкиМатрицы>
Множество LТ(U)
n
n
t0
tk
h
A
x0
<вещественноеЧисло>
<матрица>
<массивыCразмерностью>
<массивы>
<строкаМатрицы>
[
n
A
<вещественноеЧисло>
Множество RТ(U)
;
;
<вещественноеЧисло>
<вещественноеЧисло>
<вещественноеЧисло>
;
;
;
<вещественноеЧисло>
]
;
;
<вещественноеЧисло>
Заполнение матрицы предшествования.
Вновь вспомним, что на этапе лексического анализа идентификаторы, целые и
вещественные числа, разделители (скобки, точка с запятой) выделены как отдельные
лексемы и сохранены в таблице лексем. Поэтому на этапе синтаксического анализа
рассматривать их терминальные символы не будем. Проведем анализ типов лексем.
1: <задача> ::= <массивыCразмерностью><началоАнализа>;<конецАнализа>;<шаг>;
2: <размерность> ::= n=<целоеЧисло>;
3: <началоАнализа> ::= t0=<вещественноеЧисло>
4: <конецАнализа> ::= tk=<вещественноеЧисло>
5: <шаг> ::= h=<вещественноеЧисло>
6: <матрицаА> ::= A=<матрица>;
7: <векторX0> ::= x0=<матрица>;
8: <строкиМатрицы> ::= <строкиМатрицы><строкаМатрицы>;
9: <строкиМатрицы> ::= <строкиМатрицы><строкиМатрицы><строкаМатрицы>
10: <матрица> ::= [<строкиМатрицы>]
11: <матрица> ::= [<строкаМатрицы>]
12: <строкиМатрицы> ::= <строкиМатрицы><строкиМатрицы>
13: <строкиМатрицы> ::= <строкиМатрицы><строкаМатрицы>
14: <строкиМатрицы> ::= <строкаМатрицы>;
15: <строкаМатрицы> ::= <строкаМатрицы><вещественноеЧисло>
16: <массивыCразмерностью> ::= <размерность><массивы>
17: <массивы> ::= <матрицаА><векторX0>
18: <строкаМатрицы>::=<вещественноеЧисло>
19: <строкиМатрицы>::=<строкаМатрицы>
Введем сокращения имен нетерминальных символов:
1: <Z> ::= <R><B>;<E>;<H>;
2: <R> ::= n=<целоеЧисло>;
3: <B> ::= t0=<вещественноеЧисло>
4: <E> ::= tk=<вещественноеЧисло>
5: <H> ::= h=<вещественноеЧисло>
6: <S> ::= A=<M>;
7: <X> ::= x0=<M>;
8: <C> ::= <C><c>;
9: <C> ::= <C><C><c>
10: <M> ::= [<C>]
11: <M> ::= [<c>]
12: <C> ::= <C><C>
13: <C> ::= <C><c>
14: <C> ::= <c>;
15: <c> ::= <c><вещественноеЧисло>
16: <R> ::= <r><D>
17: <D> ::= <S><X>
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
25
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
18: <c>::=<вещественноеЧисло>
19: <C>::=<c>
C учетом кодов лексем:
1: <Z> ::= <R><B>2<E>2<H>2
2: <R> ::= 1n542
3: <B> ::= 1t053
4: <E> ::= 1tk53
5: <H> ::= 1h53
6: <S> ::= 1A5<M>2
7: <X> ::= 1x05<M>2
8: <C> ::= <C><c>2
9: <C> ::= <C><C><c>
10: <M> ::= 6<C>7
11: <M> ::= 6<c>7
12: <C> ::= <C><C>
13: <C> ::= <C><c>
14: <C> ::= <c>2
15: <c> ::= <c>3
16: <R> ::= <r><D>
17: <D> ::= <S><X>
18: <c> ::= 3
19: <C> ::= <c>
Или, опустив уголковые скобки:
1: Z ::= RB2E2H2
2: R ::= 1n542
3: B ::= 1t053
4: E ::= 1tk53
5: H ::= 1h53
6: S ::= 1A5M2
7: X ::= 1x05M2
8: C ::= Cc2
9: C ::= CCc
10: M ::= 6C7
11: M ::= 6c7
12: C ::= CC
13: C ::= Cc
14: C ::= c2
15: c ::= c3
16: R ::= rD
17: D ::= SX
18: c ::= 3
19: C ::= c
Таким образом, словарь терминальных символов (лексем) на этапе
синтаксического анализа включает 12 символов:
VT={n|t0|tk|h|A|x0|;|вч|цч|=|[|]}
или, с учетом кодов лексем:
VT={1n|1t0|1tk|1h|1A|1x0|2|3|4|5|6|7}.
Словарь нетерминальных символов включает 12 символов:
VH={Z|R|D|r|B|E|H|S|M|C|c|X}
В словарь добавим терминальные символы н и к (начало и конец цепочки),
введя для них коды лексем 0 и 8 соответственно.
Следовательно, матрица предшествования будет иметь размер 25 25.
Рассмотрим процесс ее построения на примере строки для терминального
символа "n"
Символ "n" должен стоять слева от символов "=" "<целоеЧисло>" ";" в одном
предложении. Следовательно, в строке, помеченной символом "n", на пересечении со
столбцами, помеченными символами "=" "<целоеЧисло>" ";" поставим знак "=."
("составляет основу").
Символ "n" должен стоять слева от нетерминального символа <массивы> в
правиле
<массивыCразмерностью>::=<размерность><массивы>.
В силу вхождения в первое правило грамматики символ "n" не может
находиться правее любого символа грамматики. Поэтому построение матрицы для него
закончено.
Матрица предшествования для рассмотренной грамматики приведена в таблице
4.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
26
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Таблица 4
Матрица предшествования
Сим. 1A
0 н
1A
1h
1n
1t0
1tk
1x0
2;
>.
3вч
4цч
5=
6[
7]
Z
R
D
r
=.
B
E
H
S
M
C
c
X
1h
1n
<.
1t0
1tk 1x0
2;
3вч 4цч
=.
=.
>.
=.
>.
=.
>.
=.
=.
=.
5=
6[
Z
R
D
r
B
E
H
S
M
C
c
X
8 к
=.
=.
=.
=.
=.
=.
=.
>.
>.
=.
=.
7]
>.
>.
=.
=.
=.
=.
=.
>.
>.
=.
>.
=.
=.
=.
=.
=.
=.
>.
=.
=.
=.
=.
=.
=.
>.
>.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
27
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Пример выполнения разбора предложений входного языка.
Синтаксический разбор осуществляет МП-автомат с одним состоянием <E>. Для
иллюстрации работы МП-автомата будем записывать каждую его конфигурацию в виде
трех составляющих { | | }, где
 - непрочитанная часть входной цепочки;
 - содержимое стека МП-автомата;
 - последовательность номеров примененных правил.
В начальном состоянии вся входная цепочка не прочитана, стек автомата
содержит только лексему типа "начало входной цепочки", последовательность номеров
правил пуста.
Пусть, например, входная цепочка имеет вид:
n=3;A=[0 1 0; 0 0 1; -1,5 -2,6 -3,7];x0=[-1,9;0;0];t0=-1,1;tk=+10,5;h=0,01;
Таблица 5
Множество лексем цепочки
№ Лексема Тип № Лексема Тип № Лексема Тип № Лексема Тип № Лексема Тип
1
n
1 10
0
3 19
]
7 28
0
3 37 +10,5
3
2
=
5 11
;
2 20
;
2 29
]
7 38
;
2
3
3
4 12
0
3 21
x0
1 30
;
2 39
h
1
4
;
2 13
0
3 22
=
5 31
t0
1 40
=
5
5
A
1 14
1
3 23
[
6 32
=
5 41 0,01
3
6
=
5 15
;
2 24
-1,9
3 33
-1,1
3 42
;
2
7
[
6 16
-1,5
3 25
;
2 34
;
2 43
8
0
3 17
-2,6
3 26
0
3 35
tk
1 44
9
1
3 18
-3,7
3 27
;
2 36
=
5 45
Поскольку лексический анализ успешно выполнен, то вместо лексем входной
цепочки будем рассматривать коды лексем. Идентификаторы к тому же будем условно
сопровождать еще и текстом лексемы в целях обеспечения однозначности выбора
правила грамматики для свертки. На самом деле текст лексемы, конечно же, будет при
анализе выбираться из множества лексем, равно как и тип лексемы.
Таблица 6
Типы лексем
Тип Лексема
Тип Лексема
0 начало цепочки н
1 имя (идентификатор)
2 разделитель ";"
3 вещественное число
4 целое число
5 знак операции присваивания "="
6 открывающаяся [ скобка
7 закрывающаяся ] скобка
8 конец цепочки к
Тогда указанное условное представление входной цепочки примет вид:
1n5421A5633323332333721x05632323721t05321tk5321h5328
При этом следует иметь в виду, что при переносе и свертке идентификатор
рассматривается в совокупности как пара (код лексемы – текст лексемы) и
обрабатывается совместно.
Разбор входной цепочки – протокол выполнения синтаксического анализа
(заключительный фрагмент протокола работы синтаксического анализатора приведен
на рисунке 14):
шаг анализа = 0
цепочка = '1n5421A5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_'
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
28
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
правила = ''
шаг анализа = 1
==> сдвиг (перенос):
цепочка = '5421A5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_1n'
правила = ''
шаг анализа = 2
==> сдвиг (перенос):
цепочка = '421A5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_1n5'
правила = ''
шаг анализа = 3
==> сдвиг (перенос):
цепочка = '21A5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_1n54'
правила = ''
шаг анализа = 4
==> сдвиг (перенос):
цепочка = '1A5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_1n542'
правила = ''
шаг анализа = 5
==> свёртка:
Применено правило с правой частью = '1n542'
цепочка = '1A5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_r'
правила = '2'
шаг анализа = 6
==> сдвиг (перенос):
цепочка = '5633323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A'
правила = '2'
шаг анализа = 7
==> сдвиг (перенос):
цепочка = '633323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A5'
правила = '2'
шаг анализа = 8
==> сдвиг (перенос):
цепочка = '33323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56'
правила = '2'
шаг анализа = 9
==> сдвиг (перенос):
цепочка = '3323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A563'
правила = '2'
шаг анализа = 10
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '3323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56c'
правила = '2,18'
шаг анализа = 11
==> сдвиг (перенос):
цепочка = '323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56c3'
правила = '2,18'
шаг анализа = 12
==> свёртка:
Применено правило с правой частью = 'c3'
цепочка = '323332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56c'
правила = '2,18,15'
шаг анализа = 13
==> сдвиг (перенос):
цепочка = '23332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56c3'
правила = '2,18,15'
шаг анализа = 14
==> свёртка:
Применено правило с правой частью = 'c3'
цепочка = '23332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56c'
правила = '2,18,15,15'
шаг анализа = 15
==> сдвиг (перенос):
цепочка = '3332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56c2'
правила = '2,18,15,15'
шаг анализа = 16
==> свёртка:
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
29
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Применено правило с правой частью = 'c2'
цепочка = '3332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C'
правила = '2,18,15,15,14'
шаг анализа = 17
==> сдвиг (перенос):
цепочка = '332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C3'
правила = '2,18,15,15,14'
шаг анализа = 18
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '332333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56Cc'
правила = '2,18,15,15,14,18'
шаг анализа = 19
==> сдвиг (перенос):
цепочка = '32333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56Cc3'
правила = '2,18,15,15,14,18'
шаг анализа = 20
==> свёртка:
Применено правило с правой частью = 'Cc3'
цепочка = '32333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C'
правила = '2,18,15,15,14,18,12'
шаг анализа = 21
==> сдвиг (перенос):
цепочка = '2333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C3'
правила = '2,18,15,15,14,18,12'
шаг анализа = 22
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '2333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56Cc'
правила = '2,18,15,15,14,18,12,18'
шаг анализа = 23
==> сдвиг (перенос):
цепочка = '333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56Cc2'
правила = '2,18,15,15,14,18,12,18'
шаг анализа = 24
==> свёртка:
Применено правило с правой частью = 'c2'
цепочка = '333721x05632323721t05321tk5321h5328'
стек
= '0_r1A56CC'
правила = '2,18,15,15,14,18,12,18,14'
шаг анализа = 25
==> сдвиг (перенос):
цепочка = '33721x05632323721t05321tk5321h5328'
стек
= '0_r1A56CC3'
правила = '2,18,15,15,14,18,12,18,14'
шаг анализа = 26
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '33721x05632323721t05321tk5321h5328'
стек
= '0_r1A56CCc'
правила = '2,18,15,15,14,18,12,18,14,18'
шаг анализа = 27
==> сдвиг (перенос):
цепочка = '3721x05632323721t05321tk5321h5328'
стек
= '0_r1A56CCc3'
правила = '2,18,15,15,14,18,12,18,14,18'
шаг анализа = 28
==> свёртка:
Применено правило с правой частью = 'CCc3'
цепочка = '3721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C'
правила = '2,18,15,15,14,18,12,18,14,18,8'
шаг анализа = 29
==> сдвиг (перенос):
цепочка = '721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C3'
правила = '2,18,15,15,14,18,12,18,14,18,8'
шаг анализа = 30
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '721x05632323721t05321tk5321h5328'
стек
= '0_r1A56Cc'
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
30
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
правила = '2,18,15,15,14,18,12,18,14,18,8,18'
шаг анализа = 31
==> свёртка:
Применено правило с правой частью = 'Cc'
цепочка = '721x05632323721t05321tk5321h5328'
стек
= '0_r1A56C'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13'
шаг анализа = 32
==> сдвиг (перенос):
цепочка = '21x05632323721t05321tk5321h5328'
стек
= '0_r1A56C7'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13'
шаг анализа = 33
==> свёртка:
Применено правило с правой частью = '6C7'
цепочка = '21x05632323721t05321tk5321h5328'
стек
= '0_r1A5M'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10'
шаг анализа = 34
==> сдвиг (перенос):
цепочка = '1x05632323721t05321tk5321h5328'
стек
= '0_r1A5M2'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10'
шаг анализа = 35
==> свёртка:
Применено правило с правой частью = '1A5M2'
цепочка = '1x05632323721t05321tk5321h5328'
стек
= '0_rS'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6'
шаг анализа = 36
==> сдвиг (перенос):
цепочка = '5632323721t05321tk5321h5328'
стек
= '0_rS1x0'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6'
шаг анализа = 37
==> сдвиг (перенос):
цепочка = '632323721t05321tk5321h5328'
стек
= '0_rS1x05'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6'
шаг анализа = 38
==> сдвиг (перенос):
цепочка = '32323721t05321tk5321h5328'
стек
= '0_rS1x056'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6'
шаг анализа = 39
==> сдвиг (перенос):
цепочка = '2323721t05321tk5321h5328'
стек
= '0_rS1x0563'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6'
шаг анализа = 40
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '2323721t05321tk5321h5328'
стек
= '0_rS1x056c'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18'
шаг анализа = 41
==> сдвиг (перенос):
цепочка = '323721t05321tk5321h5328'
стек
= '0_rS1x056c2'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18'
шаг анализа = 42
==> свёртка:
Применено правило с правой частью = 'c2'
цепочка = '323721t05321tk5321h5328'
стек
= '0_rS1x056C'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14'
шаг анализа = 43
==> сдвиг (перенос):
цепочка = '23721t05321tk5321h5328'
стек
= '0_rS1x056C3'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14'
шаг анализа = 44
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '23721t05321tk5321h5328'
стек
= '0_rS1x056Cc'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18'
шаг анализа = 45
==> сдвиг (перенос):
цепочка = '3721t05321tk5321h5328'
стек
= '0_rS1x056Cc2'
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
31
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18'
шаг анализа = 46
==> свёртка:
Применено правило с правой частью = 'c2'
цепочка = '3721t05321tk5321h5328'
стек
= '0_rS1x056CC'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14'
шаг анализа = 47
==> сдвиг (перенос):
цепочка = '721t05321tk5321h5328'
стек
= '0_rS1x056CC3'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14'
шаг анализа = 48
==> свёртка:
Применено правило с правой частью = '3'
цепочка = '721t05321tk5321h5328'
стек
= '0_rS1x056CCc'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18'
шаг анализа = 49
==> свёртка:
Применено правило с правой частью = 'CCc'
цепочка = '721t05321tk5321h5328'
стек
= '0_rS1x056C'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9'
шаг анализа = 50
==> сдвиг (перенос):
цепочка = '21t05321tk5321h5328'
стек
= '0_rS1x056C7'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9'
шаг анализа = 51
==> свёртка:
Применено правило с правой частью = '6C7'
цепочка = '21t05321tk5321h5328'
стек
= '0_rS1x05M'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10'
шаг анализа = 52
==> сдвиг (перенос):
цепочка = '1t05321tk5321h5328'
стек
= '0_rS1x05M2'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10'
шаг анализа = 53
==> свёртка:
Применено правило с правой частью = '1x05M2'
цепочка = '1t05321tk5321h5328'
стек
= '0_rSX'
правила = '2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7'
шаг анализа = 54
==> свёртка:
Применено правило с правой частью = 'SX'
цепочка = '1t05321tk5321h5328'
стек
= '0_rD'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17'
шаг анализа = 55
==> свёртка:
Применено правило с правой частью = 'rD'
цепочка = '1t05321tk5321h5328'
стек
= '0_R'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16'
шаг анализа = 56
==> сдвиг (перенос):
цепочка = '5321tk5321h5328'
стек
= '0_R1t0'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16'
шаг анализа = 57
==> сдвиг (перенос):
цепочка = '321tk5321h5328'
стек
= '0_R1t05'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16'
шаг анализа = 58
==> сдвиг (перенос):
цепочка = '21tk5321h5328'
стек
= '0_R1t053'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16'
шаг анализа = 59
==> свёртка:
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
32
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Применено правило с правой частью = '1t053'
цепочка = '21tk5321h5328'
стек
= '0_RB'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3'
шаг анализа = 60
==> сдвиг (перенос):
цепочка = '1tk5321h5328'
стек
= '0_RB2'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3'
шаг анализа = 61
==> сдвиг (перенос):
цепочка = '5321h5328'
стек
= '0_RB21tk'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3'
шаг анализа = 62
==> сдвиг (перенос):
цепочка = '321h5328'
стек
= '0_RB21tk5'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3'
шаг анализа = 63
==> сдвиг (перенос):
цепочка = '21h5328'
стек
= '0_RB21tk53'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3'
шаг анализа = 64
==> свёртка:
Применено правило с правой частью = '1tk53'
цепочка = '21h5328'
стек
= '0_RB2E'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4'
шаг анализа = 65
==> сдвиг (перенос):
цепочка = '1h5328'
стек
= '0_RB2E2'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4'
шаг анализа = 66
==> сдвиг (перенос):
цепочка = '5328'
стек
= '0_RB2E21h'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4'
шаг анализа = 67
==> сдвиг (перенос):
цепочка = '328'
стек
= '0_RB2E21h5'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4'
шаг анализа = 68
==> сдвиг (перенос):
цепочка = '28'
стек
= '0_RB2E21h53'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4'
шаг анализа = 69
==> свёртка:
Применено правило с правой частью = '1h53'
цепочка = '28'
стек
= '0_RB2E2H'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4,5'
шаг анализа = 70
==> сдвиг (перенос):
цепочка = '8'
стек
= '0_RB2E2H2'
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
33
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4,5'
шаг анализа = 71
==> свёртка:
Применено правило с правой частью = 'RB2E2H2'
цепочка = '8'
стек
= '0_Z'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4,5,1'
шаг анализа = 72
==> в вершине стека символ начальный символ грамматики 'Z'
===> разбор завершен - цепочка допущена
цепочка = '8'
стек
= '0_'
правила =
'2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,
4,5,1'
разбор закончен.
Программная реализация синтаксического анализатора
Модифицируем тестовое приложение, включив в него синтаксический
анализатор и средства визуализации результатов его работы. Для отображения
протокола и дерева вывода синтаксического анализа создадим страницу «Синтаксис»,
на которой разместим компонент PageControl с двумя страницами для отображения
протокола «Протокол» и «Синтаксическая структура». Протокол будем отображать с
помощью компонента TMemo, а дерево вывода - с помощью TTreeView.
Синтаксический анализатор для работы требует сведения о синтаксических
символах (класс TSyntSymbol), представляя их в виде списка (класс TSyntSymbolList)
и стека (класс TSyntSymbolStack), правилах грамматики в виде списка (класс
TSyntRuleList) экземпляров класса TSyntRule.
Собственно эмулятор МП-автомата синтаксического анализатора реализован в
виде функции makeSyntSymbolList(), использующей вспомогательные функции
getRelationStackToLexem()
и
getRelationSyntSymbolToSyntSymbol().,
определяющих значение отношения предшествования, задаваемого матрицей
предшествования между символом в верхушке стека (анализируемым символом) и
символом из входной цепочки.
На рисунках 17 – 18 приведены результаты синтаксического анализа.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
34
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рисунок 17. Заключительный фрагмент протокола работы синтаксического анализатора
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
35
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рисунок 18. Дерево вывода, построенное синтаксическим анализатором
В результате получим последовательность правил:
2,18,15,15,14,18,12,18,14,18,8,18,13,10,6,18,14,18,14,18,9,10,7,17,16,3,4,5,1.
Этой последовательности правил будет соответствовать следующая цепочка
вывода на основе грамматики G2 (символ " N" означает вывод по правилу N):
<задача>
1 <массивыCразмерностью><началоАнализа>;<конецАнализа>;<шаг>;
<массивыCразмерностью><началоАнализа>;<конецАнализа>;
h=<вещественное
5
число>;
4 <массивыCразмерностью><началоАнализа>; tk=<вещественное число>;
h=<вещественное число>;
3 <массивыCразмерностью>t0=<вещественное число>;tk=<вещественное
число>;h=<вещественное число>;
16 <размерность>;<массивы>;t0=<вещественное число>;tk=<вещественное
число>;h=<вещественное число>;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
36
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
<размерность>;<матрицаА><векторX0>;t0=<вещественное
число>;tk=<вещественное число>;h=<вещественное число>;
7 <размерность>;<матрицаА>x0=<матрица>; t0=<вещественное число>;
tk=<вещественное число>; h=<вещественное число>;
10 <размерность>;<матрицаА>x0=[<строкиМатрицы>]; t0=<вещественное число>;
tk=<вещественное число>; h=<вещественное число>;
17
9
<размерность>;<матрицаА>x0=[<строкиМатрицы><строкиМатрицы><строкаМатрицы>
]; t0=<вещественное число>; tk=<вещественное число>; h=<вещественное
число>;
18
<размерность>;<матрицаА>x0=[<строкиМатрицы><строкиМатрицы><вещественноеЧи
сло>]; t0=<вещественное число>; tk=<вещественное число>; h=<вещественное
число>;
14 <размерность>;<матрицаА>
x0=[<строкиМатрицы><строкаМатрицы>;<вещественноеЧисло>]; t0=<вещественное
число>; tk=<вещественное число>; h=<вещественное число>;
18 <размерность>;<матрицаА>
x0=[<строкиМатрицы><вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
14 <размерность>;<матрицаА>
x0=[<строкаМатрицы>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
18 <размерность>;<матрицаA>
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
6 <размерность>;А=<матрица>;
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
10 <размерность>;А=[<строкиМатрицы>];x0=[<вещественноеЧисло>;
<вещественноеЧисло>;<вещественноеЧисло>]; t0=<вещественное число>;
tk=<вещественное число>; h=<вещественное число>;
13 <размерность>;А=[<строкиМатрицы><строкаМатрицы>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
18 <размерность>;А=[<строкиМатрицы><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
8 <размерность>; А=[<строкиМатрицы><строкаМатрицы>;<вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
12 <размерность>; А=[<строкиМатрицы>;<строкаМатрицы><вещественное
число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
14 <размерность>; А=[<строкиМатрицы>;<вещественное число><вещественное
число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
13 <размерность>; А=[<строкиМатрицы><строкаМатрицы>;<вещественное
число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
14 <размерность>; А=[<строкиМатрицы><вещественное число>;<вещественное
число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
13 <размерность>; А=[<строкиМатрицы><строкаМатрицы><вещественное
число>;<вещественное число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
14 <размерность>; А=[<строкиМатрицы><вещественное число><вещественное
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
37
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
число>;<вещественное число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
11 <размерность>; А=[<строкаМатрицы>;<строкаМатрицы><вещественное
число><вещественное число>;<вещественное число><вещественное
число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
14 <размерность>; А=[<строкаМатрицы>;<вещественное число><вещественное
число><вещественное число>;<вещественное число><вещественное
число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
15 <размерность>; А=[<строкаМатрицы><вещественное число>;<вещественное
число><вещественное число><вещественное число>;<вещественное
число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
15 <размерность>; А=[<строкаМатрицы><вещественное число><вещественное
число>;<вещественное число><вещественное число><вещественное
число>;<вещественное число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
14 <размерность>; А=[<вещественное число><вещественное число><вещественное
число>;<вещественное число><вещественное число><вещественное
число>;<вещественное число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
4 n=<целоеЧисло>; А=[<вещественное число><вещественное число><вещественное
число>;<вещественное число><вещественное число><вещественное
число>;<вещественное число><вещественное число><вещественное число>];
x0=[<вещественноеЧисло>;<вещественноеЧисло>;<вещественноеЧисло>];
t0=<вещественное число>; tk=<вещественное число>; h=<вещественное число>;
Подставив в полученную цепочку значения чисел, получим исходную входную
цепочку, сделав допущение, что вещественное число при порождении всегда
завершается пробелом в качестве разделителя :
n=3; А=[0 1 0 ;0 0 1 ; -1,5 -2,6 -3,7 ];x0=[-1,9 ;0 ;0 ];t0=-1,1 ;tk=+10,5
;h=0,01 ;
2.10. Разработка генератора выходного представления
Результатом работы создаваемого транслятора текстового представления
постановки задачи должен быть сформированный экземпляр класса TTask.
При этом следует иметь в виду, что единственными исполняемыми
«операторами» текстовой постановки задачи являются операторы присваивания.
Поэтому на основании результатов синтаксического анализа (дерева разбора
входной цепочки), пользуясь методами свертки объектного кода, можно
непосредственно сформировать искомый экземпляр класса TTask, не порождая
объектной программы.
Учитывая структуру дерева вывода, будем осуществлять его обход, раскрывая до
«листьев» крайний левый нетерминал. Обработанные вершины – «листья», а также
нетерминальные символы, не имеющие потомков будем удалять.
Функция makeOutText() осуществляет генерацию выходного представления
текстовой постановки задачи на основании дерева вывода, построенного на этапе
синтаксического анализа.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
38
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Результаты работы транслятора (содержимое экземпляра класса TTask) должны
быть визуализированы – получено текстовое представление сформированной в
результате трансляции постановки задачи, используя функцию getText() класса TTask.
Результаты решения контрольного примера приведены на рис. 19.
Рисунок 19. Постановка задачи, построенная транслятором
2.11. Подготовка пояснительной записки
Пояснительная записка к курсовой работе должна содержать описание всех
этапов хода выполнения работы, результатов, полученных на каждом этапе,
программную документацию на разработанное программное обеспечение в
соответствии с ЕСПД.
К пояснительной записке должен быть приложен CD-ROM, содержащий в
корневом каталоге каталог, имя которого соответствует фамилии автора. Например,
автор – Михаил Федорович Степанов, тогда имя каталога может быть, например,
MFStepanov.
В указанном каталоге должен находится файл с постановкой задачи и
подкаталоги с результатами выполнения работы. Имена этих подкаталогов
соответствуют номерам этапов выполнения работы.
В каждом таком подкаталоге должна находиться информация (текстовые
документы, проекты инструментальной среды разработки программного обеспечения),
разработанная на соответствующем этапе.
Например,
в подкаталоге с именем 1 должно находиться задание на выполнение работы и
алгоритм работы функционального программного модуля,
в подкаталоге 2 – проект инструментальной среды (например, С++ Builder или
Microsoft Visual Studio) создания приложения для проверки работоспособности
разработанного функционального программного модуля,
в подкаталоге
3 – проекты создания библиотек для класса TTask и
функционального программного модуля, объединенные в группу проектов с проектом
создания
приложения
для
проверки
работоспособности
разработанного
функционального программного модуля,
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
39
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
в подкаталоге 4 – текстовый документ, включающий описание входного языка
для постановки функциональных задач пользователем,
в подкаталоге 5 – текстовый документ, включающий описание процесса
построения и исследование грамматики входного языка для постановки
функциональных задач пользователем,
в подкаталоге 6 – модифицированная по сравнению с содержимым подкаталога
группа проектов создания тестового приложения, текстовый документ, включающий
описание процесса построения и исследование грамматики входного языка для
постановки функциональных задач пользователем, и т.д.
2.12. Использование инструментальных средств
разработки программного обеспечения
Для создания разрабатываемого в рамках курсовой работы программного
обеспечения должны использоваться инструментальные средства разработки,
например, MS Visual Studio 2010, C++ Builder.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
40
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
3. ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ
Индивидуальное задание определяется функциональной задачей, решаемой
разрабатываемой системой обработки информации.
Выбор задачи, вариантов в пределах задачи осуществляется в соответствии с
номером зачетной книжки.
Правило выбора вариантов
Для выбора варианта задания следует использовать остаток от деления числа,
составленного из последних трех цифр номера зачетной книжки на количество
имеющихся вариантов.
Рассмотрим пример выбора индивидуального задания на курсовую работу.
Индивидуальное задание предусматривает выбор:
1) вида криптографической защиты;
2) вида входного языка;
3) способа организации таблиц идентификаторов;
4) метода проведения синтаксического анализа;
5) вида внутреннего представления программы;
6) вида функциональной задачи.
Пусть, например, номер зачетной книжки 123458.
3.1. Выбор вида криптографической защиты
Индивидуальное задания для разработки криптографической защиты
определяется в соответствии с вариантами, представленными в таблице 1. Номер
варианта выбирается как остаток от деления последних трех цифр номера зачетной
книжки на количество вариантов в таблице 1, т.е. 4.
458 = 4*114+2
Таким образом, первая часть шифра задания на курсовую работу: 2
Таблица 1
Варианты кодирования/декодирования информации
Вариант
Способ кодирования/декодирования
1
Кодирование/декодирование по методу Цезаря
2
Кодирование/декодирование по методу Цезаря со сдвигом
полученного кода на N бит влево, где N – последняя цифра
номера зачетной книжки
3
Кодирование/декодирование по методу Цезаря со сдвигом
полученного кода на N бит вправо, где N – последняя цифра
номера зачетной книжки
4
Кодирование/декодирование
посредством
перестановки
фрагментов кода символа в соотношении N:M, где N+M=8, N =
остаток от деления последней цифры номера зачетной книжки
на 7.
3.2. Выбор вида входного языка
Выбор вида входного языка осуществляется в соответствии с вариантами,
представленными в таблице 2 и дополненными операторами присваивания,
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
41
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
необходимыми для задания исходных данных функциональной задачи (п. 3.6).
Количество вариантов в таблице 2 равно 10.
458 = 10*45+8
Тогда из таблицы 2 вид входного языка – 8 (Условные операторы). Количество
допустимых видов логических операторов в таблице 2 равно 7. Поэтому для выбора
используем остаток от деления числа, составленного из последнихтрёх цифр номера
зачётной книжки (458) на количество вариантов (7):
458 = 7*65+3
Таким образом, вид вид входного языка: 8.3 - Условные операторы с
допустимыми логическими операторами вида 3, т.е. ==, !=.
Таким образом, выбранная часть шифра задания на курсовую работу: 2.8.3
Таблица 2
Виды входного языка
Вариант
Вид входного языка
1
Операторы присваивания с арифметическими операциями (+,,*,/).
Например,
a=123;
b=a/23.07;
c=a+b;
2
3
4
Операторы объявления массивов.
Например,
a=[2 3];
b=[1 2;3 4.14];
c=[a; b];
at=a’;
d=[at b];
e=[a’ b];
Операторы объявления массивов.
Например,
A=1:100;
t0=-30.17;
tk=20.59;
h=0.015;
at=t0:h:tk;
Вызовы функций, возвращающих один результат.
Например,
n=3;
a=ones(n);
b=zeros(4,2);
5
Вызовы функций, возвращающих несколько результатов.
Например,
[X,Y]=meshgrid(-1:.5:1,-1:.5:1);
6
Циклы на фиксированное количество повторений.
for
<переменная
цикла>=<начальное
значение>:<приращение>:<конечное
значение>
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
42
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
7
инструкции
end
Например,
a=[];
for i=1:n
a=[a i];
% другие операторы тела цикла
for j=i:2:Nk
b(i,j)=a(i)^i;
A(i,j)=1/(i+j-1);
% другие операторы тела цикла
end
end
Условные операторы вида:
if <условное выражение>
<исполняемые операторы>
end
Допустимые виды условных выражений
<идентификатор><логический оператор><идентификатор>
<идентификатор><логический оператор><константа>
<константа><логический оператор><идентификатор>
8
Допустимые виды логических операторов:
1. <, >
2. <, >, ==
3. ==, !=
4. <=, >=
5. <, >, ==, !=
6. !=, <=, >=
7. <, >, ==, !=, <=, >=
Например,
a=12;
if a>b
a=a+b;
end
Условные операторы вида:
if <условное выражение>
<исполняемые операторы>
else
<исполняемые операторы>
end
Допустимые виды условных выражений
<идентификатор><логический оператор><идентификатор>
<идентификатор><логический оператор><константа>
<константа><логический оператор><идентификатор>
Допустимые виды логических операторов:
1. <, >
2. <, >, ==
3. ==, !=
4. <=, >=
5. <, >, ==, !=
6. !=, <=, >=
7. <, >, ==, !=, <=, >=
Например,
a=12;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
43
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
if a>b
a=a+b;
else
a=a-b;
end
Операторы цикла вида
while <условное выражение>
<исполняемые операторы>
end
Допустимые виды условных выражений
9
<идентификатор><логический оператор><идентификатор>
<идентификатор><логический оператор><константа>
<константа><логический оператор><идентификатор>
10
Допустимые виды логических операторов:
1. <, >
2. <, >, ==
3. ==, !=
4. <=, >=
5. <, >, ==, !=
6. !=, <=, >=
7. <, >, ==, !=, <=, >=
Например,
while t<tk
t=t+h;
end
Операторы цикла вида
do
<исполняемые операторы>
while <условное выражение>
Допустимые виды условных выражений
<идентификатор><логический оператор><идентификатор>
<идентификатор><логический оператор><константа>
<константа><логический оператор><идентификатор>
Допустимые виды логических операторов:
1.
2.
3.
4.
5.
6.
7.
<, >
<, >, ==
==, !=
<=, >=
<, >, ==, !=
!=, <=, >=
<, >, ==, !=, <=, >=
Например,
while t<tk
t=t+h;
end
Примечание. Все варианты языка допускают использование комментариев вида:
% это комментарий до конца строки
a=123; % это комментарий после оператора
3.3. Выбор способа организации таблиц идентификаторов
Пусть, например, номер зачетной книжки 123458.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
44
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Выбор способа организации таблиц идентификаторов осуществляется по
таблице 2 на основе числа, составленного из трех последних цифр номера зачетной
книжки. В данном примере это 458.
Необходимо вычислить остаток от деления этого числа на количество
имеющихся вариантов, в данном случае на 8:
458 = 57 8 + 2;
Следовательно (остаток равен 2), таблица идентификаторов должна быть
организована как простой список.
Дополняем шифр задания на курсовую работу: 2.8.3.2
Таблица 3
Способы организации таблиц идентификаторов
Вариант
Способ организации таблиц
1.
Массив записей.
2.
Простой список.
3.
Упорядоченный список.
4.
Бинарное дерево.
5.
Хэш-адресация с рехэшированием.
6.
Хэш-адресация по методу цепочек.
7.
Комбинация хэш-адресации со списком.
8.
Комбинация хэш-адресации с бинарным деревом.
3.4. Выбор метода проведения синтаксического анализа
Выбор метода проведения синтаксического анализа осуществляется по таблице
3 на основе числа, составленного из трех последних цифр номера зачетной книжки.
В данном примере это 458.
Таблица 4
Методы проведения синтаксического анализа
Вариант
Метод синтаксического анализа
1.
Рекурсивный спуск с возвратами
2.
«Сдвиг-свёртка» с возвратами
3.
Рекурсивный спуск без возвратов
4.
«Сдвиг-свёртка» без возвратов
Необходимо вычислить остаток от деления этого числа на количество
имеющихся вариантов, в данном случае на 4:
458 = 114 4 + 2;
Следовательно (остаток равен 2), метод проведения синтаксического анализа «Сдвиг-свёртка» с возвратами.
Дополняем шифр задания на курсовую работу: 2.8.3.2.2
3.5. Выбор внутреннего представления программы
Выбор внутреннего представления программы осуществляется по таблице 4 на
основе числа, составленного из трех последних цифр номера зачетной книжки.
В данном примере это 458.
Необходимо вычислить остаток от деления этого числа на количество
имеющихся вариантов, в данном случае на 5:
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
45
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
458 = 91 5 + 3;
Следовательно (остаток равен 3), внутреннее представление программы многоадресный код с неявно именуемым результатом (триады).
Дополняем шифр задания на курсовую работу: 2.8.3.2.2.3
Вариант
1.
2.
3.
4.
5.
Таблица 5
Виды внутреннего представления программы
Вид внутреннего представления программы
Связные списочные структуры, представляющие синтаксические
деревья
многоадресный код с явно именуемым результатом (тетрады)
многоадресный код с неявно именуемым результатом (триады)
обратная (постфиксная) польская запись операций
ассемблерный код или машинные команды
3.6. Выбор функциональной задачи
Пусть также последние цифры номера зачетной книжки есть 458.
Количество вариантов задач равно 43.
Остаток от деления 458 на 43
458 = 43*10 + 8
Следовательно, решению подлежит функциональная задача № 8.
В задаче № 8 нет подвариантов.
Поэтому полный шифр задания на курсовую работу:
2.8.3.2.2.3.8
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
46
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Варианты функциональных задач
Задача 1. Интерполирование с помощью алгебраических многочленов Лагранжа
заданной пользователем функции (подварианты в таблице 6).
Задача 2. Интерполирование с помощью алгебраических многочленов Ньютона
заданной пользователем функции (подварианты в таблице 6).
Задача 3. Интерполирование с помощью тригонометрических многочленов заданной
пользователем функции (подварианты в таблице 6).
Таблица 6
Функции одной переменной
Вариант
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Функция
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
a
a
a
a
a
a
a
a
a
a
a
a
a
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
c * sin( d * x e )
c * cos( d * x e )
c * tg( d * x e )
c * ctg ( d * x e )
c * log 2 ( d * x e )
c * lg( d * x e )
c * ln( d * x e )
c * exp( d * x e )
c * arcsin( d * x e )
c * arccos( d * x e )
c * arctg ( d * x e )
c * arcctg ( d * x e )
c * sin( d * x ) g * cos( h * x )
f ( x ) a b * x c * x 2 d * x3
f ( x ) a b * x c * exp( d * x )* ( g * sin( h * x )
p * cos( q * x ))
Задача 4. Нахождение методом покоординатного спуска экстремума заданной
пользователем функции нескольких переменных (подварианты в таблице 7).
Задача 5. Нахождение методом наискорейшего спуска экстремума заданной
пользователем функции нескольких переменных (подварианты в таблице 7).
Таблица 7
Функции двух переменных
№
1 f ( x, y )
2
3
4
5
6
f ( x, y )
f ( x, y )
f ( x, y )
f ( x, y )
f ( x, y )
Функция
a
a
a
a
a
a
b* x
b* x
b* x
b* x
b* x
b* x
c* y
c* y
c* y
c* y
c* y
c* y
d * sin( g * x h * y )
d * cos( g * x h * y )
d * tg( g * x h * y )
d * ctg ( g * x h * y )
d * log 2 ( g * x h * y )
d * lg( g * x h * y )
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
47
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
7
8
9
10
11
12
13
f ( x, y )
f ( x, y )
f ( x, y )
f ( x, y )
f ( x, y )
f ( x, y )
f ( x, y )
a
a
a
a
a
a
a
b* x
b* x
b* x
b* x
b* x
b* x
b* x
c* y
c* y
c* y
c* y
c* y
c* y
c* y
d * ln( g * x h * y )
d * exp( g * x h * y )
d * arcsin( g * x h * y )
d * arccos( g * x h * y )
d * arctg ( g * x h * y )
d * arcctg ( g * x h * y )
d * sin( g * x h * y ) p * cos( q * x r * y )
14
f ( x , y ) a b * x c * y d * x 2 g * y 2 h * x3 p * y 3
15 f ( x ) a b * x c * y d * exp( g * x h * y )* ( p * sin( q * x r * y ) w * cos( s * x v * y ))
Задача 6. Решение методом Гаусса заданной пользователем системы линейных
алгебраических уравнений Ax b, x Rn , A Rn Rn ,b Rn .
Задача 7. Решение методом ортогонализации заданной пользователем системы
линейных алгебраических уравнений Ax b, x Rn , A Rn Rn ,b Rn .
Задача 8. Решение методом простой итерации заданной пользователем системы
линейных алгебраических уравнений Ax b, x Rn , A Rn Rn ,b Rn .
Задача 9. Решение методом Зейделя заданной пользователем системы линейных
алгебраических уравнений Ax b, x Rn , A Rn Rn ,b Rn .
Задача 10. Решение при помощи разбиения на клетки заданной пользователем системы
линейных алгебраических уравнений Ax b, x Rn , A Rn Rn ,b Rn .
Задача 11. Обращение матрицы A R n R n
Задача 12. Вычисление определителя матрицы A R n R n .
Задача 13. Решение методом итерации
пользователем (подварианты в таблице 8).
численных
уравнений
задаваемых
Задача 14. Решение методом Ньютона
пользователем (подварианты в таблице 8).
численных
уравнений
задаваемых
Задача 15. Решение методом, основанным на интерполировании функции численных
уравнений задаваемых пользователем (подварианты в таблице 8).
Задача 16. Решение методом, основанным на интерполировании обратной функции
численных уравнений задаваемых пользователем (подварианты в таблице 8).
Задача 17. Решение методом упрощения алгебраических уравнений путем выделения
множителей численных уравнений задаваемых пользователем (подварианты в таблице
8).
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
48
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Таблица 8
Уравнения с одной неизвестной
Вариант
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Уравнение
a
a
a
a
a
a
a
a
a
a
a
a
a
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
c * sin( d * x e ) 0
c * cos( d * x e ) 0
c * tg( d * x e ) 0
c * ctg ( d * x e ) 0
c * log 2 ( d * x e ) 0
c * lg( d * x e ) 0
c * ln( d * x e ) 0
c * exp( d * x e ) 0
c * arcsin( d * x e ) 0
c * arccos( d * x e ) 0
c * arctg ( d * x e ) 0
c * arcctg ( d * x e ) 0
c * sin( d * x ) g * cos( h * x ) 0
a b * x c * x 2 d * x3 0
a b * x c * exp( d * x )* ( g * sin( h * x )
p * cos( q * x )) 0
Задача 18. Численное интегрирование с помощью квадратурных формул с
равноотстоящими узлами подинтегральной функции, заданной пользователем (см.
подварианты в таблице 9).
Задача 19. Численное интегрирование с помощью формулы парабол подинтегральной
функции, заданной пользователем (см. подварианты в таблице 9).
Задача 20. Численное интегрирование с помощью формулы "трех восьмых"
подинтегральной функции, заданной пользователем (см. подварианты в таблице 9).
Задача 21. Численное интегрирование с помощью формулы трапеций подинтегральной
функции, заданной пользователем (см. подварианты в таблице 9).
Таблица 9
Функции одной переменной
Вариант
1
2
3
4
5
6
7
8
9
10
Функция
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
f(x)
a
a
a
a
a
a
a
a
a
a
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
b* x
c * sin( d * x e )
c * cos( d * x e )
c * tg( d * x e )
c * ctg ( d * x e )
c * log 2 ( d * x e )
c * lg( d * x e )
c * ln( d * x e )
c * exp( d * x e )
c * arcsin( d * x e )
c * arccos( d * x e )
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
49
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
11
12
13
14
15
f ( x ) a b * x c * arctg ( d * x e )
f ( x ) a b * x c * arcctg ( d * x e )
f ( x ) a b * x c * sin( d * x ) g * cos( h * x )
f ( x ) a b * x c * x 2 d * x3
f ( x ) a b * x c * exp( d * x )* ( g * sin( h * x )
p * cos( q * x ))
Задача 22. Решение методом Эйлера систем обыкновенных дифференциальных
уравнений вида x
Rn , f
dx / dt , при этом f ( t ) задаётся
0,t t0
аналитически (символьно) пользователем. Например, f ( t )
.
f ,t t0
Ax Cf ( t ), x
R , где x
Задача 23. Решение методом трапеций систем обыкновенных дифференциальных
уравнений вида x
Rn , f
dx / dt , при этом f ( t ) задаётся
0,t t0
аналитически (символьно) пользователем. Например, f ( t )
.
f ,t t0
Ax Cf ( t ), x
R , где x
Задача 24. Решение методом Эйлера систем обыкновенных дифференциальных
уравнений вида x Ax Bu( x ,t ), x R n ,u R m , где x dx / dt , при этом u( x ,t )
задаётся аналитически (символьно) пользователем. Например, u( x ,t ) Hx .
Задача 25. Решение методом трапеций систем обыкновенных дифференциальных
уравнений вида x Ax Bu( x ,t ), x R n ,u R m , где x dx / dt , при этом u( x ,t )
задаётся аналитически (символьно) пользователем. Например, u( x ,t ) Hx .
Задача 26. Решение методом Эйлера систем обыкновенных дифференциальных
уравнений вида x Ax Bu( x ,t ) Cf ( t ), x R n ,u R m , f R , где x dx / dt , при этом
u( x ,t ) и f ( t ) задаются аналитически (символьно) пользователем. Например,
0,t t0
u( x ,t ) Hx , f ( t )
.
f ,t t0
Задача 27. Решение методом трапеций систем обыкновенных дифференциальных
уравнений вида x Ax Bu( x ,t ) Cf ( t ), x R n ,u R m , f R , где x dx / dt , при этом
u( x ,t ) и f ( t ) задаются аналитически (символьно) пользователем. Например,
0,t t0
u( x ,t ) Hx , f ( t )
.
f ,t t0
Задача 28. Для заданной передаточной функции
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
50
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
m
W( j )
ai ( j ) i
i 0
n
, j
bi ( j )
1,
[
н,
к]
i
i 0
построить с равномерным шагом по
амплитудно-частотную характеристику
A(W ( j ))
Re(W ( j )) Im(W ( j ))
Re(W ( j )) - вещественная часть W ( j ) ,
Im(W ( j )) - мнимая часть W ( j ) .
где
и фазо-частотную характеристику
(W ( j )) arg(W ( j ))
Задача 29. Для заданной передаточной функции
m
W( j )
ai ( j ) i
i 0
n
, j
bi ( j )
1,
[
н,
к]
i
i 0
построить с логарифмическим шагом по
амплитудно-частотную характеристику
A(W ( j ))
Re(W ( j )) Im(W ( j ))
Re(W ( j )) - вещественная часть W ( j ) ,
Im(W ( j )) - мнимая часть W ( j ) .
где
и фазо-частотную характеристику
(W ( j )) arg(W ( j ))
Задача 30. Выполнить методом пузырьковой сортировки сортировку массива
x {a1 , a2 ,..., an } по указанию пользователем (по возрастанию или убыванию).
Задача
x
Выполнить методом сортировки выбором сортировку массива
{a1 , a2 ,..., an } по указанию пользователем (по возрастанию или убыванию).
Задача
x
31.
Выполнить методом сортировки слиянием сортировку массива
{a1 , a2 ,..., an } по указанию пользователем (по возрастанию или убыванию).
32.
Задача 33. Выполнить методом рекурсивной бинарной сортировки со слиянием
сортировку массива x {a1 , a2 ,..., an } по указанию пользователем (по возрастанию
или убыванию).
Задача
x
Выполнить методом быстрой сортировки сортировку массива
{a1 , a2 ,..., an } по указанию пользователем (по возрастанию или убыванию).
34.
Задача 35. Выполнить методом пирамидальной сортировки сортировку массива
x {a1 , a2 ,..., an } по указанию пользователем (по возрастанию или убыванию).
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
51
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
n
m
Задача 36. Вычисление ранга матрицы A R
R . Матрица может быть не
квадратной.
Ранг матрицы равен числу линейнонезависимых строк или столбцов.
Задача 37. Вычисление коэффициентов a
Rn Rn :
n
det( E A)
R n характеристического многочлена
матрицы A
an
n 1
1
... a1
a0
Задача 38. Для вектора, заданного своими координатами
x {a1 , a2 ,..., an }
вычислить евклидову норму
1/ 2
n
x
2
2
ai
i 1
Задача 39. Для вектора, заданного своими координатами
x {a1 , a2 ,..., an }
вычислить норму Гельдера p-го порядка
1/ p
n
x
p
p
ai
i 1
Задача 40. Для заданной матрицы A
{aij }, A R n R m вычислить норму
n
A1
max
1 j mi 1
aij
Задача 41. Для заданной матрицы A
{aij }, A R n R m вычислить норму
m
A
max
1 i n j 1
aij
Задача 42. Для заданной матрицы A
1/ 2
n m
A
E
aij
2
i 1j 1
Задача 43. Для заданной матрицы A
M ( A)
{aij }, A R n R m вычислить норму
{aij }, A R n R m вычислить норму
n m 1/ 2 max aij
i, j
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
52
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ЛИТЕРАТУРА
1. Алгоритмы и программы восстановления зависимостей / Под ред. В.Н.Вапника.М.: Гл. ред. физ.-мат. лит., 1984.- 816 с.
2. Ахо А., Сети Р., Ульман Дж. Компиляторы: принципы, технологии и инструменты:
Пер. с англ.- М.: Издательский дом "Вильямс", 2003.- 768 с.
3. Ахо А., Ульман Д.Д. Теория синтаксического анализа, перевода и компиляции. В 2
т.–М.: Мир, 1978.
4. Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. В 2х томах / Пер. с англ. Под ред. В.М.Курочкина. – М.: Мир, 1978.
5. Ахо А., Хопкрофт Дж., Ульман Д.Д. Построение и анализ вычислительных
алгоритмов. – М.: Мир, 1979. – 536 с.
6. Ахо А., Хопкрофт Дж., Ульман Д.Д. Структуры данных и алгоритмы. – М.: Мир,
2000. – 384 с.
7. Белоногов Г.Г., Кузнецов Б.А. Языковые средства автоматизированных
информационных систем.- М.: Наука. Гл. ред. физ.-мат. лит., 1983.- 288 с.
8. Буч Г. Объектно-ориентированный анализ и проектирование с примерами
приложений на С++, 2-е изд./Пер. с англ.- М.: "Издательство Бином", СПб.:
"Невский диалект", 1999 г. – 560 с., ил.
9. Васильев В.И. Распознающие системы: Справочник. Изд-е 2-е перераб. и доп.Киев: Наукова думка, 1983. – 422 с.
10. Вирт Н. Алгоритмы+структуры данных = программы.- М.: Мир, 1985.
11. Глушков В.М., Цейтлин Г.Е., Ющенко Е.Л. Методы символьной
мультиобработки.- Киев: Наук. думка, 1980. – 252 с.
12. Гордеев А.В. Операционные системы: Учебник для вузов. 2-е изд.- СПб.: Питер,
2004.- 416 с.
13. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение.- СПб.: Питер,
2002.- 734 с.
14. Грис Д. Конструирование компиляторов для цифровых вычислительных машин.М.: Мир, 1978.
15. Дал У., Дейкстра Э., Хоор К. Структурное программирование.- М.: Мир, 1975.
16. Камке Э. Справочник по обыкновенным дифференциальным уравнениям / Пер. с
нем. С.В.Фомина.- М.: Наука. Гл. ред. физ.-мат. лит., 1976.- 576 с. с илл.
17. Керниган Б., Пайк Р. Практика программирования. - М.: Издательский дом
"Вильямс", 2004.
18. Кнут Д. Искусство программирования для ЭВМ. В 3 т. – М.: Мир, 1976.
19. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. – М.:
МЦНМО, 2001.
20. Крылов В.И. Бобков В.В., Монастырский П.И. Вычислительные методы. В 2 т. Т.
1.- М.: Наука. Гл. ред. физ.-мат. лит., 1976.- 304 с.
21. Крылов В.И. Бобков В.В., Монастырский П.И. Вычислительные методы. В 2 т. Т.
2.- М.: Наука. Гл. ред. физ.-мат. лит., 1977.- 400 с.
22. Лисков Б., Гатек Дж. Использование абстракций и спецификаций при разработке
программ / Пер. с англ. – М.: Мир, 1989. – 424 с.
23. Молчанов А.Ю. Системное программное обеспечение. Лабораторный практикум.СПб.: Питер, 2005. – 284 с.
24. Молчанов А.Ю. Системное программное обеспечение: Учебник для вузов.- СПб.:
Питер, 2006. – 396 с.
25. Новоженов Ю.В. Объектно-ориентированные технологии разработки сложных
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
53
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
программных систем / Под ред. Е.Г.Ойхмана.- М., 1996.- 112 с.
26. Окулов С.М. Программирование в алгоритмах. – М.: БИНОМ. Лаборатория
знаний, 2004. – 341 с.
27. Олифер В.Г., Олифер Н.А. Сетевые операционные системы.- СПб.: Питер, 2002.544 с.
28. Попов Э.В. Общение с ЭВМ на естественном языке. – М.: Наука. Гл. ред. физ.-мат.
лит., 1982. – 320 с.
29. Порублев И.Н., Ставровский А.Б. Алгоритмы и программы. Решение олимпиадных
задач.- М.: ООО «И.Д. Вильямс», 2007. – 480 с.
30. Романец Ю.В., Тимофеева П.А., Шаньгина В.Ф. Защита информации в
компьютерных системах и сетях.- М.: Радио и связь, 2001.
31. Романовский П.И. Ряды Фурье. Теория поля. Аналитические и специальные
функции. Преобразование Лапласа. - М.: Наука. Гл. ред. физ.-мат. лит., 1973.- 336
с.
32. Седжвик Р. Алгоритмы на С++. Анализ, структуры данных, сортировка, поиск,
алгоритмы на графах.- М.: ООО «И.Д. Вильямс», 2002.
33. Теоретические основы компьютерной безопасности: Учеб. пособие для вузов /
П.Н.Девянин, О.О.Михальский, Д.И.Правиков и др. - М.: Радио и связь, 2000. - 192
с.
34. Хантер Р. Проектирование и конструирование компиляторов.- М.: Финансы и
статистика, 1984.
35. Чмора А.Л. Современная прикладная криптография. 2-е изд., стер. - М.: Гелиос
АРВ, 2002. - 256 с.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
54
М.Ф.Степанов
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ОГЛАВЛЕНИЕ
Введение .................................................................................................................................... 2
1. Задание на выполнение курсовой работы .......................................................................... 2
2. Методика выполнения работы ............................................................................................ 4
2.1. Разработка алгоритма решения функциональной задачи ......................................... 4
2.2. Разработка контрольного примера функциональной задачи для проверки
работоспособности функционального программного модуля и его решение
средствами системы МАТЛАБ ........................................................................................... 5
2.3. Разработка функционального программного модуля ............................................... 6
2.3. Разработка тестового приложения для проверки работоспособности
функционального программного модуля и решение контрольного примера
функциональной задачи ...................................................................................................... 7
2.6. Разработка средств идентификации и аутентификации пользователя,
криптографической защиты информации ....................................................................... 10
2.7. Разработка входного языка для постановки функциональных задач
пользователем .................................................................................................................... 11
2.8. Разработка лексического анализатора входного языка .......................................... 14
2.9. Разработка синтаксического анализатора входного языка для постановки
функциональных задач пользователем ........................................................................... 19
2.10. Разработка генератора выходного представления ................................................ 38
2.11. Подготовка пояснительной записки ....................................................................... 39
2.12. Использование инструментальных средств разработки программного
обеспечения ........................................................................................................................ 40
3. Варианты индивидуальных заданий ................................................................................ 41
3.1. Выбор вида криптографической защиты ................................................................. 41
3.2. Выбор вида входного языка ...................................................................................... 41
3.3. Выбор способа организации таблиц идентификаторов .......................................... 44
3.4. Выбор метода проведения синтаксического анализа ............................................. 45
3.5. Выбор внутреннего представления программы ...................................................... 45
ЛИТЕРАТУРА ........................................................................................................................ 53
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
55
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы
по дисциплине
Системное программное обеспечение
для студентов 27.03.04
("Управление в технических системах")
Составил
Михаил Федорович СТЕПАНОВ
Рецензент
Ю.К. Тимофеев
Редактор
З.И. Шевченко
Лицензия ИД № 06268 от 14.11.2001
Подписано в печать 01.12.2016
Формат 60 х 84 1-24
Бум. тип.
Усл.-печ. л. 2,0
Уч.-изд. л. 2,0
Тираж 100 экз.
Заказ
Саратовский государственный технический университет
410054, г. Саратов, ул. Политехническая, 77
Копипринтер СГТУ, 410054, г. Саратов, ул. Политехническая, 77
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
56
М.Ф.Степанов
Download