КАТЕГОРИИ: Архитектура-(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; Просмотров: 735; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |