лаб 1
.pdfФедеральное агентство связи ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Московский Технический Университет связи и информатики
Кафедра «Математической кибернетики и информационных технологий»
Лабораторная работа №1 Регулярные грамматики и конечные автоматы.
Выполнила студентка группы БСТ1904 Пантелеева К.А.
|
Оглавление |
|
1 |
Задание ...................................................................................................................... |
3 |
2 |
Ход лабораторной работы ....................................................................................... |
3 |
|
2.1 Выполнение задания 1 ...................................................................................... |
3 |
|
2.2 Выполнение задания 2 ...................................................................................... |
5 |
|
2.2.1 Код программы........................................................................................... |
5 |
|
2.2.2 Тестирование .............................................................................................. |
7 |
Список использованных источников ........................................................................ |
8 |
1Задание
1)Для грамматики (1) написать функции переходов, таблицу переходов, построить диаграмму переходов. В случае если грамматика порождает недетерминированный конечный автомат, привести его к детерминированному виду, построив новую диаграмму состояний и выписав правила получившейся грамматики. Для построения диаграмм состояний воспользоваться пакетом JFLAP.
G({S,M,N,K},{0,1,*},P,S), где P:
S → N*
M → N1 | 0
N → M1 | K1 | N0 | 1 (1)
K → M0 | N1
2)Для получившегося детерминированного конечного автомата написать программу – оконное приложение, реализующее функцию лексического анализа, получающего на вход цепочку языка, отображающего переходы между состояниями конечного автомата и отвечающего на вопрос, принадлежит ли цепочка языку, заданному грамматикой.
2 Ход лабораторной работы
2.1 Выполнение задания 1
Для грамматики (1) напишем функции переходов:
f(N, *)=S f(N, 1)=M f(H, 0)=M f(M, 1)=N f(K, 1)=N f(N, 0)=N f(H, 1)=N f(M, 0)=K f(N, 1)=K
Затем составим таблицу переходов:
|
0 |
1 |
* |
Н |
M |
N |
- |
M |
K |
N |
- |
N |
N |
M, K |
S |
K |
- |
N |
- |
S |
- |
- |
- |
Таблица переходов 1
Теперь построим диаграмму переходов, используя приложение JFLAP и результаты построения покажем на рисунке 1.
Рисунок 1 – Диаграмма перехода №1
Как мы можем видеть, у нас получился недетерминированный конечный автомат, поэтому приведем его к детерминированному виду. Для этого построим новую таблицу переходов.
|
0 |
1 |
* |
H |
M |
N |
- |
M |
K |
N |
- |
N |
N |
KM |
S |
KM |
K |
N |
- |
K |
- |
N |
- |
S |
- |
- |
- |
Таблица переходов №2
По таблице переходов №2 построим диаграмму переходов (рисунок 2).
Рисунок 2 – Диаграмма конечного автомата
Теперь составим новую грамматику Gꞌ ({S,N,M,K,KM}, {0,1,*}, S, Pꞌ), где P: S→N*
N→K1|KM1|N0|M1|1 KM→N1
K→M0|KM0
M→0
2.2 Выполнение задания 2 2.2.1 Код программы
#pragma endregion
void VivodDGV(DataGridView^ DGV, int i)
{
DGV->Rows[i]->HeaderCell->Value = i + 1;
}
int work(DataGridView^ DGV, TextBox^ t)
{
enum state { H, M, N, K, KM, S, ERR }; enum state CS = H;
int i = 0, n = t->Text->Length; do {
wchar_t c = t->Text[i]; switch (CS)
{
case H:
if (c == '0')
{
DGV->Rows->Add("H -> M"); VivodDGV(DGV, i);
CS = M; i++; continue;
}
else if (c == '1')
{
DGV->Rows->Add("H -> N"); VivodDGV(DGV, i);
CS = N; i++; continue;
}
else
{
CS = ERR; break;
}
case M:
if (c == '0')
{
DGV->Rows->Add("M -> K"); VivodDGV(DGV, i);
CS = K; i++; continue;
}
else if (c == '1')
{
DGV->Rows->Add("M -> N"); VivodDGV(DGV, i);
CS = N; i++; continue;
}
else
{
CS = ERR; break;
}
case N:
if (c == '0')
{
DGV->Rows->Add("N -> N"); VivodDGV(DGV, i);
CS = N; i++; continue;
}
else if (c == '*')
{
DGV->Rows->Add("N -> S"); VivodDGV(DGV, i);
CS = S; i++; continue;
}
else if (c == '1')
{
DGV->Rows->Add("N -> KM"); VivodDGV(DGV, i);
CS = KM; i++; continue;
}
else
{
CS = ERR; break;
}
case K:
if (c == '1')
{
DGV->Rows->Add("K -> N"); VivodDGV(DGV, i);
CS = N; i++; continue;
}
else
{
CS = ERR; break;
}
case KM:
if (c == '0')
{
DGV->Rows->Add("KM -> K"); VivodDGV(DGV, i);
CS = K; i++; continue;
}
else if (c == '1')
{
DGV->Rows->Add("KM -> N"); VivodDGV(DGV, i);
CS = N; i++; continue;
}
else
{
CS = ERR;
break;
}
case S:
if (c != '\0') CS = ERR;
break;
}
} while ((CS != ERR) && ((i != n) && (CS != S)));
if ((CS == ERR) || (CS == M) || (CS == K) || (CS == KM) || (CS == N) ||
(CS == H))
return 1;
else
return 0;
}
void Vivod(TextBox^ t)
{
if (work(dataGridView1, textBox1) == 0) textBox2->Text = "yes";
else textBox2->Text = "no";
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { dataGridView1->ColumnCount = 1;
dataGridView1->Rows->Clear(); Vivod(textBox2);
}
};
}
2.2.2 Тестирование
На рисунке 3 показан результат работы программы при вводе «0110100*».
Рисунок 3 – Результаты программы при принадлежащей грамматике цепочке На рисунке 4 показан результат работы программы при вводе «0110100*».
Рисунок 4 – Результат программы при не принадлежащей грамматике цепочке
Список использованных источников
1) ГОСТ 7.1-2001 СИБИД. Библиографическая запись. Библиографическое описание. Общие требования и правила составления [электронный ресурс]
URL: https://internet-law.ru/gosts/gost/1560 (дата обращения 12.03.2020)
2)ГОСТ 7.32-2001 СИБИД. Отчет о научно-исследовательской работе.
Структура и правила оформления (с Изменением N 1) [электронный ресурс]
URL: http://docs.cntd.ru/document/gost-7-32-2001-sibid (дата обращения
12.03.2020)