1 / 15

Лекция 12

Лекция 12. Некоторые свойства контекстно-свободных грамматик. Введем операцию расщепления грамматик. Будем расщеплять грамматику G на несколько грамматик-компонент G', G1, G2,...,Gn, рассматривая некоторые нетерминальные символы грамматики G как терминальные.

Download Presentation

Лекция 12

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Введем операцию расщепления грамматик. Будем расщеплять грамматику 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. Опишем правила получения грамматик-компонент из исходной грамматики.

  3. 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.

  4. Операция расщепления грамматик используется при построении лексического и синтаксического анализаторов языка: грамматика G' является грамматикой, которая используется при построении синтаксического анализатора (все лексемы языка рассматриваются уже как терминальные символы грамматики), а грамматики G'i описывают правила порождения лексем из множества терминальных символов исходной грамматики и используются при построении лексического анализатора.

  5. Лемма 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).

  6. Доказательство. Пусть m - число элементов множества N и l - длина самой длинной из правых частей множества P. Выберем k = l2m+3 и рассмотрим дерево вывода T некоторой цепочки z  L(G), где z k. Пусть в цепочке z выделены, по крайней мере, k позиций. Заметим, что T должно содержать хотя бы один путь длины, не меньшей 2m+3. Выделим листья дерева T, которые в кроне z дерева T занимают выделенные позиции. • Назовем вершину n дерева T ветвящейся, если среди ее прямых потомков есть хотя бы два таких, что среди потомков каждого из них есть выделенные листья.

  7. Построим путь n1, n2,... в дереве следующим образом: • (1) n1 - корень дерева T; • (2) если мы нашли ni и только один прямой потомок этой вершины имеет выделенные листья среди своих потомков (т.е. ni -неветвящаяся вершина), то возьмем в качестве ni+1 этого прямого потомка; • (3) если ni - ветвящаяся вершина, то возьмем в качестве ni+1 того прямого потомка вершины ni, который имеет среди своих потомков наибольшее число выделенных листьев (если таких прямых потомков несколько, то возьмем самый правый); • (4) если ni - лист, то путь построен.

  8. Пусть 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.

  9. Пусть 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, а А - метка этих вершин.

  10. Если удалить всех потомков вершины 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 .

  11. Следовательно, условие (2) также выполнено. Условие (1) выполняется потому, что цепочка w имеет выделенную позицию, а именно ту, которую занимает np. • Чтобы проверить выполнение условия (3), заметим, что цепочка b1, будучи (2m+3)-й ветвящейся вершиной от конца пути n1, n2,...,np, имеет не более k выделенных позиций. Так как lf потомок вершины b1, то отсюда следует результат.

  12. Следствие (лемма о разрастании для КС-языков) • Пусть L -КС-язык. Тогда существует такая константа k, что если z k и z  L, то z можно представить в виде z = uvwxy, где uv, vwx k и uviwxiy  L для всех i  0. • Лемма о разрастании позволяет показать, что язык L ={an bn cn n  1} - не КС-язык.

  13. Определение 12.1 • Пусть  - класс языков и язык L * принадлежит . Допустим, что  = {a1,a2,...,an} и языки L1,L2,...,Ln принадлежат . Класс  замкнут относительно подстановки, если для любого набора языков L, L1,L2,...,Ln язык, получающийся в результате подстановки языков L1,L2,...,Ln в язык L, принадлежит .

  14. Теорема 12.1 • Класс КС-языков замкнут относительно подстановки. Класс КС-языков также замкнут относительно объединения, конкатенации, итерации, позитивной итерации и гомоморфизма. Теорема 12.2 • Класс КС-языков не замкнут относительно пересечения и дополнения.

  15. Лемма 12.2 • Если КС-грамматика не является рекурсивной, то порождаемый ею язык конечен. Теорема 12.3 • Для того, чтобы приведенная КС-грамматика порождала бесконечный язык необходимо и достаточно, чтобы она была рекурсивной. • Все современные языки программирования являются бесконечными. Можно убедиться, что порождающие их грамматики являются рекурсивными грамматиками.

More Related