- •Лекция на тему Внутреннее проектирование и разработка программных средств.
- •3.1. Табличный вариант модели предметной области
- •1. Определение пакета прикладных программ.
- •2.Составные части ппп.
- •3. Модель предметной области.
- •3.1. Табличный вариант модели предметной области
- •3.2. Граф предметной области.
- •4. Использование теории формальных грамматик, для описания встроенного языка пакета прикладных программ.
- •5. Конструирование управляющей программы ппп.
- •5.1 Модуль лексического разбора.
- •5.2 Модуль синтаксического анализа
- •5.3 Модуль управления
- •5.4 Информатор
5.2 Модуль синтаксического анализа
Модуль синтаксического анализа осуществляет проверку грамматической правильности ПВЯ посредством анализа управляющего вектора.
В зависимости от поставленной задачи блок синтаксического анализа обеспечивает следующие действия:
во-первых, контролирует соответствие управляющего вектора графу предметной области;
во-вторых, обеспечивает использование аппарата умолчания;
в-третьих, обеспечивает использование макрокоманд.
Контроль соответствия управляющего вектора графу предметной области позволяет выявить следующие ошибки в программе на входном языке:
Во-первых, управляющий вектор не содержит начальных этапов обработки информации;
Во-вторых, управляющий вектор не содержит завершающих этапов обработки информации (незавершенная программа);
В-третьих, в управляющем векторе пропущены промежуточные этапы;
В-четвертых, управляющий вектор содержит дублирующие участки;
В-пятых, в управляющем векторе содержится сочетание различных ошибок.
В соответствии со спецификацией на модуль синтаксического анализа могут реализовываться различные варианты обработки ошибочных ситуаций и формирования кодов возврата.
Пример проверки соответствия управляющего вектора графу предметной области:
N_VER=1
YV GPO
1 1 - 2
3 1 / 2
5 2 - 3
7 2 / 3
3 - 4
3 / 4
4 - 5 K_VER = 5
Процедура, реализующая модуль синтаксического анализа, имеет следующий вид:
Procedure San ( YV: T_YV; Ksl: Integer; Var Tinf: TypeTinf) ;
{Блок синтаксического анализа}
Var
GPO: Array[1..7,1..2] of Integer; {Граф предметной области}
N_VER: Integer;{Номер начальной вершины}
K_VER: Integer;{Номер конечной вершины}
I: Integer;
Begin
With Tinf Do
Begin
PB:= 2;
Kv:= 0;
{Загрузка ГПО}
GPO[1,1]:= 1; GPO[1,2]:= 2;
GPO[2,1]:= 1; GPO[2,2]:= 2;
GPO[3,1]:= 2; GPO[3,2]:= 3;
GPO[4,1]:= 2; GPO[4,2]:= 3;
GPO[5,1]:= 3; GPO[5,2]:= 4;
GPO[6,1]:= 3; GPO[6,2]:= 4;
GPO[7,1]:= 4; GPO[7,2]:= 5;
N_VER:= 1;
K_VER:= 5;
I:=1;
WHILE (I<=KSL) and (KV=0) Do
Begin
If GPO[ YV[I], 1] = N_VER
Then N_VER:= GPO[ YV[I], 2]
Else Kv:= 8;
I:= I+ 1;
END;
If (N_VER<>K_VER) AND (KV=0) Then KV:= 16;
End; {WITH}
End;
Использование аппарата умолчания позволяет обеспечить замену недостающих участков управляющего вектора заранее обговоренными участками. Аппарат умолчания может быть реализован различными вариантами, в частности:
Во-первых, вставкой в управляющий вектор одиночного недостающего элемента;
Во-вторых, вставкой в управляющий вектор совокупности недостающих элементов.
Для вставки одиночного элемента достаточно просмотреть граф предметной области и найти дугу (первую из допустимых), обеспечивающую исправление управляющего вектора.
Пример использования аппарата умолчания для одиночного недостающего элемента:
YV GPO
1 1 - 2
1 . 2
(3) 2 …. 3
2 . 3
5 3 - 4
3 / 4
7 4 - 5
Недостающий элемент, т.е. код 3, определяющий дугу, соединяющую вторую и третью вершину, вставляется в управляющий вектор.
Для решения задачи может быть использована следующая совокупность команд:
{фрагмент программного кода}
If GPO [ YV [ I ] , 1 ] = N_VER
Then N_VER := GPO [ YV [ I ], 2 ]
Else
Begin
{Ошибка в управляющем векторе}
J:= 1; KeyD:= False;
While (J <= 7) And (KeyD = False) Do
Begin
If (N_Ver = GPO[J,1]) And
(GPO[YV[I],1] = GPO[J,2]) Then
{Найдена дуга, которая позволяет
исправить управляющий вектор}
Begin
For K:= Ksl DownTo I Do
YV[K+1]:=YV[K];
{Модификация управляющего вектора}
YV[I]:=J; KeyD :=True;
N_VER:= GPO[ YV[I], 2 ];
KSL := KSL +1;
End
Else
J:=J+1;
End; {While J}
If KeyD = False Then
{Управляющий вектор исправить не удалось}
Kv:= 8;
End;{If}
I:= I+ 1 ;
End; {While I}
If (N_VER <> K_VER) AND (KV = 0) Then
Begin
{ Незавершенная программа на входном языке пакета}
J:= 1; KeyD:= False;
While (J <= 7) And (KeyD = False) Do
Begin
If (N_Ver=GPO[J,1]) And
(K_Ver = GPO[J,2]) Then
{Найдена дуга, которая позволяет
исправить управляющий вектор}
Begin
KSL := KSL +1;
Yv[KSL]:=J;
KeyD:= True;
End
Else
J:=J+1;
End; {While J}
If KeyD = False Then
{Управляющий вектор исправить не удалось}
KV:= 16 ;
End;
End; {WITH}
End;
В частном случае, при упорядоченной нумерации дуг, для исправления незавершенной программы, возможно вместо поиска дуги проверять последний элемент графа предметной области. В этом случае, можно использовать конструкцию следующего вида:
If N_Ver = GPO [7,1] Then
Однако данный подход не применим, если имеется дуга, обеспечивающая альтернативный переход к последней вершине, из какой-либо другой вершины, кроме предпоследней вершины.
Вставка совокупности элементов, как правило, предусматривает использование специальных алгоритмов поиска пути между различными узлами сети.
Использование макрокоманд позволяет сократить запись программы на входном языке, благодаря замене одной команды (макрокоманды) несколькими командами (макрорасширением).
Для реализации макрокоманд могут быть использованы различные варианты, в частности, двумерный числовой массив, содержащий три столбца и требуемое количество строк.
Например, дана следующая таблица
Макрокоманда |
Макрорасширение первая составляющая |
Макрорасширение вторая составляющая |
50 |
1 |
40 |
40 |
30 |
7 |
30 |
3 |
5 |
Применение данной таблицы позволит сформировать на основе макрокоманды с кодом 50 следующий управляющий вектор:
1
1 3
1 30 5
50
40 7 7
Фрагмент программы, обеспечивающий реализацию макрокоманд, имеет следующий вид:
Procedure San ( Var YV: T_YV; Var Ksl: Integer; Var Tinf: TypeTinf) ;
{Вариант модуля синтаксического анализа
с использованием макрокоманд}
Var
GPO: Array[1..7,1..2] of Integer; {Граф предметной области}
N_VER: Integer;{Номер начальной вершины}
K_VER: Integer;{Номер конечной вершины}
I: Integer;
{Описание таблицы макрокоманд}
Macro_C: Array [1..30,1..3] Of Integer;
Nmac: Integer; {Количество строк в таблице макрокоманд}
KeyD: Boolean;
Begin
With Tinf Do
Begin
PB:= 2;
Kv:= 0;
Nmac:=3;
Macro_C[1,1]:= 50; Macro_C[1,2]:=1; Macro_C[1,3]:=40;
Macro_C[2,1]:= 40; Macro_C[2,2]:=30; Macro_C[2,3]:=7;
Macro_C[3,1]:= 30; Macro_C[3,2]:=3; Macro_C[3,3]:=5;
KeyD:=True;
While KeyD Do
Begin
KeyD:= False;
For I:= 1 To Ksl Do
For J:= 1 To Nmac Do
If Yv[I] = Macro_C[J,1] Then
Begin
KeyD:= True;
Im:= I;
Jm:= J;
End;
If KeyD Then
Begin
For K := Ksl DownTo Im Do
Yv[K+1]:= Yv[K];
Yv[Im]:= Macro_C[Jm,2];
Yv[Im+1]:= Macro_C[Jm,3];
Ksl:= Ksl+1;
End;
End;
{Загрузка ГПО и остальной программный код
блока синтаксического анализа}
…
End;
При рассмотрении алгоритмов аппарата умолчания и использования макрокоманд не учитывалась модификация вектора параметров. В том случае, если встроенный язык предусматривает задание параметров, то при использовании аппарата умолчания и макрокоманд необходимо предусмотреть подключение параметров к вставляемым командам. Для решения данной проблемы, возможно, потребуется создание специальных таблиц.
