5
|
Leandro Caniglia Charlie · 技术社区 · 6 年前 |
![]() |
1
5
问题是你的语法是
左递归
.PetitParser使用自上而下的贪婪算法来解析输入字符串。如果你遵循这些步骤,你会发现它是从
解决这种情况的技巧是通过添加中间步骤来重写解析器,以避免左递归。基本思想是重写版本在每个循环中将至少消耗一个字符。让我们从简化一点开始,解析器重构“indexed”和“field”的非递归部分,并将它们移到底部。
现在您可以更容易地看到(通过循环)如果递归
现在
我在没有实际测试代码的情况下就写了这个答案,但是应该没问题。解析器可以进一步简化,我将其留作练习;)。 有关左递归消除的更多信息,您可以查看 left recursion elimination |
![]() |
2
6
语法有左递归:
如果有左递归,比如:
您可以像(e是一个空的解析器)那样消除它。
您需要应用两次这个函数来消除递归。 或者,如果不想解析所有可能的标识符组合,可以选择简化语法。 |