Лекция 10 Левокурсивные и правокурсивные грамматики Определение 10.1 • Некоторый нетерминальный символ А контекстно-свободной грамматики G = (N, , P, S) называется рекурсивным, если существует вывод А + А для некоторых и . Если при этом = , то А называется леворекурсивным. Аналогично, если = , то А называется праворекурсивным. Грамматика, имеющая хотя бы один леворекурсивный нетерминальный символ, называется леворекурсивной. Грамматика, в которой все нетерминальные символы, кроме, быть может, начального символа, рекурсивные, называется рекурсивной. • Заметим, что для рекурсивных грамматик в выводе А + А всегда либо , либо . Если = и = , то грамматика G является циклической грамматикой. • Пример 10.1. Примером праворекурсивной грамматики является грамматика со следующей схемой: • <число> <цифра> • <число> <цифра><число> • <цифра> 1 • <цифра> 0 • Данная грамматика порождает множество чисел, состоящих из нулей и единиц. • Пример 10.2. Тот же самый язык, что и в примере 10.1. порождает леворекурсивная грамматика со следующей схемой: • <число> <цифра> • <число> <число><цифра> • <цифра> 1 • <цифра> 0 • Пример 10.3. Примером леворекурсивной грамматики является грамматика со следующей схемой: • <идентификатор> <буква> • <идентификатор> <идентификатор><буква> • <идентификатор> <идентификатор><цифра> • <буква> А • <цифра> 1 • <цифра> 0 • Данная грамматика порождает множество идентификаторов, начинающихся с буквы А. • Пример 10.4. Тот же самый язык, что и в примере 10.3. порождает праворекурсивная грамматика со следующей схемой: • <идентификатор> <буква> • <идентификатор> <буква><символ идентификатора> • <символ идентификатора><буква> • <символ идентификатора> <буква> <символ идентификатора> • <символ идентификатора><цифра> • <символ идентификатора> <цифра> <символ идентификатора> • <буква> А • <цифра> 1 • <цифра> 0 • Рассмотрим алгоритм преобразования КСграмматики, в которой имеется непосредственная левая рекурсия, к КС-грамматике без левой рекурсии. Лемма 10.1 • Пусть G = (N, , P, S) – КС-грамматика, в которой для некоторого нетерминального символа А все Аправила имеют вид • А A1 | A2 | … | Am | 1 | 2 | … | n | • причем ни одна из цепочек i не начинается с А. • Пусть G'=(N{A'}, , P', S), где A' – новый нетерминал, а P' получается из P заменой этих А-правил следующими правилами • А 1 | 2 | … | n | 1A' | 2A' | … | nA' | • А' 1 | 2 | … | m | 1A' | 2A' | … | mA' • Тогда L(G') = L(G). • Доказательство. Цепочки, которые можно получить в грамматике G из нетерминала А применением Аправил лишь к самому левому нетерминалу, образуют регулярное множество • (1 + 2 + … + n )( 1 + 2 + … + m )* • Это в точности те цепочки, которые можно получить в грамматике G' из А с помощью правых выводов, применив один раз А-правило и несколько раз А'правила (в результате вывод уже не будет левым). Все шаги вывода, на которых не используются Аправила, можно непосредственно сделать и в грамматике G', так как не А-правила в обеих грамматиках одни и те же. Отсюда можно заключить, что L(G) L(G'). • Обратное включение доказывается аналогично. В грамматике G' берется правый вывод и рассматриваются последовательности шагов, состоящие из одного применения А-правила и нескольких применений А'-правил. Таким образом, L(G') = L(G). • Грамматика примера 10.4. получена из грамматики примера 10.3. с использованием преобразования леммы 10.1. Лемма 10.2 • Пусть G = (N, , P, S) – КС-грамматика, в которой для некоторого нетерминального символа А все Аправила имеют вид • А A1 | A2 | … | Am | 1 | 2 | … | m • причем ни одна из цепочек i не начинается с А. • Пусть G'=(N, , P', S), где P' получается из P заменой этих А-правил следующими правилами • А 1 | 2 | … | m | 1A | 2A | … | mA • Тогда L(G') = L(G). • Грамматика примера 10.1. получена из грамматики примера 10.2. с использованием преобразования леммы 10.2. На рисунке 10.1. показано, как действуют преобразования на дерево вывода A A A i1 i2 ... A ik A A A ik ik-1 ... i1 • Пример 10.5. Пусть G0 – обычная грамматика с правилами • E E+T • ET • T T*F • TF • F (E) • Fa • Эквивалентная ей грамматика G` • • • • • • • • • • • ET E TE' E' +T E' +TE' TF T FT ' T ' *F T ' *FT ' F (E) F a Рассмотрим теперь, как преобразовать приведенную леворекурсивную КС-грамматику к КС-грамматике, не имеющей левой рекурсии. Алгоритм 10.2 • Устранение левой рекурсии. • Вход: Приведенная КС-грамматика G=(N,,P,S) • Выход: Эквивалентная КС-грамматика G` без левой рекурсии. • Метод. • Пусть N = {A1,…, An}, т.е. все нетерминальные символы грамматики упорядочены некоторым произвольным образом. Преобразуем G так, чтобы в правиле Ai цепочка начиналась либо с терминала, либо с такого Aj, что ji. • 1) Положим i=1. • • • • • • 2) Пусть множество Ai – правил – это Ai Ai | … | Aim | 1 | … | p , где ни одна из цепочек j не начинается с Ak, если k i (если это не выполнено, можно ввести новый нетерминальный символ, заменить первый символ правила этим символом и добавить дополнительное правило в грамматику). Заменим Ai–правила правилами: Ai 1 | … | p | 1Ai' | … | pAi' Ai' 1 | … | m | 1Ai' | … | mAi' где A'i — новый нетерминал. Правые части всех Aiправил начинаются теперь с терминала или с Ak для некоторого k > i. 3) Если i=n, полученную грамматику G' считать результатом и остановиться. В противном случае положить i=i+1 и j=1. • • • 4) Заменить каждое правило вида Ai Aj правилами Ai 1|…|m, полученными в результате замены Aj правыми частями всех Aj-правил вида Aj 1|…|m. Так как правая часть каждого Aj-правила начинается уже с терминала или с Ak для k > j, то и правая часть каждого Aiправила будет теперь обладать этим свойством. 5) Если j=i–1, перейти к шагу (2). В противном случае положить j=j+1 и перейти к шагу (4). Теорема 10.1 • Для каждого КС-языка существует порождающая его не леворекурсивная грамматика. • Доказательство есть следствие приведенных в данном разделе преобразований. • Пример 10.5. Пусть G есть КС-грамматика с правилами • ABCa • BCAAb • CABCCa • Положим A1=A, A2=B и A3=C • После каждого применения шага (2) или (4) алгоритма получаются следующие грамматики (указываем только новые правила). • Шаг (2) для i=1: G не меняется • Шаг (4) для i=2, j=1: BCABCbab • Шаг (2) для i=2: BCAabCABabB • BCb BCb • Шаг (4) для i=3, j=1: CBCBaBCCa • Шаг (4) для i=3, j=2: CCACBabCB CABCBab BCBaBCCa • Шаг (2) для i=3: CabCBab BCBaB a abCBCab BCB CaB CaC • CACB CABCB CCCACB ABCB C Задание 13 • Привести пример лево-рекурсивной грамматики (рекурсия не является непосредственной), устранить в грамматике левую рекурсию.