Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка целая.docx
Скачиваний:
50
Добавлен:
12.11.2019
Размер:
5.04 Mб
Скачать

§ 2. Грамматики с фразовой структурой

2.1. Основные определения.

О п р е д е л е н и е. Грамматикой с фразовой структу­рой (ГФС) G называется алгебраическая структура, со­стоящая из упорядоченной четверки (N, Т, P, S), где:

а) N и T — непустые конечные алфавиты нетерминальных и терминальных символов соответственно таких, что N T = ;

б) P — конечное множество продукций, P , где V = N T называется словарем G;

в) S N называется начальным символом или источником. //

Предполагая, что символ не содержится в V, соот­ношение ( , ) P обычно записывают в виде .

Понятие продукции, которую также называют прави­лом преобразования, должно давать возможность заме­нять одну строку символов другой. Терминальные симво­лы обычно рассматриваются как неизменяемые символы. Поэтому, возможно, определение продукции в ГФС является чрезмерно общим. На практике соответствую­щие ограничения будут вводиться так, чтобы не нару­шать постоянства терминальных символов, однако сей­час этого определения достаточно.

В качестве первого шага рассмотрим рис. 8.1 и по­пытаемся понять, как он связан со следующими при­мерами.

Пример 2.1. Предложение на английском языке, приведенное ранее в качестве иллюстрации, может быть определено в грамматике G = (N, Т, P, S), где N = {<пред­ложение>, <подлежащее>, <артикль>, <существительное>, <сказуемое>, <дополнение>}; T = {the, dog, bit, me}; P = {(<предложение>, <существительное>, <сказуемое>, <до­полнение>), (<существительное>, <артикль>, <подлежа­щее>), (<артикль> the), (<подлежащее> dog), (<сказуе­мое> bit), (<дополнение> me)}; S = <предложение>.

Эта частная система порождает только одно предло­жение «the dog bit те» и, следовательно, может быть заменена на

N = {<предложение>),

Р = {(<предложение> the dog bit me)}

или даже на

L = {the dog bit me}.

Однако если мы в данном случае захотим расширить язык, чтобы включить в него все предложения, начина­ющиеся со слов, скажем, «the lion», «the rat», «the tiger», со сказуемыми «ate» и «attacked» и дополнениями «you» и «Napoleon» (тогда L будет иметь более 35 элементов), то это может быть сделано добавлением только семи до­полнительных элементов к каждому из множеств T и Р. В этом примере размер языка составляет 4 3 3, в то время как размер множества P примерно равен 4 + 3 + 3. Еще большее значение имеет тот факт, что мы можем включить все предложения вида «the dog bit (the son of)n Napoleon» (их бесконечное множество), добавляя к T и P незначительное число элементов. II

Перед тем как описать механизм порождения пред­ложений, мы должны упомянуть нотацию, введенную Бэкусом (нормальная форма Бэкуса или форма Бэкуса-Наура, БНФ). Она особенно полезна, когда мы хотим использовать элементы из N, которые можно спутать с элементами из T такими, как (предложение) и «пред­ложение». Эта нотация использует четыре символа:

::= (мета-присвоить), < (мета-открыть),

> (мета-закрыть), | (мета-или).

Понятия «мета-открыть» и «мета-закрыть» используют­ся для того, чтобы выделять строки в качестве элемен­тов N, «мета-присвоить» заменяет символ , и если ( , ) Р, ( , ) P, то это может быть записано в виде ::= | , что читается как « есть или ».

БНФ впервые использовалась для определения син­таксиса Алгол-60. В случае если у читателя имеются какие-либо сомнения в том, что БНФ способна опреде­лить что-нибудь серьезное, рекомендуем прочитать сооб­щение про Алгол-60. В работах по формальным языкам обычно избегают длинных строк в N и, следовательно, нотация Бэкуса не используется, за исключением сим­вола мета-или. Обычно прописные буквы используют для обозначения элементов N, а строчные — для элемен­тов Т.

Пример 2.2. Рассмотрим G=(N, Т, P, S), где

N = {S, Т}, Т - {а, b, с, d},

