Earley解析器递归

2 投票
1 回答
1022 浏览
提问于 2025-04-17 21:42

Earley解析器在处理简单循环时会有预期的问题吗?

我自己做了一个实现,但跟这个差不多,这个实现很容易读,大约150行代码(当然,这不是我写的):

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

我觉得这个看起来不错,在提供的测试案例中运行得很好,但这个非常简单的语法

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

似乎不太管用。它应该能生成任意数量的“ident”标记,假设E是起始非终结符,而ident是终结符。但这个语法,以及任何类似风格的语法,解析器完全没有处理。

这是Earley算法的问题吗(我觉得不是),还是这个实现的问题;如果是实现方面的问题,有没有(相对)简单的解决办法,还是说需要重建算法?

1 个回答

2

是的,这里有一个预期的问题,涉及到一些规则的组合,比如:

X1 ::= X2

X2 ::= X3

...

Xn ::= X1

在这种情况下,如果你没有检查已经添加到Earley图表的状态,算法可能会陷入无限递归的循环。

不过在你上面提到的情况中,它不会进入无限循环,因为规则E ::= E E的扩展会受到你输入的限制。你可以在这里查看具体的实现:

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

我已经使用过这个实现,它运行得很好。

撰写回答