3 Постановка задачи к курсовой работе
Разработать распознаватель модельного языка программирования, выполнив следующие действия.
1) В соответствии с номером варианта составить формальное описание мо- дельного языка программирования с помощью: а) РБНФ; б) диаграмм Вирта; в) формальных грамматик.
2) Написать пять содержательных примеров программ, раскрывающих осо- бенности конструкций модельного языка программирования, отразив в этих приме- рах все его функциональные возможности.
3) Составить таблицы лексем и диаграмму состояний с действиями для распо- знавания и формирования лексем языка.
4) По диаграмме с действиями написать функцию сканирования текста вход- ной программы на модельном языке.
5) Разработать программное средство, реализующее лексический анализ тек- ста программы на входном языке.
41 6) Реализовать синтаксический анализатор текста программы на модельном языке методом рекурсивного спуска.
7) Построить цепочку вывода и дерево разбора простейшей программы на мо- дельном языке из начального символа грамматики.
8) Дополнить синтаксический анализатор процедурами проверки семантиче- ской правильности программы на модельном языке в соответствии с контекстными условиями вашего варианта.
9) Распечатать пример таблиц идентификаторов и двуместных операций.
10) Показать динамику изменения содержимого стека при семантическом ана- лизе программы на примере одного синтаксически правильного выражения.
11) Составить набор контрольных примеров, демонстрирующих все возмож- ные типы лексических, синтаксических и семантических ошибок в программах на модельном языке.
4 Требования к содержанию курсовой работы
Курсовая работа должна иметь следующую структуру и состоять из разделов.
Введение
1 Постановка задачи
2 Формальная модель задачи
3 Спецификация основных процедур и функций
3.1 Лексический анализатор
3.2 Синтаксический анализатор
3.3 Семантический анализатор
4 Структурная организация данных
4.1 Спецификация входных данных
4.2 Спецификация выходных данных
5 Разработка алгоритма решения задачи
5.1 Укрупненная схема алгоритма программного средства
5.2 Детальная разработка алгоритмов отдельных подзадач
42 6 Установка и эксплуатация программного средства
7 Работа с программным средством
Заключение
Список использованных источников
Приложение А – Текст программы
Приложение Б – Контрольный пример
Введение. Во введении кратко описывается состояние вопроса разработки распознавателей формальных языков, формулируются цель и задачи курсовой рабо- ты, а также актуальность и обоснованность их решения.
Постановка задачи. Поставленная преподавателем задача разбивается на ряд подзадач, которые необходимо решить для достижения цели курсовой работы.
Формальная модель задачи. Данный раздел содержит положения из теории формальных языков,
грамматик и автоматов, лежащие в основе разработки распо- знавателя модельного языка.
Спецификации основных процедур и функций. Для каждой программной единицы необходимо представить входные данные, функции, которые выполняют- ся, и результаты ее работы.
Разработка алгоритма решения задачи. На основе анализа всех функций, которые должно выполнять проектируемое программное средство, необходимо раз- работать и описать алгоритм решения задачи. В зависимости от выполнения или не- выполнения тех или иных условий, показать порядок и последовательность решения задачи. Логическую структуру программного средства представить с помощью укрупненной схемы алгоритма.
Детальная разработка алгоритмов отдельных подзадач. В этом разделе должна быть представлена логическая структура модулей и процедур, составляю- щих данное программное средство. Для модулей, которые имеют сложную логиче- скую структуру, описание может быть иллюстрировано схемой алгоритма.
Структурная организация данных.В этом разделе необходимо описать данные, используемые в программном средстве (файлы, массивы и т.д.) их структу-
43 ру, типы и т.д. Если данные имеют сложную структуру, то описание необходимо пояснять графическими схемами.
Установка программного средства. Описываются все действия, необходи- мые для установки программного средства (ПС) на ЭВМ. Также объем, занимаемый
ПС на жестком магнитном диске, минимальный объем оперативной памяти, необхо- димый для его эксплуатации, и другие технические характеристики оборудования.
Работа с программным средством. Здесь поясняется обращение к програм- ме,
способы передачи управления, вызов программы и др. Должна быть описана по- следовательность выполнения работы, средства защиты, разработанные в данном
ПС, реакция ПС на неверные действия пользователя.
Заключение.В заключении приводятся основные выводы и перспективы дальнейшего развития представленного ПС.
Список использованных источников представляет собой перечень всей ли- тературы, которая была использована при разработке ПС и оформлении документа- ции на него. Список использованных источников формируется в том порядке, в ко- тором были ссылки на использованную литературу, с указанием издательства, года издания и количества листов в книге согласно стандарту предприятия.
Приложения должны содержать текст ПС, контрольные и тестовые приме- ры, результаты работы ПС.
5 Индивидуальные варианты заданияОперации языка(первая цифра варианта) представлены в таблицах 5.1 – 5.4.
Таблица 5.1 - Операции группы «отношение»
Номер
Синтаксис группы операций
(в порядке следования: неравно, равно, меньше, меньше или равно, больше, больше или равно)
1
<операции_группы_отношения>:: = < > | = | < | <= | > | >=
2
<операции_группы_отношения>:: = != | = = | < | <= | > | >=
3
<операции_группы_отношения>::=
NE |
EQ |
LT |
LE |
GT |
GE
44
Таблица 5.2 - Операции группы «сложение»
Номер
Синтаксис группы операций
(в порядке следования: сложение, вычитание, дизъюнкция)
1
<операции_группы_сложения>:: = + | - | or
2
<операции_группы_сложения>:: = + | - | ||
3
<операции_группы_сложения>:: = plus | min | or
Таблица 5.3 - Операции группы «умножение»
Номер
Синтаксис группы операций
(в порядке следования: умножение, деление, конъюнкция)
1
<операции_группы_умножения>::= * | / | and
2
<операции_группы_умножения>:: = * | / | &&
3
<операции_группы_умножения>::= mult | div | and
Таблица 5.4 - Унарная операция
Номер
Синтаксис операции
1
<унарная_операция>::= not
2
<унарная_операция>::= !
3
<унарная_операция>::=
Выражения языказадаются правилами:
<выражение>::= <операнд>{<операции_группы_отношения> <операнд>}
<операнд>::= <слагаемое> {<операции_группы_сложения> <слагаемое>}
<слагаемое>::= <множитель> {<операции_группы_умножения> <множитель>}
<множитель>::= <идентификатор> | <число> | <логическая_константа> |
<унарная_операция> <множитель> | «(»<выражение>«)»
<число>::= <целое> | <действительное>
<логическая_константа>::= true | false
45
Правила, определяющие идентификатор, букву и цифру:
<идентификатор>::= <буква> {<буква> | <цифра>}
<буква>::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T |
U | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p
q | r | s | t | u | v | w | x | y | z
<цифра>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Правила, определяющие целые числа:
<целое>::= <двоичное> | <восьмеричное> | <десятичное> |
<шестнадцатеричное>
<двоичное>::= {/ 0 | 1 /} (B | b)
<восьмеричное>::= {/ 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 /} (O | o)
<десятичное>::= {/ <цифра> /} [D | d]
<шестнадцатеричное>::= <цифра> {<цифра> | A | B | C | D | E | F | a | b |
c | d | e | f} (H | h)
Правила, описывающие действительные числа:
<действительное>::= <числовая_строка> <порядок> |
[<числовая_строка>] . <числовая_строка> [порядок]
<числовая_строка>::= {/ <цифра> /}
<порядок>::= ( E | e )[+ | -] <числовая_строка>
Правила, определяющие структуру программы (вторая цифра варианта), пред- ставлены в таблице 5.5.
Таблица 5.5 – Структура программы
Номер
Структура программы
1
<программа>::= program var <описание> begin <оператор> {; <опера- тор>} end.
2
<программа>::= «{» {/ (<описание> | <оператор>) ; /} «}»
3
<программа> = {/ (<описание> | <оператор>) ( : | переход строки) /} end
Правила, определяющиераздел описания переменных (третья цифра вариан- та), показаны в таблице 5.6.
46
Таблица 5.6 - Синтаксис команд описания данных
Номер
Синтаксис команд описания данных
1
<описание>::= {<идентификатор> {, <идентификатор> } : <тип> ;}
2
<описание>::= dim <идентификатор> {, <идентификатор> } <тип>
3
<описание>::= <тип> <идентификатор> { , <идентификатор> }
Правила, определяющие типы данных (четвертая цифра варианта),представ- лены в таблице 5.7.
Таблица 5.7- Описание типов данных
Номер
Описание типов
(в порядке следования: целый, действительный, логический)
1
<тип>::= % | ! | $
2
<тип>::= integer | real | boolean
3
<тип>::= int | float | bool
Правило, определяющее оператор программы(пятая цифра варианта).
<оператор>::= <составной> | <присваивания> | <условный> |
<фиксированного_цикла> | <условного_цикла> | <ввода> |
<вывода>
Составной операторописан в таблице 5.8.
Таблица 5.8 - Синтаксис составного оператора
Номер
Синтаксис оператора
1
<составной>::= «[» <оператор> { ( : | перевод строки) <оператор> } «]»
2
<составной>::= begin <оператор> { ; <оператор> } end
3
<составной>::= «{» <оператор> { ; <оператор> } «}»
Оператор присваиванияописан в таблице 5.9.
47
Таблица 5.9 - Синтаксис оператора присваивания
Номер
Оператор присваивания
1
<присваивания>::= <идентификатор> as <выражение>
2
<присваивания>::= <идентификатор> := <выражение>
3
<присваивания> ::= [ let ] <идентификатор> = <выражение>
Оператор условного перехода задан в таблице 5.10.
Таблица 5.10 - Синтаксис оператора условного перехода
Номер
Оператор условного перехода
1
<условный>::= if <выражение> then <оператор> [ else <оператор>]
2
<условный>::= if «(»<выражение> «)» <оператор> [else <оператор>]
3
<условный>::= if <выражение> then <оператор> [else <оператор>]
end_else
Оператор цикла с фиксированным числом повторений описан в таблице 5.11.
Таблица 5.11 - Синтаксис оператора цикла с фиксированным числом повторений
Номер
Синтаксис оператора
1
<фиксированного_цикла>::= for <присваивания> to <выражение> do
<оператор>
2
<фиксированного_цикла>::= for <присваивания> to <выражение> [step
<выражение>] <оператор> next
3
<фиксированного_цикла>::= for «(»[<выражение>] ; [<выражение>] ;
[<выражение>] «)» <оператор>
Условный оператор циклазадан в таблице 5.12.
Таблица 5.12 - Синтаксис условного оператора цикла
Номер
Синтаксис оператора
1
<условного_цикла>::= while <выражение> do <оператор>
2
<условного_цикла>::= while «(»<выражение> «)» <оператор>
3
<условного_цикла>::= do while <выражение> <оператор> loop
Оператор вводаописан в таблице 5.13.
48
Таблица 5.13 - Синтаксис оператора ввода
Номер
Синтаксис оператора
1
<ввода>::= read «(»<идентификатор> {, <идентификатор> } «)»
2
<ввода>::= readln идентификатор {, <идентификатор> }
3
<ввода>::= input «(»<идентификатор> {пробел <идентификатор>} «)»
Оператор выводапредставлен в таблице 5.14.
Таблица 5.14 - Синтаксис оператора вывода
Номер
Синтаксис оператора
1
<вывода>::= write «(»<выражение> {, <выражение> } «)»
2
<вывода>::= writeln <выражение> {, <выражение> }
3
<вывода>::= output «(»<выражение> { пробел <выражение> } «)»
Многострочные комментарии в программе(шестая цифра варианта) опреде- лены в таблице 5.15. Индивидуальные номера вариантов представлены в таблице
5.16.
Таблица 5.15 – Синтаксис многострочных комментариев
Номер
Признак начала комментария
Признак конца комментария
1
{
}
2
/*
*/
3
(*
*)
Таблица 5.16 – Индивидуальные номера вариантов
Номер варианта
Номер задания
Номер варианта
Номер здания
1 111111 16 223122 2
122211 17 223322
49
Продолжение таблицы 5.16
Номер варианта
Номер задания
Номер варианта
Номер здания
3 113211 18 231123 4
113311 19 232223 5
121132 20 233323 6
121212 21 311111 7
123112 22 311211 8
123312 23 311311 9
131111 24 332211 10 132111 25 313311 11 211121 26 321122 12 213222 27 321222 13 213321 28 323122 14 221122 29 331133 15 222222 30 331233
6 Контрольные вопросы для самопроверки
1) Назовите основные способы описания синтаксиса языков программирова- ния.
2) Дайте определение понятия «формальная грамматика».
3) Перечислите основные метасимволы, используемые в РБНФ.
4) Какие графические примитивы используются в метаязыке диаграмм Вирта?
5) Изобразите схематично распознаватель языков и поясните принцип его функционирования.
6) Какие классы распознавателей языков выделяют?
7) Что называется лексемой языка программирования?
8) Какие задачи выполняет лексический анализатор программы?
50 9) Какой тип грамматик по классификации Хомского лежит в основе лексиче- ского анализа программы?
10) Перечислите основные группы лексем языков программирования.
11) Что представляет собой диаграмма состояний с действиями?
12) Расскажите алгоритм разбора цепочек по ДС с действиями.
13) Составьте диаграмму состояний с действиями для модельного языка.
14) Напишите функцию сканирования текста программы на модельном языке по ДС с действиями.
15) Каково назначение синтаксического анализатора программы?
16) Какой тип грамматик по классификации Хомского лежит в основе синтаксического анализа программы?
17) В чем сущность метода рекурсивного спуска?
18) Назовите необходимые условия применимости метода рекурсивного спуска.
19) Расскажите алгоритм построения дерева нисходящего разбора для цепочек грамматики.
20) Какой вывод цепочки грамматики называется левосторонним?
21) Перечислите основные задачи семантического анализатора.
22) Предложите один из возможных способов обработки описаний програм- мы.
23) Запишите синтаксические правила модельного языка, дополненные проце- дурами семантического анализа программы.
7 Тесты для самопроверки
1 Язык, состоящий из пустой строки и всевозможных строк, содержащих строку нулей и последующую строку единиц той же длины: а) L={(01)
n
| n>0}; б) L={(01)
n
| n
0}; в) L={0
n
1
n
| n
0};
51 г)
L={0
n1
n |
n>0}; д)
L={0
n1
m|
n,
m
0}.
2 Строка вида
ababab принадлежит языку: а)
L={
abn |
n>0}; б)
L={(
ab)
n |
n
0}; в)
L={
anbn |
n
0}; г)
L={
anbn |
n>0}; д)
L={
abn |
n
0}.
3 Порядок следования понятий от общего к частному: а)
сентенция в грамматике; цепочка алфавита; строка языка грамматики; б) строка языка грамматики; цепочка алфавита; сентенция в грамматике; в) цепочка алфавита; строка языка грамматики; сентенция в грамматике; г) сентенция в грамматике; строка языка грамматики; цепочка алфавита; д) цепочка алфавита; сентенция в грамматике; строка языка грамматики.
4 Множество правил вывода грамматики
)
,
,
,
(
SPVVGNT
является конеч- ным подмножеством множества: а) (
VT
VN)
(
VT
VN); б) (
VT
VN)
+
(
VT
VN)
*; в) (
VT
VN)
*
(
VT
VN)
+; г)
VN*
VT+; д)
VT+
VN*5 Порядок следования значений конструкций БНФ от общему к частному: а) {0 | 1}; {/0 | 1/}; (0 | 1); б) {/0 | 1/}; {0 | 1}; (0 | 1); в) (0 | 1); {0 | 1}; {/0 | 1/};
52 г) {0 | 1}; (0 | 1); {/0 | 1/}; д) {/0 | 1/}; (0 | 1); {0 | 1}.
6 Синтаксическая конструкция, которая может отсутствовать, в БНФ заключа- ется в: а) ( ); б) { }; в) « »; г) < >; д) [ ].
7 Ограничители вида {/ /} задают в расширенных БНФ: а) итерацию ноль и более раз; б) итерацию один и более раз; в) ограничение нетерминала; г) операцию альтернатива; д) ограничение терминала.
8 Множеству строк, задаваемых конструкцией БНФ вида {/01/}, принадлежит строка: а) ε; б) 000111; в) 010101; г) 001100; д) 001110.
9 В БНФ в угловые скобки < > заключаются: а) терминалы; б) нетерминалы; в) альтернативы;
53 г) итерации; д) необязательные конструкции.
10 Нетерминальным символам на диаграммах Вирта соответствуют: а) кружки; б) скругленные прямоугольники; в) ветвления дуг; г) прямоугольники; д) слияния дуг.
11 Ветвления дуг на диаграммах Вирта задают: а) нетерминальные символы; б) терминальные символы; в) постоянную группу терминальных символов; г) итерации; д) альтернативы.
12 Если для каждой конфигурации распознавателя существует не более одно- го возможного следующего шага, то управляющее устройство называется: а) односторонним; б) ограниченным; в) детерминированным; г) недетерминированным; д) неограниченным.
13 Распознавателями для КС-языков являются: а) МП-автоматы; б) конечные автоматы; в) машины Тьюринга; г) линейные ограниченные автоматы; д) линейные неограниченные автоматы.
54 14 Конечные автоматы являются распознавателями: а) фразовых языков; б) регулярных языков; в) КС-языков; г) КЗ-языков; д) естественных языков.
15 Автомат М(Q, T, F, H, Z) допускает строку
, если существует путь по кон- фигурациям: а) (H,
) |-* (q,
) для некоторого q
Z; б) (H,
) |- (q,
) для некоторого q
Z; в) (q,
) |-* (q,
) для некоторого q
Z; г) (H,
) |-* (q,
) для некоторого q
Z; д) (H,
) |- (q,
) для некоторого q
Z.
16 Язык L, принимаемый конечным автоматом М(Q, T, F, H, Z) формально определяется как множество: а) L(M) = {
|
Q
*
и (H,
) |- (q,
) для некоторого q
Z}; б) L(M) = {
|
T
*
и (H,
) |-* (q,
) для некоторого q
Z}; в) L(M) = {
|
T
+
и (q,
) |-* (q,
) для некоторого q
Z}; г) L(M) = {
|
T
*
и (q,
) |-* (H,
) для некоторого q
Z}; д) L(M) = {
|
T
*
и (H,
) |-* (q,
) для некоторого q
Z}.
17 В грамматике G=({a, b, c, d}, {A, C}, {A
aACd | b; C
c |
}, A) левосто- ронним является вывод: а) A
aACd
abCd
abdd; б) A
aACd
aAd
abd; в) A
aACd
aAcd
abcd; г) A
aACd
abCd
abcd; д) A
aACd
aAcd
acd.
55 18 Процедура
procedure B;
begin if CH=
b
then begin gc;
B end else Err end; ре- ализует рекурсивный спуск для: а) правила
B
bB |
b; б) правила
B
bB; в) правила
B
b; г) правила
B
Bb; д) правила
B
Bb |
b.
19 Достаточные условия применимости метода рекурсивного спуска выпол- няются в правиле: а)
S
aS |
aB; б)
S
Sa |
aB; в)
S
Sa |
a; г)
S
aS |
bB; д)
S
aS |
a. 20 Этап разбора, на
котором символы исходной программы, группируются в отдельные минимальные единицы текста, несущие смысловую нагрузку: а) лексический анализ; б) синтаксический анализ; в) семантический анализ; г) генерация кода; д) оптимизация кода.
21 Лексический анализ проводится путем разбора по: а) МП-автомату; б) конечному автомату; в) машине Тьюринга; г) ограниченному линейному автомату; д) МП-машине.