P = {S aTd, T bT | b | cT | c}.

Заметим, что двойное использование T в этом примере не вызывает никаких затруднений.

Грамматика будет порождать все строки a{b, c}+d, однако мы все еще не показали, как этого можно до­стичь. Будем использовать продукции следующим об­разом.

Пусть , ; тогда прямо выводится из , если = и = , где , , , и . Этот факт будем записывать в виде ; он может не­формально рассматриваться как преобразования строки в строку замещением подстроки в на . (Заме­тим, что не обязательно заменять конкретное вхождение в или использовать конкретную продукцию с левой частью . Возможны любые вариации.)

Пусть теперь и слова над V и существует ко­нечная последовательность , , …, , где = , = и ai (i = l, …, r). Тогда будем говорить, что порождает (записывается ) и что вывод из реализуется следующим образом: Аналогично , если вывод использует непустую последовательность прямых выводов. Если V* такое, что S , то называют сентенциальной формой. Более того, если T* и , то является предложением, порожденным G. Таким образом, язык L(G), порожденный G, есть { : Т* и S* }. Там, где G подразумевается, можно определить L(X) ={ : Т*, X N и X }. Поскольку, применяя про­дукции к сентенциальным формам, можно действовать достаточно произвольно, то возможно существование не­скольких допустимых выводных последовательностей для данного предложения в L(G), где G — конкретная грам­матика. Среди этих последовательностей мы выбираем ту, которая на каждом этапе оперирует с самой левой из возможных подстрок, в которой элементы заменяются на элементы из Р. Такая последовательность называется (левой) канонической выводной последовательностью для предложения.

Пример 2.3. Пусть

G=({B}, {( , )}, Р, B),

где

Р = {В (В)|ВВ|( )}.

Тогда предложение ( ) (( ) ( )) может быть выведе­но многими способами.

Приведем пять из них:

1) B BB

( )B

( )(B)

( )(BB)

( )(( )B)

( )(( )( ));

3) B BB

B(B)

( )(B)

( )(BB)

( )(( )B)

( )(( )( ));

5) B BB

B(B)

B(BB)

B(( )B)

( )(( )B)

( )(( )( )).

2) B BB

( )B

( )(B)

( )(BB)

( )(B( ))

( )(( )( ));

4) B BB

B(B)

( )(B)

( )(BB)

( )(B( ))

( )(( )( ));

Первый из этих выводов является каноническим.

2.2. Иерархия Хомского. Обсуждавшаяся до сих пор система — сильное описательное средство, однако при создавшемся положении вещей она является слишком общей. Тем не менее, если наложить ограничения, мы получим более интересный, хотя все еще достаточно мощ­ный математический объект. Начальные ограничения, которые мы будем накладывать па структуру граммати­ки, определяют элементы Р.

Определение (иерархия Хомского). Пусть G=(N, Т, Р, S) является ГФС, описанной в п. 2.1. Такую грамматику называют грамматикой Хомского типа 0. Если все элементы P получаются из формы , где , a , , , x N, , то гово­рят, что G является контекстно-зависимой грамматикой, или грамматикой Хомского типа 1 (КЗГ). (В этом опре­делении строки ,и могут рассматриваться как кон­текст, в котором х может заменяться посредством .) Другим (альтернативным) ограничением для грамма­тики Хомского типа 1 является то, что в каждой продук­ции и должны быть такими, что 1 ≤ | | ≤ |β |. (Экви­валентность этих двух определений неочевидна и доказы­вается ниже.) Если подстановки могут быть выполнены без рассмотрения контекстов, тогда мы можем заменить «контексты» и пустой строкой Λ и получить более слабое ограничение: если x → δ ∈ P, то x N и δ ∈ . Этому ограничению удовлетворяют грамматики Хомского типа 2. Наконец, если P состоит только из продукций вида х→𝛿, где и δ ∈ T TN (так, что правая часть является или единичным терминалом, или единичным терминалом, за которым следует единичный нетерминал), то говорят, что G является грамматикой Хомского типа 3. //

