Earley解析器是否预期了简单循环的问题?
我已经制作了自己的实现,但它非常类似于这个,它非常易读,总共约150行(我当然没有写它):
http://www.nightmare.com/rushing/python/earley.py
那个对我来说很好看,并且在提供的测试用例中完美运行,但是非常简单的语法
E : [[E,E],[ident]]
似乎不起作用。 应生成任意数量的“ident”令牌,假设E是起始非终端且ident是终端。但是这个语法和任何类似的样式语法都被解析器完全遗漏了。
这是Earley算法中的一个问题(我认为不是这样),或者是这个实现中的问题;如果它是基于实现的,是否有(相对)简单的解决方案或者算法是否需要重建?
答案 0 :(得分:1)
是的,它有一组预期的问题:
X1 :: = X2
X2 :: = X3
...
Xn :: = X1
在这种情况下,如果您没有检查已经添加到Earley图表中的状态,算法可以输入无限递归循环。
如果你上面提到的话,它不能进入无限循环,因为规则E :: = E E的扩展将受到你的输入的限制。检查这里的实现:
https://en.wikipedia.org/wiki/Earley_parser#The_algorithm
我已经使用过这个实现,但它运行正常。