![]() |
|
Главная Промышленная автоматика. G = {N\{a, b}, Р\ S), где N-{5. А, Б, <Л£>, <ВВ>, а}, а Я состоит из правил Sa iABy\BA АВ<ВВу\а B-AS[b <АВ>АВ КВВуВВ 2.4.4. Нормальная форма Грейбах Теперь покажем, что для каждого КС-языка можно найти грамматику, в которой все правые части правил начинаются с терминалов. Построение такой грамматики основано на устранении так называемой левой рекурсии. Определение. Нетерминал А КС-грамматики G = {N, 2, Р, S) называется рекурсивным, если АаА для некоторых а и (1 Если а-е, то А называется леворекурсивным. Аналогично, если ре, то А называется праворекурсивным. Грамматика, имеющая хотя бы один леворекурсивный нетерминал, называется леворекурсивной. Аналогично определяется праворекурсивная грамматика. Грамматика, в которой все нетерминалы, кроме, быть мокет, начального символа, рекурсивные, называется рекурсивной. Некоторые из обсуждаемых далее алгоритмов разбора не могут работать с леворекурсивными грамматиками. Покажем, что каждый КС-язык определяется хотя бы одной не леворекурсивной грамматикой. Начнем с устранения в КС-грамматике непосредственной леворекурснвности. Лемма 2.15. Пусть G = (N, 2, Р, 5) - К.С-грамматика, в которой - все А-пратла из Р и ни одна из цепочек р- не начинается с А. Пусть G = {NU{A\, 2, Р, S) где А - новый нетерминал, а Р получается из Р заменой А-пра-вил правилами ) Тогда L{G)=L(G). AS.- Прим. ред. 1) Надо си;е устранить S т правой части правила В-~) Заметим, что правила А- содержатся как в исходном, так и врезультирующем множестве Л-правил. Доказательство. Цепочки, которые можно получить в грамматике G из нетерминала А при.менением Л-правил лишь к самому левому нетерминалу, образуют регулярное множество (Pi + p2+• • -+Рп) (01 "гг "Ь • • •-г«,г.) *• 0 в точности те цепочки, которые можно получить в G из Л с помощью правых ВЫВОДОВ, применив один раз Л-правило и несколько раз Л-пра-вила. (В результате весь вывод уже не будет левым.) Все шаги вывода в G, на которых не используются Л-правила, можно непосредственно сделать в G, так как ие Л-правила в G и G одни и те же. Отсюда можно заключить, что L {G) L{G). Обратное включение доказывается по существу так же. В G берется правый вывод и рассматриваются последовательности шагов, состоящие из одного применения Л-правила и нескольких применений Л-правил. Таким образом, L (G) -Z(G). □ На рис. 2.13 показано, как действует преобразование, описанное в лемме 2.15, на деревья выводов. Л" Рис. 2.13. Части деревьев: а -часть дерева вС; б -соотиетствующая часть в Q. Пример 2.27. Пусть С -наша обычная грамматика с правилами Е-Е-\-Т\Т T->-T*F\F F{E)\a Если применить к ней конструкцию леммы 2.15, то получится эквивалентная ей грамматика С с правилами Е -Tl+TE T-E\FT F-.{E)\a □ Теперь мы готовы описать алгоритм, устраняющий левую рекурсию из приведенной КС-грамматики. По идее этот алгоритм подобен алгоритму решения уравнений с регулярными коэффициентами. Алгоритм 2.13. Устранение левой рекурсии. Вход. Приведенная КС-грамматика G = {N, 2, Р, S). Выход. Эквивалентная КС-грамматика G без левой рекурсии. Метод. (1) Пусть N = {1, ..AJ. Преобразуем G так, чтобы в правиле А-цепочка а начиналась либо с терминала, либо с такого Лу, что />i. С этой целью положим (2) Пусть множество Л,-правил - это ЛЛ ,.cti ... .. . Л Ipj.. .р„ где ни одна из цепочек ру не начинается с Ai, если ki. (Это всегда можно сделать.) Заменим Л,-пра-вила правилами а. 1Р1Р,ЛП--..М асс,Л-). . .(аЛ- где Ai - новый нетерминал. Правые части всех Л -правил начинаются теперь с терминала или с Л;. для некоторого к > г. (3) Если in, полученную грамматику С считать результатом и остановиться. В противном случае положить г - г--1 и / 1. (4) Заменить каждое правило вида А- Аа правилами Л,--»-ра .. . I рс, где Л-Pi-.-Pm-все Л-правила. Так как правая часть каждого Лу-правила начинается уже с терминала или с Л. для k > /, то и правая часть каждого Л,-правила будет теперь обладать этим свойством. (5) Если ji-l, перейти к шагу (2). В противном случае положить / = / + 1 и перейти к шагу (4). □ Теорема -2.18. Каждый КС-язык определяется не леворекурсивной грамматикой. Доказательство. Пусть G - приведенная грамматика, порождающая КС-язык L. При применении к ней алгоритма 2.13 используются только те преобразования, которые упоминаются в леммах 2.14 и 2.15. Поэтому результирующая грамматика G порождает Е. Сформулируем два утверждения, которые по существу уже встречались в конце описаний ишгов (2) и (4) алгоритма 2.13: (2.4.4) После выполнения шага (2) для / правая часть каждого Л-правила начинается с терминала или с такого Лд, что k> i. (2.4.5) После выполнения шага (4) для i и / правая часть каждого Л-правила начинается с терминала или с такого Л., что k > /. Докажем, что (2.4.4) истинно для всех /г, а (2.4.5) истинно для всех таких пар {i, j), что in и г >/. Рассмотрим значения параметров / н (г, /) утверждений (2.4.4) и (2.4.5) в том порядке, б каком они встречаются в ходе работы алгоритма 2.13 на шаге (2) и шаге (4) соответственно: 1, (2, 1), 2, i-l, (I, 1), .... ( /), {i, i-l), г, . .., (n, rt-1), n и проведем доказательство индукцией по значениям параметров в этом упорядочении. Базис. Так как на шаге (2) цепочки р, р не могут начинаться с Л, то для /1 утверждение (2.4.4) истинно. Шаг индукции. Предположим, что (2.4.4) и (2.4.5) истинны для значений параметров, предшествующих (г, /). Так как / < i, то по предположению индукции (2.4.4) истинно для /. Поэтому на шаге (4) каждая из цепочек р, р начинается с терминала или с такого Af, что k > /. Но после завершения шага (4) цепочки р,, ..., р становятся префиксами правых частей Л-правил. Следовательно, (2.4.5) истинно для (i, /). Так же просто доказывается, что если (2.4.4) и (2.4.5) истинны для значений параметров, предшествующих г, то (2.4.4) истинно для i. Оставляем это в качестве упражнения. Из (2.4.4) заключаем, что нетерминалы Л, ..., Л„ не являются леворекурсивными, так как если Л,=>"Лa для некоторого а, то k > i. Теперь нужно показать, что нетерминалы А(, появляющиеся на шаге (2), не могут быть леворекурсивными. Это непосредственно следует из того, что грамматика G приведенная. На шаге (2) все цепочки а, ..., а„ не пустые, и потому Ai не может быть первым символом правой части правила. □ Пример 2.28. Пусть G определяется правилами А-ВС\а В~СЛ\АЬ С~АВ\СС\а Положим Ау = А, А = В и АС После каждого применения шага (2) или (4) алгориша 2.13 получаются такие грамматики (мы указываем только новые правила): Шаг (2) для i = G не меняется Шаг (4) для 1 = 2, /-1: В--СА\BCblab Шаг (2) для 1 = 2; В ~СА {аЬ {САВ\аЬВ ВСЬВ\СЬ Шаг (4) для i-3, /-1: СВСВ\аВ\СС\а Шаг (4) для 1 = 3, 1 = 2: С~>СЛCSIаЬСВIСАВСВ\аЬВСВ \аВ\CC\a Шаг (2) для г=3: С -> аЬСВ I аЬВСВ \аВ\а\ аЬСВС \ аЬВСВС \ аВС \ аС С ~> АСВС I АВСВС 1СС \ АСЕ \ АВСВ \ С □ Интересный частный случай не леворекурсивной грамматики- грамматика в нормальной форме Грейбах. Определение. КС-грамматика G=(N, 2, Р, S) называется грамматикой в нормальной форме Грейбах, если в ней нет е-правил и каждое правило из Р, отличное от S~e, имеет вид Л -аа, где aS и aN*. Если грамматика не леворекурсивна, то на множестве ее нетерминалов можно определить естественный частичный порядок. Этот частичный порядок можно вложить в линейный порядок, полезный при преобразовании грамматики к нормальной форме Грейбах. Лемма 2.16. Пусть G = (N, S, Р, 3)~~не леворекурсивная грамматика. Существует такой линейный порядок < на N, что если АВа принадлежит Р, то Л < В. Доказательство. Пусть R - такое отношение на N, что ARB тогда и только тогда, когда Л=>+Ва для некоторого а. Так как грамматика G не леворекурсивна, то R - частичный порядок (транзитивность легко доказывается). Отношение R можно расширить до линейного порядка <, обладающего нужным свойством (см. алгоритм 0.1). П Алгоритм 2.14. преобразование к нормальной форме Грейбах. Вход. Не леворекурсивная приведенная КС-грамматика G-(N, 2, Р, S). Выход. Эквивалентная грамматика 6 в нормальной форме Грейбах. Метод. (1) Построить с помощью леммы 2Л6 такой линейный порядок < на N, что каждое Л-правило начинается либо с терминала, либо с такого нетерминала В, что Л < В. Упорядочить N-Hi, AJ так, что Л < Л, <... <Л„. (2) Положить i=n-1. (3) Если г =0, перейти к шагу (5). В противном случае заменить каждое правило вида ЛЛа, где ; > г, правилами Л-Ра!.. .]р,,а, где Л-,. .р--все Лу-правила. Позже мы убедимся, что каждая из цепочек р, р„ начинается терминалом. (4) Положить i = t-1 и вернуться к шагу (3). (5) Сейчас правая часть калдаго правила (кроме, возможно, S->е) начинается терминалом. В каждом правиле Л-аХ.. .Х заменить Ху 2 новым нетерминалом X}. (6) Для новых нетерминалов XJ, введенных на шаге (5), добавить правила -t-Xy. П Теорема 2.19. Если L - КС-язык,.то L = L{G) для некоторой грамматики G в нормальной форме Грейбах. Доказательство. Индукцией по п - i (т. е. по i, но в обратном порядке, начиная с i = n-\ и кончая ( = 1) можно показать, что после выполнения шага (3) алгоритма 2.14 для i правая часть каждого Л,-правила начинается терминалом. Ключевой момент здесь-использование линейного порядка <. После шага (5) грамматика преобразуется к нормальной форме Грейбах и по лемме 2.14 порождаемый ею язык не изменится. □ Пример 2,29. Рассмотрим грамматику G с правилами ЕТ\ТЕ Т-Р\ГГ F{E)\a Упорядочим нетерминалы следующим образо.м: Е < Е <Т < Г <F. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [29] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 0.002 |