Почему парсер рекурсивного спуска не может обработать рекурсию - PullRequest
22 голосов
/ 11 мая 2009

Может кто-нибудь объяснить мне, почему парсеры рекурсивного спуска не могут работать с грамматикой, содержащей левую рекурсию?

Ответы [ 2 ]

30 голосов
/ 11 мая 2009

рассмотреть следующие вопросы:

A ::= A B

эквивалентный код

boolean A() {
    if (A()) {
        return B();
    }
    return false;
}

видите бесконечную рекурсию?

17 голосов
/ 11 мая 2009

Для тех, кто заинтересован

 A ::= A B | A C | D | E

можно переписать как:

 A ::= (D | E) (B | C)*

Общая форма преобразования такова: любой из не левосторонних рекурсивных дизъюнктов, за которым следует любое количество левых рекурсивных дизъюнктов без первого элемента.

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

...