Некоторые свойства контекстно-свободных грамматик Лекция 12

advertisement
Лекция 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
• Для того, чтобы приведенная КС-грамматика
порождала бесконечный язык необходимо и
достаточно, чтобы она была рекурсивной.
• Все современные языки программирования являются
бесконечными. Можно убедиться, что порождающие
их грамматики являются рекурсивными
грамматиками.
Download