Разработка формальных грамматик
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-го типа:
Обозначение лексемы | Смысл лексемы |
конст_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! е.
е = «"! «*»!» –"! «+»! «*»! «/"! «^»!»)"! «=»! «<»! «>».
н,д |