Вы находитесь на странице: 1из 23

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное


учреждение высшего образования
"Южно-Уральский государственный университет
(национальный исследовательский университет)"
Высшая школа электроники и компьютерных наук
Кафедра системного программирования

ОТЧЕТ
по учебной практике
бакалавра направления 09.03.04 "Программная инженерия"

Выполнил:____________
студент группы КЭ-103
С.Э. Кузнецов

Проверил:_____________
преподаватель кафедры СП
А.С. Аверин
Дата:________, Оценка:__________

Челябинск-2020

1
Министерство науки и высшего образования Российской Федерации
Южно-Уральский государственный университет
Кафедра системного программирования

УТВЕРЖДАЮ
Зав. кафедрой
системного программирования
_____________ Л.Б. Соколинский

ЗАДАНИЕ
по учебной практике
1. Цель работы
Необходимо разработать распознаватель заданной символьной цепочки. Символьная
цепочка задается с помощью формул Бэкуса-Наура.
2. Исходные данные к работе
1. Йенсен К., Вирт Н. Паскаль. Руководство пользователя и описание языка. М.:
Компьютер, 1995.
2. Льюис Ф., Розенкранц Д., Стирнз Р. Теоретические основы проектирования
компиляторов. М.: Мир, 1979.
3. Перечень подлежащих разработке вопросов
1. Выполнить анализ требований и разработать спецификации программы.
2. Провести проектирование программы.
3. Реализовать спроектированные модули.
4. Провести тестирование и отладку реализованных модулей.
4. Сроки
Дата выдачи задания: "___" __________ 2020 г.
Срок сдачи законченной работы: "___" __________ 2020 г.

Руководитель:

___________________________ _____________ _________________


должность, ученая степень подпись ФИО руководителя

Задание принял к исполнению:


_____________ _________________
подпись ФИО студента

2
ОГЛАВЛЕНИЕ
1. Спецификация..........................................................................................................4
2. Проектирование.......................................................................................................6
2.1. Модульная структура.......................................................................................6
2.2. Интерфейсы модулей.......................................................................................6
3. Кодирование............................................................................................................8
3.1. Структура текста программы..........................................................................8
3.2. Алгоритмы реализации модулей....................................................................9
3.2.1. Блок транслитерации.................................................................................9
3.2.2. Лексический блок......................................................................................9
3.2.3. Синтаксический блок..............................................................................18
3.2.4. Блок идентификации ключевых слов....................................................19
3.3. Размер текста программы (в строках)..........................................................19
4. Тестирование.........................................................................................................19
4.1. Автономное тестирование.............................................................................19
4.2. Комплексное тестирование...........................................................................22
Заключение................................................................................................................23
Литература.................................................................................................................23

Спецификация
Необходимо разработать распознаватель заданной символьной цепочки.
Символьная цепочка задается с помощью формул Бэкуса-Наура.

<цепочка>::=<оператор присваивания>

<оператор присваивания>::=<идентификатор>:=<выражение>;

<идентификатор>::=<буква> | <идентификатор><буква> |
<идентификатор><цифра>

<выражение>::=<арифметическая операция>

<арифметическая операция>::=<слагаемое1><знак
арифметической операции><слагаемое2>

<слагаемое1>::=<элемент массива>

<элемент массива>::=<идентификатор>[<
индексное выражение >]

3
<индексное выражение>::=<список целых
констант>

<список целых констант>::=<целая


константа> | < целая константа
>,<список целых констант>

<целая константа>::=<целое со
знаком> | <целое без знака>

<целое со знаком>::=
<знак> | <целое без знака>

<знак>::= + | -

<целое без
знака>::=<цифра> |
<цифра><целое без знака>

<цифра>::= 0 | 1 | … | 8 | 9

<слагаемое2>::=<вызов подпрограммы>

<вызов
подпрограммы>::=<идентификатор>(<список
параметров>)

<список параметров>::=<список
идентификаторов>

<список
идентификаторов>::=<идентификатор
> | <идентификатор> , <список
идентификаторов>

<знак арифметической операции>::= + | - | * | div | mod

Также на цепочку накладывается следующее семантическое ограничение:


идентификатор, входящий в цепочку, не должен совпадать с ключевыми
словами языка Pascal .

Описание входных данных:

Цепочка записана в текстовом файле INPUT.TXT, который состоит из


одной строки. Длина цепочки не превышает 80 символов.

4
Описание выходных данных:

Результат распознавания необходимо записать в текстовый файл


OUTPUT.TXT в одно из следующих сообщений: ACCEPT, если цепочка
допустима, и REJECT, если цепочка недопустима.

Примеры входных и выходных данных:

