Разработка формальных грамматик
Разработка формальной грамматики для выражений, содержащих: логические и арифметические операции, константы, идентификаторы, знаки отношений и т.д., ее отладка в соответствии с требованиями метода параллельного предшествования. Разработка сканера.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 24.09.2010 |
Размер файла | 45,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Разработка формальных грамматик
1. Следуя условиям задания, исходя из заданных операций и их приоритетов, была построена следующая грамматика:
Просмотр выражения и свертка слева-направо.
ВЫРАЖЕНИЕ = А_ВЫР!
Л_ВЫР.
Л_ВЫР = Л_ВЫР «EQU» Л_ОПЕР1! // Операция леворекурсивная=>свертка слева-направо
Л_ОПЕР1.
Л_ОПЕР1 = Л_ОПЕР1 «XOR» Л_ОПЕР2!
Л_ОПЕР1 «OR» Л_ОПЕР2!
Л_ОПЕР2.
Л_ОПЕР2 = Л_ОПЕР2 «AND» Л_ОПЕР3!
Л_ОПЕР3.
Л_ОПЕР3 = «NOT» ЗНАК!
ЗНАК.
ЗНАК = А_ВЫР ОПЕР_СР А_ВЫР.
А_ВЫР = А_ВЫР «+» А_ОПЕР1!
А_ВЫР «-» А_ОПЕР1!
А_ОПЕР1.
А_ОПЕР1 = А_ОПЕР1 «*» А_ОПЕР2!
А_ОПЕР2.
А_ОПЕР2 = А_ОПЕР2 «MOD» А_ОПЕР3!
А_ОПЕР3.
А_ОПЕР3 = А_ОПЕР4 «^» А_ОПЕР3! // Операция праворекурсивная=>свертка справа-налево
А_ОПЕР4.
А_ОПЕР4 = FUNK «(«А_ВЫР «)»!
FUNK «(» ИД_К «)»!
«(» А_ВЫР «)»!
ИД_К.
ИД_К = ИД!
КОНСТ.
ИД = «DOUBLE»!
«INTEGER»!
«STRING».
КОНСТ = «КОНСТ_10»!
«КОНСТ_16»!
«КОНСТ_2».
FUNK = «LEFT»!
«SIN».
ОПЕР_СР = «<»!
«>»!
«<=»!
«>=»!
«<>»!
«=».
EOG
2. Построим матрицу предшествования исходной грамматики в соответствии с требованиями метода параллельного предшествования:
Матрица содержит конфликты:
* строка 1, столбец 31: 1 - конфликт типа =,<
* строка 2, столбец 32: 1 - конфликт типа =,<
* строка 3, столбец 32: 1 - конфликт типа =,<
* строка 6, столбец 36: 1 - конфликт типа =,<
* строка 7, столбец 36: 1 - конфликт типа =,<
* строка 8, столбец 37: 1 - конфликт типа =,<
* строка 11, столбец 29: 1 - конфликт типа =,<
* строка 11, столбец 41: 1 - конфликт типа =,<
* строка 21, столбец 29: 4 - конфликт типа >, X
* строка 22, столбец 29: 4 - конфликт типа >, X
* строка 23, столбец 29: 4 - конфликт типа >, X
* строка 24, столбец 29: 4 - конфликт типа >, X
* строка 25, столбец 29: 4 - конфликт типа >, X
* строка 26, столбец 29: 4 - конфликт типа >, X
* строка 35, столбец 29: 1 - конфликт типа =,<
Отладка
Для наглядности построим дерево:
Конфликт 1-го типа:
Для избежания конфликтов 1-го типа введем новые правила:
Л_ВЫР = Л_ВЫР «EQU» Л_ОПЕР11!
Л_ОПЕР1.
Л_ОПЕР11 = Л_ОПЕР1.
Конфликт ликвидирован и рекурсия сохранена.
При ликвидации конфликтов 1-го типа исчезают конфликты 4-го типа.
Получим новую бесконфликтную грамматику:
ВЫРАЖЕНИЕ = А_ВЫР!
Л_ВЫР.
Л_ВЫР = Л_ВЫР «EQU» Л_ОПЕР11!
Л_ОПЕР1.
Л_ОПЕР11 = Л_ОПЕР1.
Л_ОПЕР1 = Л_ОПЕР1 «XOR» Л_ОПЕР22!
Л_ОПЕР1 «OR» Л_ОПЕР22!
Л_ОПЕР2.
Л_ОПЕР22 = Л_ОПЕР2.
Л_ОПЕР2 = Л_ОПЕР2 «AND» Л_ОПЕР3!
Л_ОПЕР3.
Л_ОПЕР3 = «NOT» ЗНАК!
ЗНАК.
ЗНАК = А_ВЫР ОПЕР_СР А_ВЫР2.
А_ВЫР2 = А_ВЫР.
А_ВЫР = А_ВЫР «+» А_ОПЕР11!
А_ВЫР «-» А_ОПЕР11!
А_ОПЕР1.
А_ОПЕР11 = А_ОПЕР1.
А_ОПЕР1 = А_ОПЕР1 «*» А_ОПЕР22!
А_ОПЕР2.
А_ОПЕР22 = А_ОПЕР2.
А_ОПЕР2 = А_ОПЕР2 «MOD» А_ОПЕР3!
А_ОПЕР3.
А_ОПЕР3 = А_ОПЕР4 «^«А_ОПЕР3!
А_ОПЕР4.
А_ОПЕР4 = FUNK «(» А_ВЫР2»)"!
FUNK «(» ИД_К1»)"!
«(» А_ВЫР2»)»!
ИД_К.
ИД_К1 = ИД_К.
ИД_К = ИД!
КОНСТ.
ИД = «DOUBLE»!
«INTEGER»!
«STRING».
КОНСТ = «КОНСТ_10»!
«КОНСТ_16»!
«КОНСТ_2».
FUNK = «LEFT»!
«SIN».
ОПЕР_СР = «<»!
«>»!
«<=»!
«>=»!
«<>»!
«=».
EOG
Построим матрицу предшествования бесконфликтной грамматики:
4. Разработка сканера
1) Определяем лексемы языка
Табл.1. Лексемы языка
Обозначение лексемы |
Смысл лексемы |
|
конст_10 |
Десятичная константа |
|
конст_16 |
Шестнадцатеричная константа (префикс &H) |
|
конст_2 |
Двоичная константа (префикс &B) |
|
ид_р |
Идентификатор (integer, double или string) |
|
sin |
Синус вещественного числа |
|
left |
Функция работы со строками |
|
not |
Логическое «НЕ» |
|
and |
Логическое «И» |
|
or |
Логическое «ИЛИ» |
|
xor |
Исключающее «ИЛИ» |
|
разделитель |
Пробел |
|
+ |
Арифметическая операция сложения |
|
- |
Арифметическая операция вычитания |
|
* |
Арифметическая операция умножения |
|
mod |
Арифметическая операция целочисленное деление |
|
^ |
Арифметическая операция возведения в степень |
|
оо |
Операция отношения (результат - логический) |
|
( |
Открывающая скобка |
|
) |
Закрывающая скобка |
2) Разрабатываем базу данных сканера
Табл.2. Таблица одно-литерных |
Табл.3. Таблица классов литер |
||||||
терминальных символов |
|||||||
ТТС1 |
KTL |
||||||
«а» … «z» «A» «C» … «K» «M» … «Z» |
Буквы |
б |
б |
0 |
|||
«B» |
1 |
||||||
д |
2 |
||||||
н |
3 |
||||||
р |
4 |
||||||
«+» |
5 |
||||||
«-» |
6 |
||||||
«*» |
7 |
||||||
«^» |
8 |
||||||
«H» |
Шестнадцатеричный префикс |
«H» |
«=» |
9 |
|||
«B» |
Двоичный префикс |
«B» |
«<» |
10 |
|||
«0» «1» |
Двоичные цифры |
д |
«>» |
11 |
|||
«#» |
12 |
||||||
«2» … «9» |
Недвоичные цифры |
н |
«%» |
13 |
|||
«$» |
14 |
||||||
«(» |
15 |
||||||
«» |
Разделитель (пробел) |
р |
«)» |
16 |
|||
«+» |
Сложение |
«+» |
«.» |
17 |
|||
«-» |
Вычитание |
«-» |
«ы» |
18 |
|||
«*» |
Умножение |
«*» |
«H» |
19 |
|||
«^» |
Степень |
«^» |
Табл.4. Таблица типов лексем |
||||
«<» |
Меньше |
«<» |
|||||
«>» |
Больше |
«>» |
TLE |
||||
«=» |
Равно |
«=» |
конст_10 |
0 |
|||
«#» |
Суффикс double |
«#» |
конст_16 |
1 |
|||
«%» |
Суффикс integer |
«% |
конст_2 |
2 |
|||
«$» |
Суффикс string |
«$» |
ид_р |
3 |
|||
«(» |
Открывающая скобка |
«(» |
sin |
4 |
|||
«)» |
Закрывающая скобка |
«)» |
left |
5 |
|||
«.» |
Точка |
«.» |
not |
6 |
|||
Недопустимый символ |
х |
and |
7 |
||||
Конец файла |
ы |
or |
8 |
||||
xor |
9 |
||||||
Табл.5. Таблица ключевых слов |
equ |
10 |
|||||
разделитель |
11 |
||||||
ТКС |
+ |
12 |
|||||
sin |
- |
13 |
|||||
left |
* |
14 |
|||||
not |
mod |
15 |
|||||
and |
^ |
16 |
|||||
or |
оо |
17 |
|||||
xor |
( |
18 |
|||||
equ |
) |
19 |
|||||
mod |
Временные таблицы:
Табл.6. Таблица идентификаторов |
||||||
ТИ |
||||||
Ид |
описатели |
адр |
||||
тип |
точка |
точность |
осн |
|||
Табл.7. Таблица констант |
||||||
ТК |
||||||
конст |
описатели |
|||||
тип |
точка |
точность |
осн |
|||
Табл.8. Таблица операций и специальных символов |
||||||
ТОС |
||||||
символ |
||||||
Табл.9. Таблица стандартных символов |
||||||
ТСС |
||||||
TLE |
ALE |
|||||
3) Каждый тип лексических единиц описываем с помощью автоматной грамматики и для каждой грамматики составляем эквивалентный ей конечный автомат.
конст_10
S = нD1! дD1.
D1 = нD1! дD1!». «D2! е.
D2 = нD3! дD3.
D3 = нD3! дD3! е.
е = «"! «*»!» -"! «+»! «*»! «/"! «^»!»)"! «=»! «<»! «>».
конст_2
S = «&«B0.
B0 = «B» B1.
B1 = дB2.
B2 = дB2!». «B3! е.
B3 = дB4.
B4 = дB4! е.
е = «"! «*»!» -"! «+»! «*»! «/"! «^»!»)"! «=»! «<»! «>».
конст_16
S = «&«B0.
B0 = «H» H1.
H1 = дH1! нH1! «A" H1! «B» H1! «C» H1! «D» H1! «E» H1! «F» H1! е.
е = «"! «*»!» -"! «+»! «*»! «/"! «^»!»)"! «=»! «<»! «>».
ид_р
S = бА! «B» A! «H» A.
А = бА! нА! дА! «A» A! «B» A! «C» A! «D» A! «E» A! «F» A! «H» A! «%«A2! «&«A2! «$«A2.
A2 = е.
е = «"! «*»!» -"! «+»! «*»! «/"! «^»!»)"! «=»! «<»! «>».
sin
S = «s» A4.
A4 = «i» A5.
A5 = «n» A6.
A6 = е4.
е4 = р! «(».
left
S = «l» A7.
A7 = «e» A8.
A8 = «f» A9.
A9 = «t» A10.
A10 = е4.
е4 = р! «(».
not
S = «n» A11.
A11 = «o» A12.
A12 = «t» A13.
A13 = е4.
е4 = р! «(».
and
S = «a» A14.
A14 = «n» A15.
A15 = «d» A16.
A16 = е4.
е4 = р! «(».
or
S = «o» A17.
A17 = «r» A18.
A18 = е4.
е4 = р! «(».
xor
S = «x» A19.
A19 = «o» A20.
A20 = «r» A21.
A21 = е4.
е4 = р! «(».
equ
S = «e» A22.
A22 = «q» A23.
A23 = «u» A24.
A24 = е4.
е4 = р! «(».
разделитель
S = рR1.
R1 = рR1! e0
e0 - любой символ из ТТС1
+
S = «+«U1.
U1 = e3.
e3 = б! «B»! «H»! д! н! р! «&»! «(».
-
S = «- «U1.
U1 = e3.
e3 = б! «B»! «H»! д! н! р! «&»! «(».
*
S = «*«U1.
U1 = e3.
e3 = б! «B»! «H»! д! н! р! «&»! «(».
mod
S = «mod» U1.
U1 = e3.
e3 = б! «B»! «H»! д! н! р! «&»! «(».
S = «^«U1.
U1 = e3.
e3 = б! «B»! «H»! д! н! р! «&»! «(».
оо
S = «<«O1! «>«O2! «=«O3.
O1 = «>«O4! «=«O4! e3.
O2 = «=«O5! e3.
O4 = e3.
O5 = e3.
O3 = e3.
e3 = б! «B»! «H»! д! н! р! «&»! «(».
(
S = «(«K1.
K1 = e2.
e2 = б! «B»! «H»! д! н! р! «+»!» -"! «&»! «(».
)
S =»)«K2.
K2 = e.
е = «"! «*»!» -"! «+»! «*»! «^»!»)"! «=»! «<»! «>».
4) Описываем использованные в сканере подпрограммы:
end - Процедура окончания работы сканера
podgot - Процедура производит общую подготовку сканера к работе
tip - Процедура устанавливает тип литеры
vkl - Процедура добавляет текущую литеру в текущую лексему
cll - Процедура считывает из файла очередную литеру
zaptab - Процедура проверяет наличие текущей лексемы в таблице ключевых слов
out - Процедура заполняет основные таблицы
6) Пример работы сканера
Исходное выражение:
(sin (2*aa%-&B01)<bb#) and (2+3+4<10) xor &H0
Заполненные в результате работы сканера таблицы:
Табл.10. Таблица идентификаторов |
||||||
ТИ |
||||||
ид |
описатели |
адр |
||||
тип |
точка |
точность |
осн |
|||
Aa% |
Integer |
0 |
2 |
10 |
0 |
|
Bb# |
Double |
1 |
16 |
10 |
2 |
|
Табл.11. Таблица констант |
||||||
ТК |
||||||
конст |
Описатели |
|||||
тип |
точка |
точность |
осн |
|||
2 |
Integer |
0 |
0 |
10 |
||
&B01 |
Bin |
0 |
0 |
2 |
||
2 |
Integer |
0 |
0 |
10 |
||
3 |
Integer |
0 |
0 |
10 |
||
4 |
Integer |
0 |
0 |
10 |
||
10 |
Integer |
0 |
0 |
10 |
||
&H0 |
Hex |
0 |
0 |
16 |
||
Табл.12. Таблица операций и специальных символов |
||||||
ТОС |
||||||
Символ |
||||||
( |
||||||
Sin |
||||||
( |
||||||
* |
||||||
- |
||||||
) |
||||||
< |
||||||
) |
||||||
And |
||||||
( |
||||||
+ |
||||||
+ |
||||||
< |
||||||
) |
||||||
Xor |
||||||
5. Синтаксический анализ выражения, которое использовалось в п. 2
Синтаксический анализ выполняет определенные функции:
1) выделение синтаксической конструкции
2) классификация синтаксической конструкции
3) определение синтаксической ошибки и, возможно, ее нейтрализация
4) в процессе синтаксического анализа формируется некоторая внутренняя форма представления программы.
Метод параллельного предшествования:
Отношение предшествования, используемые в методе параллельного предшествования:
< аналог отношения простого предшествования
= два символа входят в простую фразу
X>1Y, X - последний символ фразы, Y - следует за Х и находится правее соответствующей простой фразы и Y не является первым символом простой фразы.
X><Y, X - последний символ простой фразы, Y - первый символ следующей простой фразы (Y следует за X)
(>1)=(LAST) (=)
(><)=(LAST) (=) FIRST
Входная цепочка представляется в виде очереди, каждый элемент которой имеет два поля: S - символ цепочки и nx - указатель на следующий символ.
В алгоритме используются следующие обозначения:
TL - текущая литера
NTL - номер текущей литеры
PL - предыдущая литера
ST - следующая литера
SL - стек результата
ST2 - стек преобразований
ST.SIZE - размер стека
ST.PUSH - добавить в «голову» стека
ST.POP - взять (удалить) из «головы» стека
ST.RESET - очистить стек.
Блоки 2-4 производят инициализацию очереди (установка в начальное положение)
Блоки 5-6 производится проверка на наличие отношений между символами, если таковых не существует, то ошибка, иначе продолжается анализ
Блоки 7-10 осуществляется поиск простой фразы
Блоки 10-14 осуществляется редукция простой фразы на левую часть G[i]. 1 правило i из грамматики G
Блоки 15-17 осуществляется сохранение результата редукции и переход на следующий элемент
Блок 18 осуществляется проверка на окончание строки
Блоки 19-23 осуществляется проверка на окончание анализа, если анализ окончен, УСПЕХ, иначе сохранение результата и перевод в начало.
Сентенциальная форма:
1)# NOT A% MOD 5 < C# AND M% ^ 6 ^ I% - SIN (&HA09B + B# - C% * D#) + &B1 > 0 #
2)# NOT ИД MOD конст_10 о_ср ИД AND ИД^ конст_10^ ИД - FUNK (конст_16+ ИД- ИД* ИД)+ конст_2 о_ср ИД #
3)# NOT ИД_К MOD ИД_К о_ср ИД_К AND ИД_К^ИДК^ИДК-FUNK (ИД_К+ ИД_К-ИД_К*ИД_К)+ ИД_К о_ср ИД_К #
4)# NOT A_4 MOD A_4 o_cp A_4 AND A_4^ A_4^ A_4 - FUNK (A_4+ A_4 - A_4* A_4)+ A_4 o_cp A_4 #
5)# NOT A_3 MOD A_3 o_cp A_3 AND A_4^ A_^ A_3 - FUNK (A_3 + A_3 - A_3 * A_3)+ A_3 o_cp A_3 #
6)# NOT A_2 MOD A_3 o_cp A_2 AND A_4^ A_3 - FUNK (A_2 + A_2 - A_2 * A_2)+ A_2 o_cp A_2 #
7)# NOT A_2 o_cp A_1 AND A_3 - FUNK (A_1 + A_1 - A_2 * A_1)+ A_1 o_cp A_1 #
8)# NOT A_1 o_cp A_B AND A_2 - FUNK (A_B + A_1 - A_1)+ A_1 o_cp A_B #
9)# NOT A_B o_cp A_B AND A_1 - FUNK (A_B - A_1)+ A_1 o_cp A_B #
10)# NOT ЗНАК AND A_B - FUNK (A_B)+ A_1 o_cp A_B #
11)# Л_3 AND A_B - FUNK (A_B)+ A_1 o_cp A_B #
12)# Л_2 AND A_B - A_4 + A_1 o_cp A_B #
13)# Л_2 AND A_B - A_3 + A_1 o_cp A_B #
14)# Л_2 AND A_B - A_2 + A_1 o_cp A_B #
15)# Л_2 AND A_B - A_1 + A_1 o_cp A_B #
16)# Л_2 AND A_B + A_1 o_cp A_B #
17)# Л_2 AND A_B o_cp A_B #
18)# Л_2 AND ЗНАК #
19) # Л_2 AND Л_3
20) # Л_2 #
21) # Л_1 #
22) # Л_B #
23) #ВЫРАЖЕНИЕ#
Простые фразы:
1) A%, 5, C#, M%, 6, I%, SIN, &HA09B, B#, C%, D#, &B1, >, 0
2) ИД, конст_10, ИД, ИД, конст_10, ИД, конст_16, ИД, ИД, ИД, конст_2, конст_10
3) ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К, ИД_К
4) A_4, A_4, A_4, A_4, A_4
5) A_3, A_3, A_4^ A_3, A_3, A_3, A_3, A_3, A_3, A_3
6) A_2 MOD A_3, A_2, A_4^ A_3, A_2, A_2, A_2, A_2, A_2
Подобные документы
Основные понятия теории грамматик простого и операторного предшествования, алгоритмы синтаксического разбора предложения для классов КС-грамматик; разработка дерева вывода для грамматики входного языка в форме Бэкуса-Наура с указанием шагов построения.
лабораторная работа [28,0 K], добавлен 24.07.2012Этапы разработки синтаксических и лексических анализаторов, семантических процедур для сканера, а также проектирование алгоритма, реализующего синтаксический анализ методом простого предшествования с помощью языка программирования высокого уровня.
курсовая работа [286,6 K], добавлен 24.09.2010Теоретические и практические основы грамматик, теория конечных автоматов-распознавателей. Эквивалентные и недостижимые состояния конечных автоматов. Классификация грамматик и порождаемых ими языков. Разработка программного комплекса построения грамматик.
курсовая работа [654,2 K], добавлен 14.11.2010Описание математической модели, таблицы истинности. Разработка программы, реализация защитного программирования. Отладка и тестирование программы, инструкция пользователя. Расчет затрат на разработку и коммерческой эффективности проекта от реализации.
дипломная работа [3,2 M], добавлен 18.06.2012Разработка программы для осуществления приведения КС-грамматики к нормальному виду. Особенности преобразования грамматик. Создание алгоритма удаления бесплодных и недостижимых символов, устранения правил с пустой правой частью. Исключение цепных правил.
курсовая работа [1,5 M], добавлен 06.01.2012Особенности и суть языков программирования, способы их задания, цепочки символов и операции над ними. Классификация языков и грамматик, форма Бэкуса-Наура. Определение и свойства регулярных выражений, конечные автоматы и грамматики, описание программы.
курсовая работа [231,5 K], добавлен 23.06.2011Создание приложения по выбору варианта заполнения прямоугольной матрицы: случайными числами или из текстового файла. Идентификаторы метода "main". Расчет количества столбцов, содержащих хотя бы один нулевой элемент. Инструкция по работе с программой.
курсовая работа [563,8 K], добавлен 28.10.2014Роль информационных технологий в быту. Теоретические аспекты формальных грамматик и их преобразование, алфавит нетерминалов. Распознаватель для преобразованной грамматики и реализация его в виде программы для проверки текстовых файлов и вводимых цепочек.
курсовая работа [129,4 K], добавлен 15.06.2009Операторы регулярных выражений, их построение и лексический анализ. Разработка конечного автомата для распознавания регулярных выражений в среде разработки C/C++. Создание программ для поиска в тексте необходимой информации, их тестирование и отладка.
контрольная работа [199,0 K], добавлен 04.06.2013Основные правила разработки интерфейса пользователя. Создание базы данных с использованием разработанных моделей. Кодирование модулей программной системы с целью создания прототипа. Первичное окно при запуске программы. Защита от потери информации.
лабораторная работа [857,8 K], добавлен 13.06.2014