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/