Часто бывает полезно использовать более общие фор­мы внутри множества продукций, хотя формально это и не разрешается. Хотелось бы быть в состоянии вклю­чить пустую строку Λ в качестве правой части любой продукции. Однако, как увидим позднее, это вызывает трудности. Такие Λ - продукции крайне необходимы с об­щей точки зрения, если только Λ ∈ L. В этом случае мы можем добавить S → Λ к P при условии, что S не встре­чается в правой части любой продукции. Однако в неко­торых случаях необходимо разрешать также и более об­щие Л-продукции. Чтобы различать грамматики Хомско­го и те грамматики, в которых разрешаются Λ- продук­ции, введем расширенные версии грамматик Хомского типа 2 и 3 — контекстно-свободные и регулярные грамматики соответственно. Языки, порожденные каким-либо из этих типов грам­матик, имеют аналогичные названия. Так, структурная грамматика порождает структурный язык, структурная грамматика Хомского типа 1 — язык Хомского типа 1, контекстно-свободная грамматика — контекстно-свобод­ный язык, а регулярная грамматика порождает регуляр­ный язык (или регулярное множество). Большинство примеров этой главы будет касаться контекстно-свобод­ных языков, а в гл. 9 мы сконцентрируем внимание на регулярных языках. Однако большинство практических языков являются некоторыми расширениями контекст­но-зависимых языков. Чтобы указать на ограничения контекстно-свободной грамматики, рассмотрим следую­щий важный пример.

Пример 2.4. {xnynzn: п ∈ N} является контекстно-зависимым языком. Предположим, что G = (N, Т, P, S), где

N = {S, X, Y, Z}, T = {x, y, z}, Р = {Р1, ..., Р7),

P1 = S xSYZ, P2 = S xYZ,

Р3 = xY ху, P4 = yY yy, Р5 = yZ yz,

P6 = ZY YZ, P7 = zZ zz.

Вначале заметим, что для любого n ∈ N мы можем по­лучить

S (P1)

(P2)

(P6)

(P3)

(P4)

(P5)

(P7)

поэтому

Теперь мы должны показать, что никакие другие строки не могут быть порождены G. Хотя возможны не­которые изменения в порядке применения правил (P1), (Р2) и (Р6), любое предложение должно выводиться по­средством сентенциальной формы такой, как xnYZ𝛼, где 𝛼 состоит из п - 1 символов Y и Z. Для того чтобы получить строку над T, мы должны в конце концов исполь­зовать правила (Р4), (Р5) и (Р7), однако (Р7) может преобразовать Z в z только в контексте zZ, а (Р5) осу­ществляет такую же замену в контексте yZ. Аналогично для замены Y на у при помощи правил (Р4) и (Р3) тре­буются контексты yY и xY соответственно. На этой ста­дии подстрока хп состоит только из терминалов, поэтому на следующем шаге строка должна иметь вид xnyZ𝛼 и получаться при помощи (P3). Однако мы знаем, что пра­вильное предложение должно порождаться преобразова­нием из Z𝛼 в Yn-1Zn посредством (Р6). Действительно, только таким образом можно успешно получить строку.

Предположим, что мы имеем промежуточную подстро­ку вида yYmZpY𝛽, где 𝛽 состоит из оставшихся элементов Y и Z. Иэ рассуждений, аналогичных приведенным вы­ше, следует, что для получения подстроки ym+1ZpY𝛽 нужно т раз применить (Р4). Однако, если сейчас мы ис­пользуем (Р5) для получения ym+1zZp-1Y𝛽, то никаким правилом нельзя заменить элемент Y на у (или любой другой терминал). Единственный способ выйти из этого положения — это p раз применить (P6), чтобы переме­стить Y влево и, следовательно, получить xnynzn. //

Это пример контекстно-зависимого языка, который, как будет показано, не является контекстно-свободным. Аналогично существуют контекстно-свободные языки, которые не являются регулярными (см. гл. 9). Вернемся теперь к доказательству эквивалентности альтернативных определений контекстно-зависимых грамматик.

Определение. Грамматики G1 и G2 эквивалентны, если

