Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаб 1

.pdf
Скачиваний:
8
Добавлен:
04.03.2022
Размер:
578.2 Кб
Скачать

Федеральное агентство связи ордена Трудового Красного Знамени

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Московский Технический Университет связи и информатики

Кафедра «Математической кибернетики и информационных технологий»

Лабораторная работа №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)

Соседние файлы в предмете Теория языков программирования