Эрли Парсер Рекурсия

У парлера Earley ожидаемые проблемы с простыми циклами?

Я сделал свою собственную реализацию, но она очень похожа на эту, которая очень удобочитаема и имеет в общей сложности около 150 строк (и я, конечно, не писал ее):

http://www.nightmare.com/rushing/python/earley.py

Это хорошо для меня выглядит и отлично работает в предоставленном тестовом примере, но очень простая грамматика

E : [[E,E],[ident]]

не похоже на работу. Он должен генерировать произвольное количество токенов "identif ", предполагая, что E является начальным нетерминалом, а identif ier является терминалом. Но эта грамматика и любая подобная грамматика стиля полностью игнорируются синтаксическим анализатором.

Это проблема в алгоритме Эрли (я так не думаю) или проблема в этой реализации; если это основано на реализации, есть ли (относительно) простое решение или алгоритм должен быть перестроен?

1 ответ

Да, у него ожидаемая проблема с группами правил такого рода:

X1:: = X2

X2:: = X3

...

Xn:: = X1

В этом случае алгоритм может войти в бесконечный цикл рекурсии, если вы не проверяете состояния, которые вы уже добавили в диаграмму Эрли.

В представленном выше случае он не должен входить в бесконечный цикл, так как расширения правила E::= E E будут ограничены вашим вводом. Проверьте реализацию здесь:

https://en.wikipedia.org/wiki/Earley_parser

Я уже использовал эту реализацию, и она отлично работает.

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