Почему грамматика может генерировать строку, но не может быть распознана тем же парсером рекурсивного спуска?

Например, у нас есть грамматика S-> aSa | аа, ясно, что эта грамматика может генерировать все строки четной длины. Если мы разработаем синтаксический анализатор с рекурсивным спуском для этой грамматики, почему входы типа "aa", "aaaa", "aaaaaaaa" могут быть распознаны, а "aaaaaa" не может быть распознан?

Вот моя мысль:

Для "aa" попробуйте S-> aSa, "a" соответствует, однако "S" не соответствует, обратный ход. попробуй S-> aa, спички.

Для "aaaa" попробуйте S-> aSa, совпадения 'a', попробуйте S-> aSa, у нас есть aaSaa, S не совпадает, попробуйте S-> aa, у нас есть aaaa, совпадения.

Для "aaaaaa", попробуйте S-> aSa, совпадения 'a', попробуйте S-> aSa, у нас есть aaSaa, попробуйте S-> aSa, у нас есть aaaSaaa, не совпадает, попробуйте S-> aa, у нас есть "aaaaaa",

я не знаю, что с частью 'aaaaaa'.

почему аааааа нельзя узнать?

1 ответ

Потому что в простом парсере с рекурсивным спуском возврат не разрешен.

Парсеры рекурсивного спуска читают токены слева направо, читая каждый токен один раз.

Конечно, вы можете узнать это с помощью рекурсивного анализатора спуска; но тогда у парсера уже нет линейного времени.

Другие вопросы по тегам