Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Левая факторизация




Пример 13

Устранение левой рекурсии

Грамматика является леворекурсивной, если в ней имеется нетерминал А, такой, что существует порождение А => Аα для некоторой строки α. Методы нисходящего разбора не в состоянии работать с леворекурсивными грамматиками, поэтому требуется преобра­зование грамматики, которое устранило бы из нее левую рекурсию. Рассмотрим общий случай. Леворекурсив­ная пара продукций А à Аα | β может быть заменена нелеворекурсивными продукциями

A à βА'

А' à αА' | λ

без изменения множества строк, порождаемых из А. Этого правила достаточно для мно­гих грамматик.

Рассмотрим следующую грамматику для арифметических выражений.

E à E+T | Т

T à t*f | f (5.10)

F à (E) | id

Устранив непосредственную левую рекурсию (продукции вида А —>Аα) из продукций для Е и Т, получим

E à TE'

E' à +TE' | λ

T à FT'

T' à *FT' | λ

F à (E) | id

Общее количество А-продукций роли не играет. Можно устранить непосредственную левую рекурсию из них с помощью следующей технологии. Вначале группируем А-продукции.

A à Aα1 | Aα2|…| Aαm| β 1| β 2|…| β n

где βi не начинаются с А. Затем заменим эти А -продукции

A' -> α1А' | α2А' |…| αmА' | λ

Нетерминал А порождает те же строки, что и ранее, но без левой рекурсии. Эта процеду­ра устраняет все непосредственные левые рекурсии из продукций для А и А' (при усло­вии, что ни одна строка αi не является λ), но не устраняет левую рекурсию, вызванную двумя или более шагами порождения. Например в грамматике

S à Аа | b

А à Ac | Sd | λ (5.11)

Нетерминал S леворекурсивен, поскольку S => Аа => Sda, но эта рекурсия не является не­посредственной.

Алгоритм устранения левой рекурсии гаран­тированно работает с грамматиками, не имеющими циклов и λ –продукций. Из грамматики могут быть также удалены и цик­лы, и λ –продукции.

Левая факторизация представляет собой преобразование грамматики в пригодную для предиктивного анализа. Основная идея левой факторизации заключается в том, что когда не ясно, какая из двух альтернативных продукций должна использоваться для нетерминала А, A-продукции можно переписать так, чтобы отложить принятие решения до тех пор, пока из входного потока не будет прочитано достаточно символов для правильного выбора.

Например, если есть две продукции

stmt à if expr then stmt else stmt

| if expr then stmt (5.12)

то, обнаружив во входном потоке if, нельзя тут же выбрать ни одну из них. В общем случае, если А à αβ1, | αβ2 представляют собой две A-продукции и входной поток начинается с непустой строки, порождаемой α, то нельзя сказать какая продукция будет использоваться первая или вторая продукция. Однако можно отложить решение, расширив А до αА'. В этом случае, после того как рассмотрен входной поток, выводимый из α, работаем с А', расширяя его до β1 или β2. Таким образом, будучи левофакторизованными, исходные продукции становятся

А à αА'

А' à β1| β2




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 701; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.