методические указания для выполнения лабораторных работ / lab04 / SSW_w04
.pdfРазработка входного языка постановки функциональной задачи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Если встречаются правила вида
А → В или
А → γ,
то они переносятся во множество правил Р' грамматики G' без изменений. Шаг 3. Просматривается множество правил Р' грамматики G'. В нем
ищутся правила вида А → В или вида А → λ.
Если находится правило вида А → В, то просматривается множество правил Р' грамматики G'. Если в нем присутствуют правила вида
В→ С,
В→ Са,
В → а или
В → λ,
то в него добавляются правила вида
А→ С,
А→ Са,
А → а |
и |
А → λ |
|
соответственно, A,B,C VN', a VT (при этом следует учитывать, что в грамматике не должно быть совпадающих правил, и если какое-то правило уже присутствует в грамматике G', то повторно его туда добавлять не следует). Правило А → В удаляется из множества правил Р'.
Если находится правило вида А → λ (и символ А не является целевым символом S), то просматривается множество правил P' грамматики G'. Если в нем присутствуют правила вида
В → А или
В → Аа,
то в него добавляются правила вида
В → λ и
В → а
соответственно, A,B VN', a VT' (при этом следует учитывать, что в грамматике не должно быть совпадающих правил, и если какое-то правило уже присутствует в грамматике G', то повторно его туда добавлять не следует). Правило А → λ удаляется из множества правил Р'.
Шаг 4. Если на шаге 3 было найдено хотя бы одно правило вида
А → В или
А → λ
во множестве правил Р' грамматики G', то надо повторить шаг 3, иначе перейти к шагу 5.
Шаг 5. Целевым символом S' грамматики G' становится символ S. Шаги 3 и 4 алгоритма, в принципе, можно не выполнять, если грам-
матика не содержит правил, вида
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению лабораторной работы |
11 |
|
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
А → В (такие правила называются цепными) или А → λ (такие правила называются λ-правилами).
Реальные регулярные грамматики обычно не содержат правил такого вида. Тогда алгоритм преобразования грамматики к автоматному виду, существенно упрощается. Кроме того, эти правила можно было бы устранить предварительно с помощью специальных алгоритмов преобразования (эти алгоритмы рассмотрены дальше, в главе «Синтаксические анализато-
ры»).
Преобразование регулярной грамматики к автоматному виду
Рассмотрим в качестве примера следующую простейшую регулярную грамматику:
G({"a","(","*",")","{","}"},{S,C,K},P,S)
(символы a,(,*,),{,} из множества терминальных символов грамматики взяты в кавычки, чтобы выделить их среди фигурных скобок, обозначающих само множество):
Р:
S → С*) | К}
С → (* | Са | С{ | С} | С( | С* | С) К → { | Ка | К( | К* | К) | К{
Если предположить, что а здесь — это любой алфавитно-цифровой символ, кроме символов (, *, ), {, }, то эта грамматика описывает два типа комментариев, допустимых в языке программирования Borland Pascal. Преобразуем ее в автоматный вид.
Шаг 1. Построим множество VN' = {S, С, К}.
Шаг 2. Начинаем просматривать множество правил Р грамматики G. Для правила
S → С*)
во множество VN' включаем символ S', а само правило разбиваем на два:
S → S1) и
S1 → С*;
включаем эти правила во множество правил Р'. Правило
S → К}
переносим во множество правил Р' без изменений. Для правила
С → (*
во множество VN' включаем символ С1, а само правило разбиваем на два:
С → С1* |
и |
С1 → (; |
|
включаем эти два правила во множество правил Р'. Правила
С → Са | С{ | С} | С( | С* | С)
переносим во множество правил Р' без изменений.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
12 |
М.Ф.Степанов |
Разработка входного языка постановки функциональной задачи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Правила
К → { | Ка | К( | К* | К) | К{
переносим во множество правил Р' без изменений. Шаг 3. Правил вида
А→В или
А→λ,
во множестве правил Р' не содержится. Шаг 4. Переходим к шагу 5.
Шаг 5. Целевым символом грамматики G' становится символ S. В итоге получаем автоматную грамматику:
G'( {"a","(","*",")","{","}"} , {S,S1,C,C1,K},P',S):
Р':
S → S1) | К} S1 → С*
С → С1* | Са | C{ | C} | C( | C* | C) C1 → (
K → { | Ka | K( | K* | K) | K{
Эта грамматика, так же как и рассмотренная выше, описывает два типа комментариев, допустимых в языке программирования Borland Pascal.
2. МЕТОДИКА РАБОТЫ
Проведение работы требует соответствующих:
¾технического обеспечения, в роли которого выступает рабочая станция компьютерной сети кафедры;
¾программного обеспечения, в роли которого выступает C++ Builder;
¾исходных данных, в роли которых выступает созданное в ходе выполнения предыдущей лабораторной работы приложение, решающее заданную функциональную задачу обработки данных, используя вызываемый из библиотеки динамической загрузки функциональный программный модуль в отдельном потоке команд (нити).
Содержание учебной части работы составляют:
¾разработка входного языка для текстового представления постановки функциональной задачи;
¾разработка функции, осуществляющей формирование текстового представления постановки задачи на входном языке, используя исходные данные задачи, указанные пользователем на экранной форме приложения;
¾разработка грамматики входного языка;
Изложение методики выполнения работы проводится на конкретном примере.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению лабораторной работы |
13 |
|
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Рассмотрим процесс разработки системы обработки информации, функциональной задачей которой является решение дифференциального уравнения вида
x = Ax , x R |
n |
, A R |
n |
×R |
n |
|
& |
x(t0 ) = x0 |
|
|
|
||
при начальных условиях |
|
|
|
|||
на временном отрезке |
t [t0 ,tk ]. |
|
|
|
||
2.1.Разработка входного языка для постановки функциональных задач пользователем
Исходными данными в данной задаче являются параметры дифференциального уравнения (матрица 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;
Семантика обозначений переменных здесь задана в соответствии с функциональной задачей.
2.2.Построение и исследование грамматики входного языка
Анализ входного языка включает несколько этапов:
лексический анализ,
синтаксический анализ,
семантический анализ,
подготовка к генерации,
генерация выходного текста.
На каждом из перечисленных этапов используется различная информация о входном языке, а поэтому его описание на различных этапах анализа может быть различным: наиболее упрощенное на этапе лексического анализа и более полное на следующих этапах. Наиболее строго и формально язык можно описать с помощью грамматики.
Для этапа лексического анализа разработаем правоассоциативную регулярную грамматику, правила которой имеют вид S::=t|tN, t VT,
S,N VN.
В нашем примере язык содержит 5 типов предложений, которые могут следовать в заданном порядке. Элементы массивов являются действи-
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
14 |
М.Ф.Степанов |
Разработка входного языка постановки функциональной задачи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
тельными числами со знаком. В учебных целях, для простоты, полагаем, что действительные числа представляются в формате с фиксированной точкой (запятой). При этом дробная часть может быть опущена вместе с разделительной точной (запятой). Знак "+" (плюс) может быть опущен. В этом случае считается, что число положительное. Элементы массивов перечисляются через пробел по строкам, которые разделяются точкой с запятой.
Данный язык может быть задан, например, грамматикой
G1(VT,VN,P, <задача>),
где <задача> - начальный символ грамматики,
VT = {n|A|x|t|k|h|0|1|2|3|4|5|6|7|8|9|.|+|-|[|]|;|,|=| } – словарь терминаль-
ных символов, где " " – обозначает пробел,
VN = {<задача> | <размерность> | <значение размерности> | <матрица А> | <элементы матрицы А> | <все элементы матрицы А> | <элемент матрицы А> | <дробь элемента матрицы А> | <x0> | <все элементы x0> | <элемент x0> | <дробь элемента x0> | <t0> | <значение t0> | <дробь значения t0> | <tk> | <значение tk> | <дробь значения tk> | <h> | <значение h> | <дробь значения h> | <остаток задачи1> |<остаток задачи2> | <остаток задачи3> | <остаток задачи4> | <остаток задачи5> | <остаток задачи6> | <остаток задачи7> | <остаток задачи8> | <остаток задачи9> | <остаток задачи10> | <остаток задачи11> | <остаток задачи12> | <остаток задачи13> | <остаток задачи14> | <Успех>} – словарь нетерминальных символов,
P – правила подстановки:
<задача>::=n<размерность> <размерность>::= =<значение размерности>
<значение размерности>::=0<значение размерности> | 1<значение размерности> | 2<значение размерности> | 3<значение размерности> | 4<значение размерности> | 5<значение размерности> | 6<значение размерности> | 7<значение размерности> | 8<значение размерности> | 9<значение размерности> | ;<остаток задачи1>
<остаток задачи1>::=A<матрица А> | '\r'<остаток задачи1> | '\n'<остаток задачи1>
<матрица А>::= =<элементы матрицы А> <элементы матрицы А>::=[<строка элементов матрицы А>
<строка элементов матрицы А>::= <элемент матрицы А> | -<элемент матрицы А> | +<элемент матрицы А> | 0<элемент матрицы А> | 1<элемент матрицы А> | 2<элемент матрицы А> | 3<элемент матрицы А> | 4<элемент матрицы А> | 5<элемент матрицы А> | 6<элемент матрицы А> | 7<элемент матрицы А> | 8<элемент матрицы А> | 9<элемент матрицы А> | ;<строка элементов матрицы А> | ]<остаток задачи2>
<элемент матрицы А>::= 0<элемент матрицы А> | 1<элемент матрицы А> | 2<элемент матрицы А> | 3<элемент матрицы А> | 4<элемент матрицы А> | 5<элемент матрицы А> | 6<элемент матрицы А> | 7<элемент матрицы А> | 8<элемент матрицы А> | 9<элемент матрицы А> |.<дробь элемента
матрицы А> |,<дробь элемента матрицы А> | <строка элементов
матрицы А> | ;<строка элементов матрицы А> | ]<остаток задачи2> <дробь элемента матрицы А> ::= 0<дробь элемента матрицы А> | 1<дробь
элемента матрицы А> | 2<дробь элемента матрицы А> | 3<дробь
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению лабораторной работы |
15 |
|
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
элемента матрицы А> | 4<дробь элемента матрицы А> | 5<дробь элемента матрицы А> | 6<дробь элемента матрицы А> | 7<дробь элемента матрицы А> | 8<дробь элемента матрицы А> | 9<дробь элемента матрицы А> | -<элемент матрицы А> | +<элемент матрицы А>
| ;<строка элементов матрицы А> | <строка элементов матрицы А> |
]<остаток задачи2> <остаток задачи2>::=;<остаток задачи3>
<остаток задачи3>::=x<остаток задачи4> <остаток задачи4>::=0<остаток задачи5> <остаток задачи5>::= =<x0> <x0>::=[<строка элементов x0>
<строка элементов x0>::= <элемент x0> | -<элемент x0> | +<элемент x0> | 0<элемент x0> | 1<элемент x0> | 2<элемент x0> | 3<элемент x0> | 4<элемент x0> | 5<элемент x0> | 6<элемент x0> | 7<элемент x0> | 8<элемент x0> | 9<элемент x0> | ;<все элементы x0> | ]<остаток задачи 6>
<элемент x0>::= 0<элемент x0> | 1<элемент x0> | 2<элемент x0> | 3<элемент x0> | 4<элемент x0> | 5<элемент x0> | 6<элемент x0> | 7<элемент x0> | 8<элемент x0> | 9<элемент x0> | .<дробь элемента
x0> | ,<дробь элемента x0> | <строка элементов x0> | ;<строка
элементов x0> | ]<остаток задачи 6>
<дробь элемента x0>::=0<дробь элемента x0> | 1<дробь элемента x0> | 2<дробь элемента x0> | 3<дробь элемента x0> | 4<дробь элемента x0> | 5<дробь элемента x0> | 6<дробь элемента x0> | 7<дробь элемента x0> | 8<дробь элемента x0> | 9<дробь элемента x0> | -<элемент x0>
| +<элемент x0> | <строка элементов x0> | ;<строка элементов x0>
| ]<остаток задачи 6> <остаток задачи 6>::=;<остаток задачи 7>
<остаток задачи 7>::=t<остаток задачи 8> <остаток задачи 8>::=0<остаток задачи 9> <остаток задачи 9>::= =<t0>
<t0>::= <значение t0> | -<значение t0> | +<значение t0> |
0<значение t0> | 1<значение t0> | 2<значение t0> | 3<значение t0> | 4<значение t0> | 5<значение t0> | 6<значение t0> | 7<значение t0> | 8<значение t0> | 9<значение t0>
<значение t0>::= <значение t0> | 0<значение t0> | 1<значение t0> |
2<значение t0> | 3<значение t0> | 4<значение t0> | 5<значение t0> | 6<значение t0> | 7<значение t0> | 8<значение t0> | 9<значение t0> | .<дробь значения t0> | ,<дробь значения t0> | ;<остаток задачи 10>
<дробь значения t0> ::= 0<дробь значения t0> | 1<дробь значения t0> | 2<дробь значения t0> | 3<дробь значения t0> | 4<дробь значения t0> | 5<дробь значения t0> | 6<дробь значения t0> | 7<дробь значения t0> | 8<дробь значения t0> | 9<дробь значения t0> | ;<остаток задачи 10>
<остаток задачи 10>::=t<остаток задачи 11> <остаток задачи 11>::=k<остаток задачи 12> <остаток задачи 12>::= =<tk>
<tk>::= <значение tk> | -<значение tk> | +<значение tk> |
0<значение tk> | 1<значение tk> | 2<значение tk> | 3<значение tk> | 4<значение tk> | 5<значение tk> | 6<значение tk> | 7<значение tk> | 8<значение tk> | 9<значение tk>
<значение tk>::= <значение tk> | 0<значение tk> | 1<значение tk>
| 2<значение tk> | 3<значение tk> | 4<значение tk> | 5<значение tk> | 6<значение tk> | 7<значение tk>
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
16 |
М.Ф.Степанов |
Разработка входного языка постановки функциональной задачи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
| 8<значение tk> | 9<значение tk> | .<дробь значения tk> | ,<дробь значения tk> | ;<остаток задачи 13>
<дробь значения tk> ::= 0<дробь значения tk> | 1<дробь значения tk> | 2<дробь значения tk> | 3<дробь значения tk>
| 4<дробь значения tk> | 5<дробь значения tk> | 6<дробь значения tk> | 7<дробь значения tk> | 8<дробь значения tk> | 9<дробь значения tk> | ;<остаток задачи 13>
<остаток задачи 13>::=h<остаток задачи 14> <остаток задачи 14>::= =<h>
<h>::= <значение h> | -<значение h> | +<значение h> | 0<значение h>
| 1<значение h> | 2<значение h> | 3<значение h> | 4<значение h> | 5<значение h> | 6<значение h> | 7<значение h> | 8<значение h> | 9<значение h>
<значение h>::= <значение h> | 0<значение h> | 1<значение h>
| 2<значение h> | 3<значение h> | 4<значение h> | 5<значение h> | 6<значение h> | 7<значение h> | 8<значение h> | 9<значение h> | .<дробь значения h> | ,<дробь значения h> | ;<Успех>
<дробь значения h> ::= 0<дробь значения h> | 1<дробь значения h>
| 2<дробь значения h> | 3<дробь значения h> | 4<дробь значения h> | 5<дробь значения h> | 6<дробь значения h> | 7<дробь значения h> | 8<дробь значения h> | 9<дробь значения h> | ;<Успех>
Анализ построенной грамматики показывает, что все правила подстановки имеют вид
S::=t|tN, t VT, S,N VN,
а, следовательно, удовлетворяют требованиям, предъявляемым к грамматикам 3-го типа, т.е. грамматика относится к типу регулярных грамматик.
2.4.Формирование текстового представления постановки задачи
Модифицируем тестовое приложение TaskSolve, использующее функциональный программный модуль, введя формирование текстового представления постановки задачи на основе визуального представления, заданного пользователем на экранной форме. Для этого на экранную форму добавим страницу «Постановка задачи» и разместим на ней Memo- поле, назвав его, например, TaskTextMemo, в которое и будем записывать текстовое представление постановки задачи.
Объявим в разделе private: класса TFormTaskSolve экранной формы приложения переменную для хранения текстового представления постановки задачи:
String sTaskText;
Разработаем в классе TFormTaskSolve экранной формы тестового приложения функцию setTextTask(), осуществляющую формирование текстового представления постановки задачи на основании данных, заданных пользователем в полях экранной формы. Исходный программный код функции setTextTask()для рассматриваемого примера приведен на листинге 1.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению лабораторной работы |
17 |
|
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Листинг 1. Функция setTextTask(), осуществляющая формирование текстового представления постановки задачи на основании данных, заданных пользователем в полях экранной формы (файл TFormTaskSolve.cpp)
char* TFormTaskSolve::setTextTask()
{
// формирование текстового представления постановки задачи int n = nCSpinEdit->Value;
sTaskText = "n=";
sTaskText += nCSpinEdit->Text; sTaskText += ";\r\n"; sTaskText += "A=[";
for (int i=0; i<n; i++) { for (int j=0; j<n; j++) {
sTaskText += A_StringGrid->Cells[j+1][i+1]; sTaskText += " ";
}
if (i < n-1) sTaskText += ";";
}
sTaskText += "];\r\n"; sTaskText += "x0=[";
for (int i=0; i<n; i++) {
sTaskText += x0_StringGrid->Cells[1][i+1]; if (i < n-1)
sTaskText += ";";
}
sTaskText += "];\r\n"; sTaskText += "t0="; sTaskText += t0Edit->Text; sTaskText += ";\r\n"; sTaskText += "tk="; sTaskText += tkEdit->Text; sTaskText += ";\r\n"; sTaskText += "h="; sTaskText += hEdit->Text; sTaskText += ";\r\n"; return sTaskText.c_str();
}
Для отображения текстового представления постановки функциональной задачи на экранной форме тестового приложения разработаем функцию viewTextTask(), исходный текст которой приведен на листинге 2.
Листинг 2. Функция viewTextTask() (файл TFormTaskSolve.cpp)
void TFormTaskSolve::viewTextTask()
{ // отображение текстового представления постановки задачи
TaskTextTabSheet->TabVisible = true; TaskTextMemo->Visible = true; TaskTextMemo->Lines->Text = sTaskText;
}
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
18 |
М.Ф.Степанов |
Разработка входного языка постановки функциональной задачи
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Поскольку функции setTextTask() и viewTextTask() разра-
ботаны «вручную», то их объявление в заголовочном файле TFormTaskSolve.h также придется осуществить «вручную», как показано на листинге 3.
Листинг 3. Объявление функций setTextTask() и viewTextTask() в разделе private: заголовочного файла класса TFormTaskSolve экранной формы приложения (файл TFormTaskSolve.h)
char* setTextTask(); void viewTextTask();
Теперь необходимо дополнить исходный код функций , осуществляющих решение функциональной задачи, как в основном протоке команд, так и в дополнительном, вызовом функций setTextTask() и
viewTextTask().
Модифицированный исходный программный код соответствующих функций приведен на листингах 4 и 5. Изменения отмечены красным цветом.
Листинг 4. Модифицированный исходный программный код функции обработки щелчка на кнопке «Решение задачи» (решение задачи в основном потоке команд) (файл TFormTaskSolve.h)
void __fastcall TFormTaskSolve::SolveBitBtnClick(TObject *Sender)
{
LexTabSheet->TabVisible = false; TaskResultTabSheet->TabVisible = false; TaskTextTabSheet->TabVisible = false; TaskTextMemo->Visible = false; startSolveTime = GetTickCount(); RunProgressBar->Visible = true; RunProgressBar->Position = 0; RunProgressBar->Brush->Color = clRed;
RunProgressBar->StepIt(); |
// формирование текстового |
|
sTaskText = setTextTask(); |
||
RunProgressBar->StepIt(); |
// представления постановки задачи |
|
viewTextTask(); |
// формирование постановки задачи |
|
setTask(&tsk); |
||
RunProgressBar->StepIt(); |
// решение задачи |
|
int iRet = solveTask(&tsk); |
||
RunProgressBar->StepIt(); |
|
|
if (iRet == 0) |
{ |
|
viewResultSolveTask(); RunProgressBar->StepIt();
}
RunProgressBar->Visible = false; endSolveTime = GetTickCount();
int iSolveTime = endSolveTime - startSolveTime; TimeSolveEdit->Text = iSolveTime;
}
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению лабораторной работы |
19 |
|
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Листинг 5. Модифицированный исходный программный код функции обработки щелчка на кнопке Start (решение задачи в дополнительном потоке команд) (файл TFormTaskSolve.h)
void __fastcall TFormTaskSolve::StartSolveBitBtnClick(TObject *Sender)
{
setTask(&tsk); |
// формирование постановки задачи |
|
if (tsk != NULL) { |
|
= false; |
StartSolveBitBtn->Visible |
||
startSolveTime = GetTickCount(); |
||
RunProgressBar->Visible = |
true; |
|
RunProgressBar->Position = 0;
RunProgressBar->Brush->Color = clGreen;
RunProgressBar->Repaint();
RunProgressBar->StepIt();
sTaskText = setTextTask(); // формирование постановки задачи
RunProgressBar->StepIt(); viewTextTask();
RunProgressBar->StepIt(); if (pSolveThread == NULL) {
pSolveThread = new TSolveThread(RunProgressBar); pSolveThread->OnTerminate = SolveThreadDone; // вызывается по
// окончании
pSolveThread->ppTask = &tsk; pSolveThread->Resume(); StopSolveBitBtn->Visible = true; CancelSolveBitBtn->Visible = true;
}
}
}
На рисунках 1 - 2 приведены экранные формы с исходными данными функциональной задачи и сформированным её текстовым представлением.
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
20 |
М.Ф.Степанов |