INPUT.TXT OUTPUT.TXT
myvar:=arr[1] + func(id); ACCEPT
myvar:=arr[1,2,3] div func(id1, id2); ACCEPT
myvar:=arr[-12,+23,3455] mod func(p1, p2, p3, p4, p5, p6); ACCEPT
Bit:=arr[6] * fun(itdi4); ACCEPT
Dh:=massiv[6, 8, 9] div f4in(f5, f6); ACCEPT
Per=arr[8] + fin(g5); REJECT
Ginger:=$f4[] * fon(k6); REJECT
M:=fi[i]/fin(f9); REJECT
M:=fi[2, 4, 7, 9] + fin(); REJECT
end:=mas[1]!func(v); REJECT
Myvar:=arr[1- div fun() REJECT
Myv=arr[9] * gun(c4); REJECT

2. Проектирование модульной структуры.


2.1 Модульная структура

ПРОГРАММА

Синтаксический
блок

Блок
идентификации
ключевых слов
5
Лексический
блок

Блок
транслитерации

2.2 Интерфейсы модулей

Блок транслитерации – подпрограмма преобразующая исходную


символьную цепочку в цепочку лексем вида ("символ цепочки", "класс символа
цепочки ")
Например, символьную цепочку const N=10; 6 блок транслитерации должен
преобразовать в цепочку лексем (c,буква), (o,буква), (n,буква), (s,буква),
(t,буква), (' ',пробел), (N,буква), (=,равно), (1,цифра), (0,цифра), (;,тчкзпт)

Лексический блок – подпрограмма, преобразующая цепочку лексем,


полученную от транслитератора, в цепочку лексем вида ("символ входного
языка", "класс символа входного языка").

В рассматриваемом примере лексический блок должен выдать следующую


цепочку лексем: (const,ИДЕНТИФИКАТОР), (N,ИДЕНТИФИКАТОР),
(=,РАВНО), (10,ЦЕЛОЕ), (;,ТЧКЗПТ)

Блок идентификации ключевых слов – подпрограмма, которая


устанавливает, какое из ключевых слов языка Pascal соответствует заданному
идентификатору, либо сообщает, что заданный идентификатор не является
ключевым словом языка Pascal. Идентификация ключевых слов может быть
выделена в отдельный проход распознавателя символьной цепочки, то есть
идентифицирующий блок будет запускаться после того, как лексический блок
полностью подготовит всю цепочку лексем. Другим подходом является
объединение в один проход распознавателя символьной цепочки лексического
блока и блока идентификации. В этом случае идентификация ключевого слова
осуществляется каждый раз, когда лексический блок выдал одну лексему

6
класса "идентификатор" (без ожидания полной подготовки всей цепочки
лексем).

В рассматриваемом примере после распознавания слов цепочка лексем,


полученная в результате работы лексического блока, примет следующий вид:
(const,КЛСЛОВО_CONST), (N,ИДЕНТИФИКАТОР), (=,РАВНО), (10,ЦЕЛОЕ),
(;,ТЧКЗПТ)

Синтаксический блок – подпрограмма, которая получает цепочку


лексем вида ("символ входного языка", "класс символа входного языка") и
устанавливает, соответствует ли она заданным формулам Бэкуса-Наура.
Поскольку задание предполагает только распознавание исходной цепочки,
фактически данный блок использует для работы только классы символов
входного языка. В рассматриваемом примере синтаксический блок,
рассматривая цепочку вида КЛСЛОВО_CONST, ИДЕНТИФИКАТОР, РАВНО,
ЦЕЛОЕ, ТЧКЗПТ должен сообщить, что она синтаксически правильна.

7
3. Кодирование.
3.1 Структура текста
Head.py

Syntaxic.py

Identific.py

Lexical.py

Translit.py

1. Head.py – объявление всех модулей, начало и конец работы программы.


2. Syntax.py – модуль, в котором реализуется синтаксический блок
проверяет соответствие заданнм формулам Бэкуса-Наура.
3. Identific.py – модуль,в котором реализуется идентификация ключевых
слов.
4. Lexical.py – модуль,в котором реализуется лексического блока.
5. Translit.py – модуль, в котором реализуется транслитерация строки,
распознавание цепочки.

8
3.2 Алгоритмы реализации модулей.
3.2.1 Блок транслитерации
Блок транслитерации реализован в виде детерминированного
конечного автомата , который выполняет обработку и распознавание входной
символьной цепочки. Обработка входной цепочки заключается в собственно
выполнении транслитерации – формировании цепочки лексем вида ("символ
цепочки", "класс символа цепочки").
В Табл. 2 приведена спецификация транслитератора для распознавателя
символьной цепочки, определенной в 1.
Табл. 2. Транслитерация символьной цепочки
Символы Класс лексемы
a..z, A..Z буква
0..9 цифра
= равно
: двоеточие
[ квотскобка
] квзакскобка
( отскобка
) закскобка
, запятая
+, - знак
+, - , *, / ариф_знак
пробел пробел
другие символы ошибка
; тчзпт

3.2.2 Лексический блок


Лексический блок
необходимо реализован в виде детерминированного конечного автомата,
который выполняет обработку и распознавание входной цепочки лексем
(полученной как результат работы блока транслитерации). Обработка входной
цепочки заключается в формировании цепочки лексем вида ("символ входного
языка", "класс символа входного языка").
В Табл. 3 определены состояния конечного распознавателя
лексического блока символьной цепочки, определенной в 1. Начальное
состояние – НАЧ. Допустимые состояния – ТЧKЗПТ .
Табл. 3. Состояния конечного распознавателя лексического блока
Состояние Семантика
№ п/п
1 НАЧ Момент до начала обработки цепочки
либо чтение пробелов в начале строки.
2 ИМЯ1 Чтение имени константы.

9
3 ПРОБЕЛ1 Чтение пробелов между именем
константы и оператора присваивания.
4 ПРИСВАИВ Чтение оператора присваивания «:=».
5 ПРОБЕЛ2 Чтение пробелов между оператором
присваивания и имени константы.
6 ИМЯ2 Чтение имени константы.
7 ПРОБЕЛ3 Чтение пробелов между именем
константы и «[».
8 ОТСКОБКА1 Чтение знака «[».
9 ЗНАК Прочитан знак целой константы.
1 ЦЕЛОЕ Чтение значения целой константы.
0
1 ЗПТ1 Чтение «,».
1
1 ПРОБЕЛ4 Чтение пробелов между запятой и
2 следующей числовой константой или «]».
1 ЗАКСКОБКА1 Чтение знака «]».
3
1 ПРОБЕЛ5 Чтение пробелов между «]» и
4 арифметическим знаком или константы.
1 АРИФЗНАК Чтение арифметического знака.
5
1 АРИФ_КОНСТ Чтение арифметической константы:
6 div, mod.
1 ИМЯ3 Чтение имени константы.
7
1 ПРОБЕЛ6 Чтение пробелов между имени
8 константы и знака «(».
1 ОТСКОБКА2 Чтение знака «(».
9
2 СПИСОК_КОН Чтение списка констант.
0 СТ
2 ПРОБЕЛ7 Чтение пробелов между константой и
1 «)» или запятой.
2 ЗПТ2 Чтение «,».
2
2 ЗАКСКОБКА2 Чтение знака «)».
3
2 ТЧЗПТ Чтение знака «;».
4
2 Е Ошибка.
5

10
В Табл. 4 приведена спецификация конечного распознавателя
лексического блока.

Табл. 4. Конечный распознаватель лексического блока


буква цифра равно двоеточие квотскобка квзакскобка отскобка закскобка запятая знак ариф_знак пробел тчзпт
НАЧ ИМЯ1 Е Е Е Е Е Е Е Е Е Е НАЧ Е 0

ИМЯ1 ИМЯ1 ИМЯ1 Е ПРИСВАИВ Е Е Е Е Е Е Е ПРОБЕЛ1 Е 0


ПРОБЕЛ1 Е Е Е ПРИСВАИВ Е Е Е Е Е Е Е ПРОБЕЛ1 Е 0
ПРИСВАИВ Е Е ПРОБЕЛ2 Е Е Е Е Е Е Е Е Е Е 0
ПРОБЕЛ2 ИМЯ2 Е Е Е Е Е Е Е Е Е Е ПРОБЕЛ2 Е 0
ИМЯ2 ИМЯ2 ИМЯ2 Е Е ОТСКОБКА1 Е Е Е Е Е Е ПРОБЕЛ3 Е 0
ПРОБЕЛ3 Е Е Е Е ОТСКОБКА1 Е Е Е Е Е Е ПРОБЕЛ3 Е 0
ОТСКОБКА1 Е ЦЕЛОЕ Е Е Е Е Е Е Е ЗНАК Е ОТСКОБКА1 Е 0
ЗНАК Е ЦЕЛОЕ Е Е Е Е Е Е Е Е Е ЗНАК Е 0
ЦЕЛОЕ Е ЦЕЛОЕ Е Е Е ЗАКСКОБКА1 Е Е ЗПТ1 Е Е ПРОБЕЛ4 Е 0
ЗПТ1 Е ЦЕЛОЕ Е Е Е Е Е Е Е ЗНАК Е ЗПТ1 Е 0
ПРОБЕЛ4 Е Е Е Е Е ЗАКСКОБКА1 Е Е ЗПТ1 Е Е ПРОБЕЛ4 Е 0
ЗАКСКОБКА1 Е Е Е Е Е Е Е Е Е Е АРИФЗНАК ПРОБЕЛ5 Е 0
ПРОБЕЛ5 АРИФ_КОНСТ Е Е Е Е Е Е Е Е Е АРИФЗНАК ПРОБЕЛ5 Е 0
АРИФЗНАК ИМЯ3 Е Е Е Е Е Е Е Е Е Е АРИФЗНАК Е 0
АРИФ_КОНСТ АРИФ_КОНСТ Е Е Е Е Е Е Е Е Е Е АРИФЗНАК Е 0
ИМЯ3 ИМЯ3 ИМЯ3 Е Е Е Е ОТСКОБКА2 Е Е Е Е ПРОБЕЛ6 Е 0
ПРОБЕЛ6 Е Е Е Е Е Е ОТСКОБКА2 Е Е Е Е ПРОБЕЛ6 Е 0
ОТСКОБКА2 СПИСОК_КОНСТ Е Е Е Е Е Е Е Е Е Е ОТСКОБКА2 Е 0
СПИСОК_КОНС
СПИСОК_КОНСТ СПИСОК_КОНСТ Е Е Е Е Е ЗАКСКОБКА2 ЗПТ2 Е Е ПРОБЕЛ7 Е 0
Т
ПРОБЕЛ7 Е Е Е Е Е Е Е ЗАКСКОБКА2 ЗПТ2 Е Е ПРОБЕЛ7 Е 0
ЗПТ2 СПИСОК_КОНСТ Е Е Е Е Е Е Е Е Е Е ЗПТ2 Е 0
ЗАКСКОБКА2 Е Е Е Е Е Е Е Е Е Е Е ЗАКСКОБКА2 ТЧЗПТ 0
ТЧЗПТ Е Е Е Е Е Е Е Е Е Е Е ТЧЗПТ Е 1
Е Е Е Е Е Е Е Е Е Е Е Е Е Е 0

Проведем редукцию построенного автомата. У данного конечного


распознавателя лексического блока нет недостижимых состояний.
Эквивалентных состояний нет. Дальнейший процесс редукции конечного
распознавателя лексического блока приведет в Табл. 5.
Табл. 5. Редукция конечного распознавателя лексического блока
Ша Результат (блоки состояний) Действия
г
0 P0 = {НАЧ, ИМЯ1, ПРОБЕЛ1, Разбиваем P0
ПРИСВАИВ, ПРОБЕЛ2, ИМЯ2, на два блока:
ПРОБЕЛ3, ОТСКОБКА1, ЗНАК, ЦЕЛОЕ, допустимые и
ЗПТ1, ПРОБЕЛ4, ЗАКСКОБКА1, отвергающие
ПРОБЕЛ5, АРИФЗНАК, АРИФ_КОНСТ, состояния.
ИМЯ3, ПРОБЕЛ6, ОТСКОБКА2,
СПИСОК_КОНСТ, ПРОБЕЛ7, ЗПТ2,
ЗАКСКОБКА2, ТЧЗПТ,
E}
1 P11 = { НАЧ, ИМЯ1, ПРОБЕЛ1, Разбиваем P11
ПРИСВАИВ, ПРОБЕЛ2, ИМЯ2, по входу буква.
ПРОБЕЛ3, ОТСКОБКА1, ЗНАК, ЦЕЛОЕ,

11
ЗПТ1, ПРОБЕЛ4, ЗАКСКОБКА1,
ПРОБЕЛ5, АРИФЗНАК, АРИФ_КОНСТ,
ИМЯ3, ПРОБЕЛ6, ОТСКОБКА2,
СПИСОК_КОНСТ, ПРОБЕЛ7, ЗПТ2,
ЗАКСКОБКА2, E },
P12 = {ТЧЗПТ}
2 P21 = { НАЧ, ИМЯ1}, 1. Разбиваем
P22 = { ПРОБЕЛ2, ИМЯ2}, P21 по входу цифра.
P23 = { ПРОБЕЛ5, АРИФ_КОНСТ }, 2. Разбиваем
P24 = {АРИФЗНАК, ИМЯ3}, P22 по входу цифра.
P25 = { ОТСКОБКА2, ЗПТ2, 3. Разбиваем
СПИСОК_КОНСТ }, P23 по входу
P26 = { ПРОБЕЛ1, ПРИСВАИВ, ариф_знак.
ПРОБЕЛ3, ОТСКОБКА1, ЗНАК, ЦЕЛОЕ, 4. Разбиваем
ЗПТ1, ПРОБЕЛ4, ЗАКСКОБКА1, P24 по входу цифра.
ПРОБЕЛ6, ПРОБЕЛ7, ЗАКСКОБКА2, E }, 5. Разбиваем
P27 = {ТЧЗПТ} P25 по входу цифра.
6. Разбиваем
P26 по входу равно.

3 P31 = {НАЧ}, 1. Разбиваем


P32 = {ИМЯ1}, P312 по входу
P33 = {ПРИСВАИВ}, двоеточие.
P34 = {ПРОБЕЛ2},
P35 = {ИМЯ2},
P36 = {ПРОБЕЛ5},
P37 = {АРИФ_КОНСТ},
P38 = {АРИФЗНАК},
P39 = {ИМЯ3},
P310 = {ОТСКОБКА2, ЗПТ2},
P311 = {СПИСОК_КОНСТ},
P312 = {ПРОБЕЛ1, ПРОБЕЛ3,
ОТСКОБКА1, ЗНАК, ЦЕЛОЕ, ЗПТ1,
ПРОБЕЛ4, ЗАКСКОБКА1, ПРОБЕЛ6,
ПРОБЕЛ7, ЗАКСКОБКА2, E},
P313 = {ТЧЗПТ}
4 P41 = {НАЧ}, 1. Разбиваем
P42 = {ИМЯ1}, P413 по входу
P43 = {ПРОБЕЛ1}, квотскобка.
P44 = {ПРИСВАИВ},

12
P45 = {ПРОБЕЛ2},
P46 = {ИМЯ2},
P47 = {ПРОБЕЛ5},
P48 = {АРИФ_КОНСТ},
P49 = {АРИФЗНАК},
P410 = {ИМЯ3},
P411 = {ОТСКОБКА2, ЗПТ2},
P412 = {СПИСОК_КОНСТ},
P413 = {ПРОБЕЛ3, ОТСКОБКА1,
ЗНАК, ЦЕЛОЕ, ЗПТ1, ПРОБЕЛ4,
ЗАКСКОБКА1, ПРОБЕЛ6, ПРОБЕЛ7,
ЗАКСКОБКА2, E},
P414 = {ТЧЗПТ}
5 P51 = {НАЧ}, 1. Разбиваем
P52 = {ИМЯ1}, P514 по входу
P53 = {ПРОБЕЛ1}, квзакскобка.
P54 = {ПРИСВАИВ},
P55 = {ПРОБЕЛ2},
P56 = {ИМЯ2},
P57 = {ПРОБЕЛ3},
P58 = {ПРОБЕЛ5},
P59 = {АРИФ_КОНСТ},
P510 = {АРИФЗНАК},
P511 = {ИМЯ3},
P512 = {ОТСКОБКА2, ЗПТ2},
P513 = {СПИСОК_КОНСТ},
P514 = {ОТСКОБКА1, ЗНАК,
ЦЕЛОЕ, ЗПТ1, ПРОБЕЛ4, ЗАКСКОБКА1,
ПРОБЕЛ6, ПРОБЕЛ7, ЗАКСКОБКА2, E},
P515 = {ТЧЗПТ}
6 P61 = {НАЧ}, 1. Разбиваем
P62 = {ИМЯ1}, P615 по входу знак.
P63 = {ПРОБЕЛ1}, 2. Разбиваем
P64 = {ПРИСВАИВ}, P68 по входу цифра.
P65 = {ПРОБЕЛ2},
P66 = {ИМЯ2},
P67 = {ПРОБЕЛ3},
P68 = {ЦЕЛОЕ, ПРОБЕЛ4},
P69 = {ПРОБЕЛ5},
P610 = {АРИФ_КОНСТ},
P611 = {АРИФЗНАК},
P612 = {ИМЯ3},
P613 = {ОТСКОБКА2, ЗПТ2},

13
P614 = {СПИСОК_КОНСТ},
P615 = {ОТСКОБКА1, ЗНАК, ЗПТ1,
ЗАКСКОБКА1, ПРОБЕЛ6, ПРОБЕЛ7,
ЗАКСКОБКА2, E},
P616 = {ТЧЗПТ}
7 P71 = {НАЧ}, 1. Разбиваем
P72 = {ИМЯ1}, P718 по входу
P73 = {ПРОБЕЛ1}, цифра.
P74 = {ПРИСВАИВ},
P75 = {ПРОБЕЛ2},
P76 = {ИМЯ2},
P77 = {ПРОБЕЛ3},
P78 = {ОТСКОБКА1, ЗПТ1},
P79 = {ЦЕЛОЕ},
P710 = {ПРОБЕЛ4},
P711 = {ПРОБЕЛ5},
P712 = {АРИФ_КОНСТ},
P713 = {АРИФЗНАК},
P714 = {ИМЯ3},
P715 = {ОТСКОБКА2},
P716 = {СПИСОК_КОНСТ},
P717 = {ЗПТ2},
P718 = {ЗНАК, ЗАКСКОБКА1,
ПРОБЕЛ6, ПРОБЕЛ7, ЗАКСКОБКА2, E},
P719 = {ТЧЗПТ}
8 P81 = {НАЧ}, 1. Разбиваем
P82 = {ИМЯ1}, P819 по входу
P83 = {ПРОБЕЛ1}, пробел.
P84 = {ПРИСВАИВ},
P85 = {ПРОБЕЛ2},
P86 = {ИМЯ2},
P87 = {ПРОБЕЛ3},
P88 = {ОТСКОБКА1, ЗПТ1},
P89 = {ЗНАК},
P810 = {ЦЕЛОЕ},
P811 = {ПРОБЕЛ4},
P812 = {ПРОБЕЛ5},
P813 = {АРИФ_КОНСТ},
P814 = {АРИФЗНАК},
P815 = {ИМЯ3},
P816 = {ОТСКОБКА2},
P817 = {СПИСОК_КОНСТ},
P818 = {ЗПТ2},

14
P819 = {ЗАКСКОБКА1, ПРОБЕЛ6,
ПРОБЕЛ7, ЗАКСКОБКА2, E},
P820 = {ТЧЗПТ}
9 P91 = {НАЧ}, 1. Разбиваем
P92 = {ИМЯ1}, P915 по входу
P93 = {ПРОБЕЛ1}, ариф_знак.
P94 = {ПРИСВАИВ}, 2. Разбиваем
P95 = {ПРОБЕЛ2}, P920 по входу
P96 = {ИМЯ2}, отскобка.
P97 = {ПРОБЕЛ3},
P98 = {ОТСКОБКА1, ЗПТ1},
P99 = {ЗНАК},
P910 = {ЦЕЛОЕ},
P911 = {ПРОБЕЛ4},
P912 = {ПРОБЕЛ5},
P913 = {АРИФ_КОНСТ},
P914 = {АРИФЗНАК},
P915 = {ЗАКСКОБКА1,
ЗАКСКОБКА2},
P916 = {ИМЯ3},
P917 = {ОТСКОБКА2},
P918 = {СПИСОК_КОНСТ},
P919 = {ЗПТ2},
P920 = {ПРОБЕЛ6, ПРОБЕЛ7},
P921 = {ТЧЗПТ},
P922 = {E}
10 P101 = {НАЧ}, Блоки P108 не
P102 = {ИМЯ1}, допускает
P103 = {ПРОБЕЛ1}, дальнейшего
P104 = {ПРИСВАИВ}, разбиения, так как
P105 = {ПРОБЕЛ2}, относительно
P106 = {ИМЯ2}, любого входного
P107 = {ПРОБЕЛ3}, символа из
P108 = {ОТСКОБКА1, ЗПТ1}, состояний
P109 = {ЗНАК}, ОТСКОБКА1 и
P1010 = {ЦЕЛОЕ}, ЗПТ1
P1011 = {ПРОБЕЛ4}, осуществляется
P1012 = {ПРОБЕЛ5}, переход в один и тот
P1013 = {АРИФ_КОНСТ}, же блок состояний.
P1014 = {АРИФЗНАК}, Таким образом,
P1015 = {ЗАКСКОБКА1}, состояния
P1016 = {ИМЯ3}, ОТСКОБКА1 и
P1017 = {ПРОБЕЛ6}, ЗПТ1эквивалентны и

15
P1018 = {ОТСКОБКА2}, могут быть
P1019 = {СПИСОК_КОНСТ}, заменены
P1020 = {ПРОБЕЛ7}, состояниями
P1021 = {ЗАКСКОБКА2}, ОТСКОБКА1/ЗПТ1.
P1022 = {ЗПТ2},
P1023 = {ТЧЗПТ},
P1024 = {E}

В Табл. 6 приведен результат редукции конечного распознавателя


лексического блока.

Табл. 6. Минимальный конечный распознаватель лексического


буква цифра равно двоеточие квотскобка квзакскобка отскобка закскобка запятая знак ариф_знак пробел тчзпт
НАЧ ИМЯ1 Е Е Е Е Е Е Е Е Е Е НАЧ Е 0

ИМЯ1 ИМЯ1 ИМЯ1 Е ПРИСВАИВ Е Е Е Е Е Е Е ПРОБЕЛ1 Е 0


ПРОБЕЛ1 Е Е Е ПРИСВАИВ Е Е Е Е Е Е Е ПРОБЕЛ1 Е 0
ПРИСВАИВ Е Е ПРОБЕЛ2 Е Е Е Е Е Е Е Е Е Е 0
ПРОБЕЛ2 ИМЯ2 Е Е Е Е Е Е Е Е Е Е ПРОБЕЛ2 Е 0
ИМЯ2 ИМЯ2 ИМЯ2 Е Е ОТСКОБКА1 Е Е Е Е Е Е ПРОБЕЛ3 Е 0
ПРОБЕЛ3 Е Е Е Е ОТСКОБКА1 Е Е Е Е Е Е ПРОБЕЛ3 Е 0
ОТСКОБКА1/ЗПТ1 Е ЦЕЛОЕ Е Е Е Е Е Е Е ЗНАК Е ОТСКОБКА1/ЗПТ1 Е 0
ЗНАК Е ЦЕЛОЕ Е Е Е Е Е Е Е Е Е ЗНАК Е 0

ЦЕЛОЕ Е ЦЕЛОЕ Е Е Е ЗАКСКОБКА1 Е Е ОТСКОБКА1/ЗПТ1 Е Е ПРОБЕЛ4 Е 0


ПРОБЕЛ4 Е Е Е Е Е ЗАКСКОБКА1 Е Е ОТСКОБКА1/ЗПТ1 Е Е ПРОБЕЛ4 Е 0
ЗАКСКОБКА1 Е Е Е Е Е Е Е Е Е Е АРИФЗНАК ПРОБЕЛ5 Е 0
ПРОБЕЛ5 АРИФ_КОНСТ Е Е Е Е Е Е Е Е Е АРИФЗНАК ПРОБЕЛ5 Е 0
АРИФЗНАК ИМЯ3 Е Е Е Е Е Е Е Е Е Е АРИФЗНАК Е 0
АРИФ_КОНСТ АРИФ_КОНСТ Е Е Е Е Е Е Е Е Е Е АРИФЗНАК Е 0
ИМЯ3 ИМЯ3 ИМЯ3 Е Е Е Е ОТСКОБКА2 Е Е Е Е ПРОБЕЛ6 Е 0
ПРОБЕЛ6 Е Е Е Е Е Е ОТСКОБКА2 Е Е Е Е ПРОБЕЛ6 Е 0
ОТСКОБКА2 СПИСОК_КОНСТ Е Е Е Е Е Е Е Е Е Е ОТСКОБКА2 Е 0
СПИСОК_КОНС
СПИСОК_КОНСТ СПИСОК_КОНСТ Е Е Е Е Е ЗАКСКОБКА2 ЗПТ2 Е Е ПРОБЕЛ7 Е 0
Т
ПРОБЕЛ7 Е Е Е Е Е Е Е ЗАКСКОБКА2 ЗПТ2 Е Е ПРОБЕЛ7 Е 0
ЗПТ2 СПИСОК_КОНСТ Е Е Е Е Е Е Е Е Е Е ЗПТ2 Е 0
ЗАКСКОБКА2 Е Е Е Е Е Е Е Е Е Е Е ЗАКСКОБКА2 ТЧЗПТ 0
ТЧЗПТ Е Е Е Е Е Е Е Е Е Е Е ТЧЗПТ Е 1
Е Е Е Е Е Е Е Е Е Е Е Е Е Е 0

блока

Для данного обрабатывающего автомата лексического блока потребуются


примитивные процедуры, указанные в Табл. 7.
Табл. 7. Примитивные процедуры обрабатывающего автомата
лексического блока
№ Процед Семантика
п/п ура
1 ДА Остановить обработку и допустить цепочку.
2 НЕТ Остановить обработку и отвергнуть цепочку.
3 Обработ Добавить входной символ к значению
ать текущей лек-сему.
4 Лексема Увеличить счетчик лексем на 1, установить
(класс) заданный класс текущей лексемы.

16
Обрабатывающий автомат лексического блока для данного автомата
приведен в Табл. 8.

Табл. 8. Обрабатывающий автомат лексического блок



буква ❷ цифра ❷ равно двоеточие ⓫ квотскобка квзакскобка отскобка закскобка запятая знак ариф_знак пробел тчзпт
НАЧ ИМЯ1 НАЧ

ИМЯ1 ИМЯ1 ИМЯ1 ❸ ПРИСВАИВ ПРОБЕЛ1
ПРОБЕЛ1 ❶ ПРИСВАИВ ПРОБЕЛ1
ПРИСВАИВ ❷ ❷ ПРОБЕЛ2 ❹
ПРОБЕЛ2 ИМЯ2 ❹ ПРОБЕЛ2
ИМЯ2 ИМЯ2 ИМЯ2 ❼ ОТСКОБКА1/ЗПТ1 ❻ ПРОБЕЛ3
ПРОБЕЛ3 ❼ ОТСКОБКА1/ЗПТ1 ПРОБЕЛ3
ОТСКОБКА1/ЗПТ1 ЦЕЛОЕ ЗНАК ОТСКОБКА1/ЗПТ1
ЗНАК ЦЕЛОЕ❷ ❺ ❾ ЗНАК
ЦЕЛОЕ ЦЕЛОЕ ЗАКСКОБКА1❺ ОТСКОБКА1/ЗПТ1❾ ПРОБЕЛ4

ПРОБЕЛ4 ЗАКСКОБКА1 ОТСКОБКА1/ЗПТ1 ❽ ПРОБЕЛ4

ЗАКСКОБКА1 ❶ АРИФЗНАК❽ ПРОБЕЛ5



ПРОБЕЛ5 АРИФ_КОНСТ❷ АРИФЗНАК ПРОБЕЛ5
АРИФЗНАК ИМЯ3❷ ❷ ⓬ АРИФЗНАК
АРИФ_КОНСТ АРИФ_КОНСТ ⓬ АРИФЗНАК
ИМЯ3 ИМЯ3 ИМЯ3 ОТСКОБКА2 ПРОБЕЛ6
ПРОБЕЛ6 ❶ ОТСКОБКА2 ПРОБЕЛ6
ОТСКОБКА2 СПИСОК_КОНСТ❷ ❷ ⓭ ❾ ОТСКОБКА2
⓭ ❾
СПИСОК_КОНСТ СПИСОК_КОНСТ❷ СПИСОК_КОНСТ ЗАКСКОБКА2 ЗПТ2 ПРОБЕЛ7
ПРОБЕЛ7 ЗАКСКОБКА2 ЗПТ2 ПРОБЕЛ7
ЗПТ2 СПИСОК_КОНСТ ЗПТ2 ❿

ЗАКСКОБКА2 ЗАКСКОБКА2 ТЧЗПТ


ТЧЗПТ ТЧЗПТ ДА
Е

Пустым клеткам соответствует вызов примитивной процедуры НЕТ. Для


удобства чтения действия обрабатывающего автомата, выполняемые перед
переходом в новое состояние, обозначены цифрами. Семантика действий дана в
Табл.9.

Табл. 9. Процедуры переходов обрабатывающего автомата лексического


блока

Дей Семантика
ствие
❶ Лексема(ИДЕНТИФ); обработать
❷ обработать
❸ Лексема (РАВНО); обработать
❹ Лексема(КВОТСКОБКА);обработать
❺ Лексема(КВЗАКСКОБКА);обработать

17
❻ Лексема(ЗНАК); обработать
❼ Лексема (ЦЕЛОЕ); обработать
❽ Лексема(АРИФЗНАК); обработать
❾ Лексема (ЗПТ);обработать
❿ Лексема (ТЧЗПТ);обработать
⓫ Лексема (ДВОЕТОЧИЕ);обработать
⓬ Лексема(ОТСКОБКА);обработать
⓭ Лексема(ЗАКСКОБКА);обработать

3.2.3. Синтаксический блок


Синтаксический блок реализован в виде детерминированного
конечного распознавателя. Построенный автомат будет подвергнут редукции
способом, аналогичным приведенному выше в указаниях к разработке
алгоритмов для лексического блока.
Конечный распознаватель синтаксического блока приведен в Табл. 10.
Пустым клеткам соответствует вызов примитивной процедуры НЕТ, которая
отвергает цепочку.
Табл. 10. Конечный распознаватель синтаксического блока
ИДЕНТИФ КЛ_ОПРИСВ КВОТСКОБКА ЗНАК ЦЕЛОЕ ЗПТ КВЗАКСКОБКА АРИФМ ОТСКОБКА ЗАКСКОБКА ТЧКЗПТ 0
НАЧ ИМЯ1 0
ИМЯ1 ПРИСВАИВ 0
ПРИСВАИВ ИМЯ2 0
ИМЯ2 ОТСКОБКА1/ЗПТ1 0

ОТСКОБКА1/ЗПТ1 ЗНАК ЦЕЛОЕ 0

ЗНАК ЦЕЛОЕ 0

ЦЕЛОЕ ОТСКОБКА1/ЗПТ1 ЗАКСКОБКА1 0


ЗАКСКОБКА1 АРИФЗНАК 0
АРИФЗНАК ИМЯ3 0
ИМЯ3 ОТСКОБКА2 0

ОТСКОБКА2 СПИСОК_КОНСТ 0

СПИСОК_КОНСТ ЗПТ2 ЗАКСКОБКА2 0

ЗПТ2 СПИСОК_КОНСТ 0
ЗАКСКОБКА2 ТЧЗПТ 0
ТЧЗПТ 1

Заметим, что состояния ЗНАК И ОТСКОБКА1/ЗПТ1 идентичны, а


следовательно, эквивалентны. Заменим состояние на
ОТСКОБКА1/ЗПТ1/ЗНАК. Результат приведен в Табл. 11. Очевидно, что
полученный автомат не подлежит дальнейшей редукции и является
минимальным.

18
Табл. 11. Минимальный конечный распознаватель синтаксического
блока
ИДЕНТИФ КЛ_ОПРИСВ КВОТСКОБКА ЗНАК ЦЕЛОЕ ЗПТ КВЗАКСКОБКА АРИФМ ОТСКОБКА ЗАКСКОБКА ТЧКЗПТ 0
НАЧ ИМЯ1 0
ИМЯ1 ПРИСВАИВ 0
ПРИСВАИВ ИМЯ2 0

ИМЯ2 ОТСКОБКА1/ЗПТ1/ЗНАК 0

ОТСКОБКА1/ЗПТ1/ЗНАК ОТСКОБКА1/ЗПТ1/ЗНАК ЦЕЛОЕ 0

ЦЕЛОЕ ОТСКОБКА1/ЗПТ1 ЗАКСКОБКА1 0


ЗАКСКОБКА1 АРИФЗНАК 0
АРИФЗНАК ИМЯ3 0
ИМЯ3 ОТСКОБКА2 0

ОТСКОБКА2 СПИСОК_КОНСТ 0

СПИСОК_КОНСТ ЗПТ2 ЗАКСКОБКА2 0

ЗПТ2 СПИСОК_КОНСТ 0
ЗАКСКОБКА2 ТЧЗПТ 0
ТЧЗПТ 1

3.2.4. Блок идентификации ключевых слов.


Для реализации блока идентификации слов будет использоваться один
линейный поиск. Будет создан массив из ключевых слов, кроме идентификации
ключевых слов, также будет проверяться совпадения имен констант с
зарезервированными словами Pascal.

3.3. Размер текста программы (в строках)

В округлении до десятков размер текста программы составляет 420 строк.

4. Тестирование

Данный раздел содержит протоколы автономного и комплексного тести-


рования различных блоков распознавателя цепочки

4.1. Автономное тестирование

Данный пункт содержит протоколы тестирования для блока


транслитерации, лексического блока и синтаксического блока, размещенного в
Табл. 11 и Табл. 12.

Табл. 11. Протокол дополнительных тестов для модулей


распознавателя правильной цепочки
Тесты
Модуль
Входные данные Выходные данные
Блок myvar:=arr[1] + [['m', 'буква'], ['y',

19
транслитерации func(id); 'буква'], ['v', 'буква'], ['a',
'буква'], ['r', 'буква'],
[':', 'двоеточие'],
['=', 'равно'], ['a',
'буква'], ['r', 'буква'], ['r',
'буква'], ['[', 'квотскобка'],
['1', 'цифра'],
[']', 'квзакскобка'],
[' ', 'пробел'],
['+', 'ариф_знак'],
[' ', 'пробел'], ['f',
'буква'], ['u', 'буква'], ['n',
'буква'], ['c', 'буква'],
['(', 'отскобка'],
['i', 'буква'], ['d',
'буква'], [')', 'закскобка'],
[';', 'тчкзпт']]
Лексический [['m', 'буква'], ['y', [['myvar', 'имя'],
'буква'], ['v', 'буква'], ['a', [':', 'двоеточие'],
блок
'буква'], ['r', 'буква'], ['=', 'равно'], ['arr',
[':', 'двоеточие'], 'имя'], ['[', 'квотскобка'],
['=', 'равно'], ['a', ['1', 'число'],
'буква'], ['r', 'буква'], ['r', [']', 'квзакскобка'],
'буква'], ['[', 'квотскобка'], ['+', 'ариф_знак'],
['1', 'цифра'], ['func', 'имя'],
[']', 'квзакскобка'], ['(', 'отскобка'], ['id',
[' ', 'пробел'], 'имя'], [')', 'закскобка'],
['+', 'ариф_знак'], [';', 'тчкзпт']]
[' ', 'пробел'], ['f',
'буква'], ['u', 'буква'], ['n',
'буква'], ['c', 'буква'],
['(', 'отскобка'],
['i', 'буква'], ['d',
'буква'], [')', 'закскобка'],
[';', 'тчкзпт']]
Идентификац [['myvar', 'имя'], [['myvar', 'имя'], [':=',
[':', 'двоеточие'], 'присваивание'], ['arr',
ион-ный блок
['=', 'равно'], ['arr', 'имя'], ['[', 'квотскобка'],
'имя'], ['[', 'квотскобка'], ['1', 'число'], [']',
['1', 'число'], 'квзакскобка'], ['+',
[']', 'квзакскобка'], 'ариф_знак'], ['func', 'имя'],
['+', 'ариф_знак'], ['(', 'отскобка'], ['id', 'имя'],
['func', 'имя'], [')', 'закскобка'], [';',

20
['(', 'отскобка'], 'тчкзпт']]
['id', 'имя'],
[')', 'закскобка'], [';',
'тчкзпт']]
Синтаксическ [['myvar', 'имя'], [['myvar', 'имя'], [':=',
[':=', 'присваивание'],
ий блок 'присваивание'], ['arr',
['arr', 'имя'], ['[',
'квотскобка'], ['1', 'число'], 'имя'], ['[', 'квотскобка'],
[']', 'квзакскобка'], ['+',
['1', 'число'], [']',
'ариф_знак'], ['func',
'имя'], ['(', 'отскобка'], ['id', 'квзакскобка'], ['+',
'имя'], [')', 'закскобка'], [';',
'ариф_знак'], ['func', 'имя'],
'тчкзпт']]
['(', 'отскобка'], ['id', 'имя'],
[')', 'закскобка'], [';',
'тчкзпт']]

Табл. 12. Протокол дополнительных тестов для модулей


распознавателя неправильной цепочки.
Тесты
Модуль
Входные данные Выходные данные
Блок [['m', 'буква'],
[':', 'двоеточие'],
транслитерации
['=', 'равно'], ['f',
'буква'], ['i', 'буква'],
['[', 'квотскобка'],
['i', 'буква'],
[']', 'квзакскобка'],
['/', 'ариф_знак'],
['f', 'буква'], ['i',
'буква'], ['n', 'буква'],
['(', 'отскобка'],
['f', 'буква'], ['9',
'цифра'], [')', 'закскобка'],
[';', 'тчкзпт']]
Лексический [['m', 'буква'],
[':', 'двоеточие'],
блок
['=', 'равно'], ['f',
'буква'], ['i', 'буква'],
['[', 'квотскобка'],
['i', 'буква'], error: expected letter
[']', 'квзакскобка'],

21
['/', 'ариф_знак'],
['f', 'буква'], ['i',
'буква'], ['n', 'буква'],
['(', 'отскобка'],
['f', 'буква'], ['9',
'цифра'], [')', 'закскобка'],
[';', 'тчкзпт']]
Идентификац error error
ион-ный блок
Синтаксическ error None
ий блок

4.2. Комплексное тестирование

В данном пункте в Табл. 13 приведена часть протокола тестирования


головного модуля программы.

Табл. 13. Часть протокола тестирования головного модуля


№ Входные данные Выход Действ Тес
п/п ные данные и-тельный т
результат пройден?
1. myvar:=arr[1] + ACCEP ACCEP ДА
func(id); T T
2. myvar:=arr[1,2,3] ACCEP ACCEP ДА
div func(id1, id2); T T
3. myvar:=arr[- ACCEP ACCEP ДА
12,+23,3455] mod T T
func(p1, p2, p3, p4, p5,
p6);
4. Bit:=arr[6] * ACCEP ACCEP ДА
fun(itdi4); T T
5. Dh:=massiv[6, 8, 9] ACCEP ACCEP ДА
div f4in(f5, f6); T T
6. Per=arr[8] + REJEC REJEC ДА
fin(g5); T T
7. Ginger:=$f4[] * REJEC REJEC ДА
fon(k6); T T
8. M:=fi[i]/fin(f9); REJEC REJEC ДА
T T
9. M:=fi[2, 4, 7, 9] + REJEC REJEC ДА
fin(); T T

22
10 end:=mas[1]! REJEC REJEC ДА
. func(v); T T
11 Myvar:=arr[1- div REJEC REJEC ДА
. fun() T T
12 Myv=arr[9] * REJEC REJEC ДА
. gun(c4); T T

По итогам проведения тестов в реализации головного модуля ошибок не


обнаружено.

Заключение

Данная работа посвящена разработке распознавателя символьной цепочки,


заданной формулами Бэкуса-Наура. В ходе выполнения работы были пройдены
все основные этапы разработки программного обеспечения: анализ, написание
спецификации, проектирование, разработка алгоритмов, кодирование,
тестирование и сопровождение. Каждому этапу, за исключением
сопровождения, в данной работе уделен отдельный пункт. В данных пунктах
описана проделанная в каждом случае работа и ее результаты.

Литература

1. Йенсен К., Вирт Н. Паскаль. Руководство пользователя и описание языка. -


М.: Компьютер, 1995.

2. Льюис Ф., Розенкранц Д., Стирнз Р. Теоретические основы проектирования


компиляторов. - М.: Мир, 1979.

3. Дональд Кнут. Искусство программирования, том 3. Сортировка и поиск - 2-е


изд. - М.: «Вильямс», 2007

23