Earley解析器在简单循环方面是否存在预期的问题?

我已经实现了自己的实现,但是与该实现非常相似,它非常易读,总共约150行(我当然没有写):

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

那对我来说看起来不错,并且在提供的测试用例中可以完美地工作,但是语法很简单

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


似乎不起作用。假定E是开始的非终结符,并且ident是终结符,它应该生成任意数量的“ ident”令牌。但是,该语法以及任何类似的样式语法都被解析器完全遗漏了。

这是Earley算法(我认为不是)中的问题,还是此实现中的问题?如果基于实现,是否有(相对)简单的解决方案,还是需要重建算法?

最佳答案

是的,该类规则组存在预期的问题:

X1 :: = X2

X2 :: = X3

...

Xn :: = X1

在这种情况下,如果您不检查已添加到Earley图表的状态,则算法可能会进入无限递归循环。

在上面介绍的情况下,它一定不能进入无限循环,因为规则E :: = E E的扩展将受到您输入的限制。在此处检查实施:

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

我已经使用了此实现,并且运行良好。

关于python - Earley Parser递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22311323/

10-11 08:30