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

§ 3. Контекстно-свободные языки

3.1. Основные определения. Контекстно-свободные грамматики (КСГ) и контекстно-свободные языки (КСЯ) важны для практических вычислений, так как, хотя большинство языков является некоторым расширением контекстно зависимых языков, их легче изучать как контекстно свободные языки, а затем по другим (семантическим) критериям отбросить некоторые из предложений. В этих случаях на КЗГ можно ссылаться как на грам­матики, специфицированные связанным синтаксисом, а на КСГ — как специфицированные несвязанным синтак­сисом. КСГ также дают возможность прояснить вопросы, содержащие (синтаксическую) неоднозначность.

Последовательность вывода может быть изо­бражена как упорядоченное дерево (см. ниже). Корень дерева обозначен через , и если и , то выходы помечены по порядку . Предположим, что и что достигает­ся в результате применения продукции , где . В дереве это представляется пометкой вершины С и m ее преемников (точек, из которых С достигается за один шаг) . Поэтому метки могут быть оди­наковыми.

П р и м е р 3.1. Рассмотрим грамматику с продук­циями

Обычно в случае контекстно-свободных грамматик мы будем опускать другие эле­менты грамматики; первое правило специфицирует ис­точник, а нетерминалами яв­ляются только символы в левой стороне продукций. В этом случае вывод предло­жения может быть изображен так, как это сде­лано на рис. 8.4. //

Р ис. 8.4

С конструктивной точки зрения это изображение на­зывается деревом вывода. (Когда это дерево используют для того, чтобы проанали­зировать, могут или не могут строки содержаться в L(G), оно называется деревом грамматического разбора.) Легко видеть, что предложение является неоднозначным, если оно имеет два неизоморфных дерева вывода, и что для контекстно-свободных грамматик канонический грамма­тический разбор изоморфен любой другой схеме обхода дерева.

Мы уже установили тот очевидный факт, что КСГ являются более ограниченными, чем КЗГ, но тем не менее они все же обладают весьма широкими изобразитель­ными возможностями.

П р и м е р 3.2. Используя контекстно-свободные правила, можно породить:

  1. все последовательности из символов А:

= ;

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

  1. те же списки, что и в примере 3.2,2, однако допускается возможность пустого списка:

  1. все строки, начинающиеся с последовательности символов А или В и оканчивающиеся символами С или D соответственно:

например,

В этих примерах А, В, С, D и X могут быть опреде­лены дополнительно. //

3.2. Характеристические свойства. Особенностью рас­смотренных выше примеров, о которых вскоре мы смо­жем сказать несколько больше, является свойство рекурсии (один шаг рекурсии при каждом ). Трудности возникают тогда, когда требуется наложить некоторые ограничения на глубину рекурсии, не придумывая новых правил для каждой допустимой глубины рекурсии. Поскольку N и Р конечны, то очевидно, что если не раз­решать никаких рекурсий, то также будет конечен, и этот случай не очень интересен.

Прежде чем идти дальше, введем необходимую тер­минологию. Говорят, что грамматика :

а) леворекурсивная, если в ней имеются выводы вида

, где , ;

б) праворекурсивная, если в ней имеются выводы вида

, где и такие же, как и выше;

в) самовключающая, если она имеет выводы вида

.

Говорят, что КСГ рекурсивна, если имеется один из слу­чаев а) — в). Из сделанных выше замечаний ясно, что желательно бы иметь в грамматике «петли», однако не произвольного типа. К этому вопросу мы вернемся в § 4.

Сформулируем результат о возможностях КСГ. В тео­рии КСЯ это, вероятно, наиболее известный результат. Его доказательство использует рекурсивные свойства КСГ и структуру деревьев. Этот результат известен как лемма о разрастании для КСЯ или же как uvwxy теорема.

Т е о р е м а. Если L — контекстно-свободный язык, то существует такое, что если , то z может быть записано в виде , где , и для любого выполняется условие

u .

Д о к а з а т е л ь с т в о. Поскольку L —контекстно-свободный язык, то он может быть порожден некоторой грамматикой и не имеет продукций, за исключением, возможно, , уменьшающих длину сентенциальных форм, ( , то S также исключают из правых частей продукций для того, чтобы не уменьшалась длина сентенциальных форм. В § 4 показано, что такая грамматика может быть найдена.)

Если не рекурсивна, то, поскольку и конечны, также конечен, и, следовательно, теорема справед­лива, если взять n большим, чем длина самой длинной строки в . С другой стороны, если рекурсивна, то существует дерево вывода, в котором некоторый нетерминал, например , встречается дважды на пути от корня к листу. Эта ситуация изображена на рис. 8.5. (Сюда включены лишь необходимые нам свойства.)

Более того, поскольку рекурсивна, то мы можем добиться выполнения соотношения | , где больше длины самого длинного предложения, полученного путем нерекурсивного вывода( km, где k — длина самой длинной продукции , а m Таким образом, если и то z должно иметь требуемый вид для некоторых пяти строк.

Тогда ) и Следовательно,

для любого . Отсюда, так , имеем

для любого и, таким образом,

для любого . //

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

П р и м е р 3.3. Грамматика из примера 2.4 порождает язык Сейчас мы можем показать, что

Рис.8.5

этот язык является контекстно-зависимым и не может быть порожден КСГ. Из теоремы следует, что существу­ет некоторое достаточно большое n, при котором может быть записано в виде (требуется очевидная замена символов) для некоторых строк . Поскольку х и z в строке разделены, то очевидно, что строки а и b не могут содержать все символы х, у и z; аналогично и для всех других пар из {а, b, с, d, f}. В частности, по крайней мере один из символов и z не может быть одновременно в строках и ; таким образом, строка , которая по теореме содержится в L, содержит не все символы х, у и z (они также могут быть расположены в другом порядке, однако в дальнейшем мы не будем рассматривать эту возможность). Следовательно, мы не получаем тот же самый язык, из чего и следует требуемый результат. //

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

П р и м е р 3.4. Язык не является контекстно-свободным:

.

Предположим, что является КСЯ. Так как существует бесконечное множество простых чисел, то имеется простое число q такое, что

для всех

(это следует из приведенной выше леммы). Таким образом, существуют а, b, с, d, е такие, что

при b+ d > 0 и

для всех , так что —простое число и , a —простое число для всех i N. В частности, qi — простое число при i = a + b + c + d + e + 1, и в этом случае

Однако и ; следовательно, не является простым числом для всех , и мы получаем противоречие. Поэтому L = не является КСЯ.

Этот пример также демонстрирует практическую важность связанного и несвязанного синтаксисов. Можно придумать жесткий фиксированный синтаксис, который включает правильную семантику. Однако, где это возможно, часто гораздо удобнее и эффективнее разрешить использование более широкого языка, порожденного (обычно контекстно-свободной) грамматикой, а затем, если необходимо, сузить множество путем дальнейшей семантической проверки.

В примере 3.4 мы могли бы использовать правило

,

чтобы породить все строки , и после этого про­верить, что «q — простое число», с помощью подходящего арифметического алгоритма.

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

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

1. Вывести КСГ, которая порождает множество всех строк над {а, b}, имеющих равное количество а и b.

2. Построить грамматики, порождающие следующие языки:

а)

б)

в) { : 1}, n, .

3. Используя лемму о разрастании, показать, что язык

не является контекстно-свободным.

4. Показать, что если являются КСЯ, то таким же является язык

5. Доказать, что множества

{xnynzm: , }, {xmynzn: , }

являются КСЯ; показать, что если языки и явля­ются контекстно-свободными, то отсюда не следует, что язык является контекстно-свободным.