L(G1) = L(G2). //

Предложение. L является контекстно-зависимым языком тогда и только тогда, когда он может быть по­рожден грамматикой, у которой продукции 𝜎→𝜇 удовлетворяют условию 1 ≤ |σ| ≤ |μ|.

Доказательство. Если L —- контекстно-зависи­мый язык, то существует грамматика G с продукциями вида 𝛼Аβ → 𝛼𝛾β, где А N, 𝛾 ∈ и 𝛼, β ∈ V* такие, что L = L(G). Однако

|𝛼Аβ| = |𝛼| + |A| + |β| = |𝛼| + 1 + |β| ≥ 1,

|𝛼𝛾β| = |𝛼| + |𝛾| + |β| ≥ |𝛼| + 1 + |β| = |𝛼Аβ|.

Следовательно, 1 ≤ |𝛼Аβ| ≤ |𝛼𝛾β|, что и требовалось до­казать.

Пусть G = (N, Т, Р, S) — грамматика, у которой про­дукции σ → μ удовлетворяют соотношению 1 ≤ |σ| ≤ |μ|. Мы должны создать грамматику G', эквивалентную G, с продукциями вида 𝛼Аβ → 𝛼𝛾β.

Продукции из G имеют вид

  1. A→ 𝛾1… 𝛾p или же

  2. 𝛼1… 𝛼n → β1…βq, где nq и A N, αi, βi, γi ∈ V.

Во всех продукциях заменим каждый встречающийся элемент aiT новым нетерминальным элементом Ai и включим продукции Ai аi в G'. Продукции типа 1) те­перь имеют правильную форму и включены в G'. Однако продукции типа 2) необходимо модифицировать. Сейчас они имеют вид

W1...WnY1...Yq, n q,

где Wi и Yi являются нетерминальными символами новой грамматики. Для каждой такой продукции введем новые элементы Ŷ1, …, Ŷq, не являющиеся терминалами, и п + q новых продукций: п продукций

W1 ... WnŶ1W2...Wn,

Ŷ1W2, ... WnŶ1Ŷ2W3...Wn, . . . . . . . . . . . .

Ŷ1 ... Ŷn-2Wn-1Wn Ŷ1 ... Ŷn-2Ŷn-1Wn,

Ŷ1 ... Ŷn-2Ŷn-1Wn Ŷ1 ... Ŷn-2Ŷn-1ŶnŶn+1Ŷq

и q продукций

Ŷ1Ŷ2ŶqY1Ŷ2 Ŷq,

Y1Ŷ2ŶqY1Y2Ŷ3 Ŷq,

. . . . . . . . . .

Y1Y2Y q-1ŶqY1Y2Yq-1Yq,

Все эти продукции имеют вид 𝛼Аβ → 𝛼𝛾β.

Новые нетерминалы Ŷ1, …, Ŷq вынуждают приме­нять эти продукции в написанном порядке так, чтобы никакие из предложений, не входящих в исходный язык, не могли быть созданы. //

В заключение этого параграфа обсудим понятие неоднозначности. Классическим примером неоднозначного предложения является предложение

«They are flying planes».

Мы имеем две интерпретации этого предложения, зави­сящие от того, рассматриваем мы «аrе flying» как ска­зуемое или же «flying planes» как дополнение. Это при­водит нас непосредственно к точному определению не­однозначности. Язык называется неоднозначным, если он содержит неоднозначное предложение. Предложение яв­ляется синтаксически неоднозначным, если оно имеет более одного канонического вывода, и семантически неод­нозначным, если для заданного канонического вывода оно имеет более одной интерпретации. (Выводы относятся не непосредственно к языку, а к грамматике, порождающей его. Следовательно, мы должны ссылаться на неоднознач­ную грамматику; однако существуют существенно неод­нозначные языки, которые могут порождаться только не­однозначными грамматиками.) Для более подробного изучения семантических неоднозначностей рекомендуем обратиться к специальной литературе о языках програм­мирования, а сейчас проиллюстрируем синтаксические неоднозначности двумя примерами.

Пример 2.5.

