Подтвердить что ты не робот

Почему рекурсивный спуск парсер не может обрабатывать рекурсию

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

4b9b3361

Ответ 1

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

A ::= A B

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

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

см. бесконечную рекурсию?

Ответ 2

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

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

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

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

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

Реформирование кода действия - это небольшая обманка, но я уверен, что это может быть plug-n-chug.