- •Теория алгоритмов Алгоритм и его свойства
- •Формализация понятия «алгоритм»
- •Машины Поста
- •Машины Тьюринга
- •Нормальные алгорифмы Маркова
- •Рекурсивные функции
- •Сложность алгоритма
- •7. Формальные грамматики
- •7.1. Понятие формальной грамматики
- •7.2. Деревья вывода
- •7.3. Классификация языков по Хомскому
- •7.4. Распознающие автоматы
- •7.5. Понятие транслятора
- •7.6. Основные функции компилятора. Лексический анализ
- •7.7. Переход от недетерминированного распознающего автомата к детерминированному
- •7.8. Переход от праволинейной грамматики к автоматной
- •7.10. Детерминированные автоматы с магазинной памятью
7. Формальные грамматики
7.1. Понятие формальной грамматики
Формальная грамматика - это четверка G = <VN,VT, P, S >, в которой
VN - нетерминальный словарь (множество нетерминальных символов);
VT - терминальный словарь (множество терминальных символов ) ;
P - множество грамматических правил;
S VN - начальный нетерминальный символ.
Метаязык - язык, с помощью которого описывается язык:
::= - есть по определению;
| - “ исключающее или”;
< ... > - внутри – один нетерминальный символ ;
[ ] - необязательная часть;
, - запятая – разделитель при перечислении.
Пример: Построим грамматику G1:
<прог>::=<оп> | <оп>; <прог>
<оп>::=<пер> := <выр>
<пер>::=a | b | c
<выр>::=<пер> | <пер> <зн> <выр>
<зн>::= + | - | * | /
V = VN VT - обобщенный словарь.
V* - цепочка символов (строка, слово) из обобщенного словаря;
V*N - цепочка символов (строка, слово) из нетерминального словаря;
V*T - цепочка символов (строка, слово) из терминального словаря.
V - пустой символ, входит в обобщенный словарь.
Строка непосредственно порождает строку и обозначается: ,
если = vxw = vyw и существует некоторое правило p: x::= y,
где v,w, V* , х VN, у = V* \ {}
Строка порождает строку и обозначается * , когда от строки можно перейти к строке с помощью последовательности непосредственных порождений.
Продолжая пример:
<прог> <оп> ; <прог> <оп> ; <оп> <пер> := <выр> ; <оп> *
a := b + c; c := a + b - c;
Грамматика, использующая процедуры (непосредственного) порождения – порождающая грамматика.
Строка непосредственно свертывается в строку и обозначается: ,
если = vxw = vyw и существует некоторое правило p: x::= y,
где v,w, V* , х VN, у = V* \ {}
Строка свертывается в строку и обозначается * , когда от строки можно перейти к строке с помощью последовательности непосредственных свертываний.
Грамматика, использующая процедуры (непосредственного) свертывания –распознающая грамматика.
Строки символов из обобщенного словаря, получающиеся в процессе порождения или свертывания, называются сентенциальными формами.
Язык L, порождаемый данной грамматикой G - множество нетерминальных цепочек, порождаемых из начального нетерминального символа. Такие терминальные цепочки называются предложениями данного языка.
L(G) = { x V*N | S * x }
Аналогично можно определить язык L через свертывание.
L(G) = { x V*N | S * x }
Замечание. Другой вариант метаязыка
вместо ::= используется стрелка , терминальные символы записываются маленькими (строчными) буквами, а нетерминальные – большими (прописными) буквами.
Такой вариант мета языка чаще используется в математической литературе. Первый предпочитают использовать в литературе для программистов. Так что мы будем пользоваться и тем и другим вариантами…
7.2. Деревья вывода
Порождение и свертывание можно также представлять с помощью деревьев вывода.
Пусть дана грамматика.
I T
I I + T
I I - T
T M
T T*M
T T/M
M (I)
M K
K a
K b
K c
Построим дерево вывода.
Для предложения a * b + c дерево вывода будет:
I
I T
T M
T * M K
M K c
a b
Этот же результат можно получить и другим способом:
I I + I
I I - I I
I I*I
I I/I I + I
I (I)
I a I * I c I b
I c a b