Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТА-лекции-2009-10.doc
Скачиваний:
9
Добавлен:
25.12.2018
Размер:
551.94 Кб
Скачать

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