1. Пусть G = ({E}, {1, -}, {Е EE |1}, Е). Тогда

а) E E Е

⇒ 1 Е

⇒ 1 Е Е

⇒ 1 – 1 Е

⇒ 1 – 1 – 1;

а) E E Е

Е E Е

⇒ 1 Е Е

⇒ 1 – 1 Е

⇒ 1 – 1 – 1.

И з этих последовательностей следует, что два указанных вывода являются различными, и, следовательно, хоте­лось бы придать им различные значения. В примере а)

Рис. 8.2

второй знак «минус», вычисляемый вначале, дает 1; в примере б) первый знак «минус», выполняемый пер­вым, дает -1. (Диаграммы на рис. 8.2 иллюстрируют различные структуры.

2. Рассмотрим хорошо известный пример из первой спецификации языка Алгол-60. Сужая грамматику до относящегося к делу подъязыка, будем иметь продукции

S → if В then S else S | if В then S | U,

где S — утверждение, В — булево выражение, U — безусловное утверждение. Теперь рассмотрим выражение

if B1 then if B2 then U1 else U2.

Мы не знаем, принадлежит ли else U2 к if В1 или к if В2. Формально мы можем вывести это предложение, рассматривая B и U как терминалы, следующим образом (рис. 8.3, a, b соответственно):

a) S ⇒ if В then S

⇒ if В then if В then S else S

⇒ if В then if В then U else S

⇒ if B then if В then U else U;

б) S ⇒ if В then S else S

⇒ if B then if B then S else S

⇒ if В then if B then U else S

if В then if B then U else U. //

Рис. 8.3

У п р а ж н е н и е 2.2.

  1. Выразить явно языки, определенные следующими грамматиками:

а) G = ({<число>, {0, 1, 2, …, 9}, Р, <число>), где Р = {<число> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9};

б) G = ({<P>, <L>, <D>, {0, 1, 2, …, 9}, Р, <Р>), где

Р = {<Р> → <L><D> | <L>,

<L> → 1 | 2 | 3 … 8 | 9, <D> <L>, <D> → 0}.

  1. Определить грамматику G' = (N', Т', Р', S'), экви­валентную

G =({A, B, C, S), {х, у, z}, Р, S),

где

Р = {S АВ2С, АВ BAz, zB A2Bx, А х,

В у, C z},

с продукциями вида 𝛼Qβ → 𝛼𝛾β для

Q N', 𝛾∈(N' T')+, 𝛼, β ∈ (N' T')*.

  1. Определить класс Хомского грамматики, опреде­ленной следующим образом:

G = ({A, В, T, S), {x, y, z}, Р, S),

где

P = (S хТВ | хВ, Т хТА | хА,

В yz, Ay уA, Az yzz}.

Используя свойство класса, к которому принадлежит G, установить, принадлежат или нет L(G) следующие строки:

x2yxz, x2y2z2, xyxz.

4. Определить последовательность разрезов представ­ленного здесь производящего дерева, соответствующую самому правому выводу предложения х + x х.

  1. О пределить порядок в множестве продукций P та­ким образом, чтобы была возможность канонического вы­вода, определяющего последовательность целых чисел в N. Продемонстрировать две такие последовательности для предложения «aza» в L(G1), где G1 дано ниже. Вы­вести также строку над N, описывающую все выводы в языке L(G2), т. е. показать, что A A подразумева­ет неоднозначность. Здесь

G1= (N,T,P,E), G2 = (N,T,P,A),

где N = {А, В, С, Е, R}, Т = {a, d, е, х, z} и

P = {А В | Cd, В Вх | еС | С,

C A | xR,E aE | Ea | R, R z}.

  1. Выяснить, являются ли следующие грамматики неоднозначными:

а) G = ({A, В, S}, {а, b, с}, Р, S), где P = {S AB, А а | ab, В c | bc};

б) G = ({<целое без знака>, <число>}, D, P, <целое без знака>), где D = (0, 1, …, 9} и P= {<целое без знака> → <число>),

<число> → <число> <число>, <число> → 0 | 1 | 2…| 9}.