Лекция 12 Некоторые свойства контекстно-свободных грамматик • Введем операцию расщепления грамматик. Будем расщеплять грамматику G на несколько грамматиккомпонент G', G1, G2,...,Gn, рассматривая некоторые нетерминальные символы грамматики G как терминальные. • Пусть L - язык, порождаемый исходной грамматикой G; L', L1, L2,…,Ln - языки, порождаемые G', G1, G2,...,Gn (соответственно). Операция расщепления грамматик является обратной к операции подстановки языков L1, L2,…,Ln в язык L' вместо символов a1, a2,…, an. В результате выполнения расщепления нетерминальные символы a1, a2,…, an грамматики G = (N, , P, S) рассматриваются как терминальные в грамматике G' и аксиомами в грамматиках G1, G2,…, Gn. Опишем правила получения грамматик-компонент из исходной грамматики. • 1. G' = (N', ', P', S), где нетерминальный словарь N' = N \ {a1, a2,…, an}, терминальный словарь ' = {a1, a2,…, an}, аксиома грамматики G' есть аксиома грамматики G, схема P' получается из схемы P отбрасыванием всех правил грамматики G, содержащих символы, недостижимые из аксиомы S в грамматике G'. • 2. Строим грамматику Gi = (N \ ' {ai}, i, Pi, ai) следующим образом: • а) G'i = (N \ ' {ai}, , P, ai) • б) исключим все недостижимые символы в грамматике G'i, в результате получим грамматику Gi. • Операция расщепления грамматик используется при построении лексического и синтаксического анализаторов языка: грамматика G' является грамматикой, которая используется при построении синтаксического анализатора (все лексемы языка рассматриваются уже как терминальные символы грамматики), а грамматики G'i описывают правила порождения лексем из множества терминальных символов исходной грамматики и используются при построении лексического анализатора. Лемма 12.1 (лемма Огдена) • Для каждой КС-грамматики G = (N, , P,S) существует такое целое число k 1, что если z L(G), z k и в цепочке z выделены k или более различных позиций, то z можно записать в виде uvwxy, причем • (1) w содержит хотя бы одну выделенную позицию; • (2) либо u и v обе содержат выделенные позиции, либо x и y обе содержат выделенные позиции; • (3) vwx содержит не более k выделенных позиций; • (4) существует такой нетерминал A, что S +G uAy +G uvAxy +G ... +G uviAxiy +G uviwxiy для всех i 0 (в случае i = 0 вывод имеет вид S +G uAy +G uwy). • Доказательство. Пусть m - число элементов множества N и l - длина самой длинной из правых частей множества P. Выберем k = l2m+3 и рассмотрим дерево вывода T некоторой цепочки z L(G), где z k. Пусть в цепочке z выделены, по крайней мере, k позиций. Заметим, что T должно содержать хотя бы один путь длины, не меньшей 2m+3. Выделим листья дерева T, которые в кроне z дерева T занимают выделенные позиции. • Назовем вершину n дерева T ветвящейся, если среди ее прямых потомков есть хотя бы два таких, что среди потомков каждого из них есть выделенные листья. • Построим путь n1, n2,... в дереве следующим образом: • (1) n1 - корень дерева T; • (2) если мы нашли ni и только один прямой потомок этой вершины имеет выделенные листья среди своих потомков (т.е. ni -неветвящаяся вершина), то возьмем в качестве ni+1 этого прямого потомка; • (3) если ni - ветвящаяся вершина, то возьмем в качестве ni+1 того прямого потомка вершины ni, который имеет среди своих потомков наибольшее число выделенных листьев (если таких прямых потомков несколько, то возьмем самый правый); • (4) если ni - лист, то путь построен. • Пусть n1, n2,...np - путь, построенный описанным выше способом. Простой индукцией по i можно показать, что если среди вершин n1, n2,...,ni есть r ветвящихся, то ni +1 имеет, по крайней мере, l2m+3-r выделенных потомков. Базис индукции тривиален: r=0 и n1 имеет, по крайней мере, k = 12m+3 выделенных потомков. Для доказательства шага индукции заметим, что если ni - неветвящаяся вершина, то ni и ni+1 имеют одно и то же число выделенных потомков, а если ветвящаяся, то ni+1 имеет, по крайней мере (1/l)-ую часть выделенных потомков вершины ni. • Так как ni имеет l2m+3 выделенных потомков, то путь n1, n2,...,np содержит, по крайней мере, 2m+3 ветвящиеся вершины. Кроме того, np - лист, и потому он не является ветвящейся вершиной. Следовательно, p > 2m+3. • Пусть b1,b2,...,b2m+3 - это последние 2m+3 вершины, принадлежащие пути n1, n2,...,np. Назовем bi левой ветвящейся вершиной, если прямой потомок вершины bi, не принадлежащий этому пути, имеет выделенного потомка слева от np. В противном случае будем называть bi правой ветвящейся вершиной. • Предположим, что, по крайней мере, m+2 вершины из b1,b2,...,b2m+3 левые ветвящиеся (случай, когда эти вершины правые ветвящиеся, исследуется аналогично). Пусть l1,l2,...,lm+2 - последние m+2 левые ветвящиеся вершины последовательности b1,b2,...,b2m+3. Так как мощность множество N есть m, то среди l1,l2,...,lm+2 можно найти две вершины с одной и той же меткой. Пусть это будут вершины lf и lg, где f < g, а А - метка этих вершин. • Если удалить всех потомков вершины lf, то получится дерево вывода с кроной uAy, где u состоит из листьев, расположенных слева от lf, а y - из листьев, расположенных справа. Таким образом, S +G uAy. Если мы рассмотрим поддерево с корнем lf, из которого удалены потомки вершины lg, то увидим, что A +G vAx, где v и x -части кроны этого поддерева, состоящие из листьев, расположенных соответственно слева и справа от lg. Наконец, пусть w - крона поддерева с корнем lg. Тогда A +G w и, значит, z = uvwxy. Таким образом, получим, что условие (4) выполнено. Кроме того, цепочка u имеет хотя бы одну выделенную позицию, которую занимает потомок некоторого прямого потомка вершины l1. Аналогично, цепочка v имеет хотя бы одну выделенную позицию, которую занимает потомок вершины lf . • Следовательно, условие (2) также выполнено. Условие (1) выполняется потому, что цепочка w имеет выделенную позицию, а именно ту, которую занимает np. • Чтобы проверить выполнение условия (3), заметим, что цепочка b1, будучи (2m+3)-й ветвящейся вершиной от конца пути n1, n2,...,np, имеет не более k выделенных позиций. Так как lf потомок вершины b1, то отсюда следует результат. Следствие (лемма о разрастании для КС-языков) • Пусть L -КС-язык. Тогда существует такая константа k, что если z k и z L, то z можно представить в виде z = uvwxy, где uv, vwx k и uviwxiy L для всех i 0. • Лемма о разрастании позволяет показать, что язык L ={an bn cn n 1} - не КС-язык. Определение 12.1 • Пусть - класс языков и язык L * принадлежит . Допустим, что = {a1,a2,...,an} и языки L1,L2,...,Ln принадлежат . Класс замкнут относительно подстановки, если для любого набора языков L, L1,L2,...,Ln язык, получающийся в результате подстановки языков L1,L2,...,Ln в язык L, принадлежит . Теорема 12.1 • Класс КС-языков замкнут относительно подстановки. Класс КС-языков также замкнут относительно объединения, конкатенации, итерации, позитивной итерации и гомоморфизма. Теорема 12.2 • Класс КС-языков не замкнут относительно пересечения и дополнения. Лемма 12.2 • Если КС-грамматика не является рекурсивной, то порождаемый ею язык конечен. Теорема 12.3 • Для того, чтобы приведенная КС-грамматика порождала бесконечный язык необходимо и достаточно, чтобы она была рекурсивной. • Все современные языки программирования являются бесконечными. Можно убедиться, что порождающие их грамматики являются рекурсивными грамматиками.