Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[01] Соколов В.А. Формальные языки и грамматики....doc
Скачиваний:
96
Добавлен:
29.10.2018
Размер:
1.44 Mб
Скачать

ГГрамматики

рамматика – это один из точных способов задания языка. Грамматические правила позволяют определять, является ли та или иная языковая конструкция правильной с точки зрения данного языка, т.е. принадлежит ли она этому языку или нет.

Пример 1.4.

Рассмотрим фрагмент грамматики (обозначим его GA) языка программирования, описывающий все арифметические выражения, которые можно построить, используя идентификаторы a, b, c.

<выражение> : : = <терм> | <выражение> + <терм> | <выражение> – <терм>

<терм> : : = <множитель> | <терм> ´ <множитель> | <терм>/<множитель>

<множитель> : : = a | b | c | (<выражение>)

Эту стандартную запись в форме Бэкуса-Наура можно упростить, введя буквенные обозначения для входящих в грамматические правила понятий:

<выражение> = Е

<терм> = Т

<множитель> = F.

Тогда грамматика GA будет выглядеть следующим образом:

E ® T | E + T | ET

T ® F | T ´ F | T / F

F ® a | b | c | (Е).

Определение 1.5.

Грамматикой G называется следующая упорядоченная четверка объектов G = (N, T, S, P), где

N – конечное множество нетерминальных символов, называемых переменными (или нетерминалами);

T – конечное множество терминальных символов, называемых терминалами;

Sначальный символ, S Î N;

P – конечное множество правил вывода, называемых продукциями.

Здесь и далее предполагается, что множества N и Т непустые и не пересекаются.

Продукции – это основной механизм грамматики, с помощью которого можно преобразовать одну строку символов в другую и таким образом порождать язык, определяемый данной грамматикой.

Каждая продукция р Î Р имеет вид a ® b, где

a Î (N È T)+, b Î (N È T)*.

Результатом применения продукции р : a ® b к строке g = jay является строка d = jby, полученная из g подстановкой вместо подстроки a (левой части продукции) строки b (правой части продукции).

Это преобразование записывается так: g d, или g d, когда просто хотят сказать, что d получается из g применением некоторой продукции из грамматики G. В этом случае говорят, что строка d выводится из строки g (в грамматике G) применением продукции p.

Если применять продукции p1, p2, ..., pn-1 грамматики G последовательно к получающимся строкам, то это можно записать в виде:

a1 a2 a3 ... an.

В этом случае говорят, что строка an выводится из строки a1 (в грамматике G) и пишут a1 an. Символ * указывает здесь любое конечное число шагов, включая 0, т.е. случай a a. Если же надо указать, что, по крайней мере, одна продукция в действительности должна быть применена, то пишут a b.

Грамматика определяет тот язык, строки которого могут быть выведены из некоторой фиксированной строки (начального элемента) применением продукций этой грамматики.

Определение 1.6.

Пусть G = (N, T, S, P) – грамматика. Тогда множество

L(G) = {a | aÎ T* и S a}

называется языком, порождаемым грамматикой G.

Если a Î L(G), то любая последовательность вида

S a1 a2 a3 ... an a

называется выводом строки a в грамматике G; при этом, если a Î T*, то a называется сентенцией (или словом), а ai – сентенциальной формой (в грамматике G).

Если известно, в какой грамматике G рассматривается вывод a b, то можно не писать символ G.

Пример 1.7.

Рассмотрим грамматику

G = ({S}, {a, b}, S, P),

где Р состоит из двух продукций:

S ® aSb ,

S ® e.

Тогда, очевидно, в G можно построить вывод:

S Þ aSb Þ aaSbb Þ aabb,

т.е. S a2b2.

Следовательно, строка a2b2 Î L(G).

Как получить явное описание этого языка? К сожалению, это не всегда возможно. В данном случае можно показать, что L(G) = {anbn | n ³ 0}. Докажем это индукцией. В качестве параметра n индукции возьмем длину вывода, т.е. число применений продукций в последовательности SÞa1Þ...Þan.. Покажем, что получающиеся при этом сентенциальные формы an имеют вид anSbn или a n – 1b n – 1, n ³1.

Пусть n = 1, тогда либо a1 = aSb, либо a1 = e, что составляет базу индукции.

Допустим, что наше утверждение верно для всех n £ k. Пусть теперь n = k + 1, k ³ 0. Рассмотрим вывод длины k + 1:

S Þ a1 Þ ... Þ ak Þ ak+1.

По нашему предположению, ak = akSbk, так как к строке ak–1bk–1 продукции применить уже нельзя. На (k+1)-м шаге возможно применение одной из двух продукций грамматики G. Если применить первую, то получим строку ak+1Sbk+1, а если вторую, то строку akbk, что согласуется с предположением индукции. Таким образом, наше утверждение верно, и ничего другого, кроме строк вида anSbn или anbn, из S получить невозможно. В то же время легко заметить, что любая строка вида anbn для n ³ 0 выводима из S.

Может случиться, что две разные грамматики порождают один и тот же язык. Так, если в грамматику G из примера 1.7. добавить продукцию S ® A, то это не изменит язык (хотя и изменит множество сентенциальных форм).

Две грамматики G1 и G2 называются эквивалентными, если они порождают один и тот же язык, т.е. если L(G1) = L(G2).