Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
ОТЧЕТ
по учебной практике
бакалавра направления 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>::=<вызов подпрограммы>
<вызов
подпрограммы>::=<идентификатор>(<список
параметров>)
<список параметров>::=<список
идентификаторов>
<список
идентификаторов>::=<идентификатор
> | <идентификатор> , <список
идентификаторов>
4
Описание выходных данных:
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
ПРОГРАММА
Синтаксический
блок
Блок
идентификации
ключевых слов
5
Лексический
блок
Блок
транслитерации
6
класса "идентификатор" (без ожидания полной подготовки всей цепочки
лексем).
7
3. Кодирование.
3.1 Структура текста
Head.py
Syntaxic.py
Identific.py
Lexical.py
Translit.py
8
3.2 Алгоритмы реализации модулей.
3.2.1 Блок транслитерации
Блок транслитерации реализован в виде детерминированного
конечного автомата , который выполняет обработку и распознавание входной
символьной цепочки. Обработка входной цепочки заключается в собственно
выполнении транслитерации – формировании цепочки лексем вида ("символ
цепочки", "класс символа цепочки").
В Табл. 2 приведена спецификация транслитератора для распознавателя
символьной цепочки, определенной в 1.
Табл. 2. Транслитерация символьной цепочки
Символы Класс лексемы
a..z, A..Z буква
0..9 цифра
= равно
: двоеточие
[ квотскобка
] квзакскобка
( отскобка
) закскобка
, запятая
+, - знак
+, - , *, / ариф_знак
пробел пробел
другие символы ошибка
; тчзпт
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 приведена спецификация конечного распознавателя
лексического блока.
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 по входу равно.
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}
блока
16
Обрабатывающий автомат лексического блока для данного автомата
приведен в Табл. 8.
Дей Семантика
ствие
❶ Лексема(ИДЕНТИФ); обработать
❷ обработать
❸ Лексема (РАВНО); обработать
❹ Лексема(КВОТСКОБКА);обработать
❺ Лексема(КВЗАКСКОБКА);обработать
17
❻ Лексема(ЗНАК); обработать
❼ Лексема (ЦЕЛОЕ); обработать
❽ Лексема(АРИФЗНАК); обработать
❾ Лексема (ЗПТ);обработать
❿ Лексема (ТЧЗПТ);обработать
⓫ Лексема (ДВОЕТОЧИЕ);обработать
⓬ Лексема(ОТСКОБКА);обработать
⓭ Лексема(ЗАКСКОБКА);обработать
ЗНАК ЦЕЛОЕ 0
ОТСКОБКА2 СПИСОК_КОНСТ 0
ЗПТ2 СПИСОК_КОНСТ 0
ЗАКСКОБКА2 ТЧЗПТ 0
ТЧЗПТ 1
18
Табл. 11. Минимальный конечный распознаватель синтаксического
блока
ИДЕНТИФ КЛ_ОПРИСВ КВОТСКОБКА ЗНАК ЦЕЛОЕ ЗПТ КВЗАКСКОБКА АРИФМ ОТСКОБКА ЗАКСКОБКА ТЧКЗПТ 0
НАЧ ИМЯ1 0
ИМЯ1 ПРИСВАИВ 0
ПРИСВАИВ ИМЯ2 0
ИМЯ2 ОТСКОБКА1/ЗПТ1/ЗНАК 0
ОТСКОБКА2 СПИСОК_КОНСТ 0
ЗПТ2 СПИСОК_КОНСТ 0
ЗАКСКОБКА2 ТЧЗПТ 0
ТЧЗПТ 1
4. Тестирование
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', 'имя'],
[')', 'закскобка'], [';',
'тчкзпт']]
21
['/', 'ариф_знак'],
['f', 'буква'], ['i',
'буква'], ['n', 'буква'],
['(', 'отскобка'],
['f', 'буква'], ['9',
'цифра'], [')', 'закскобка'],
[';', 'тчкзпт']]
Идентификац error error
ион-ный блок
Синтаксическ error None
ий блок
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
Заключение
Литература
23