Может ли кто-нибудь объяснить мне, почему рекурсивные спускающие парсеры не могут работать с грамматикой, содержащей левую рекурсию?
Почему рекурсивный спуск парсер не может обрабатывать рекурсию
Ответ 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.