删除左递归

时间:2013-07-15 08:11:31

标签: bnf left-recursion

我感到非常怀旧所以我决定写一个冒险游戏创建者,允许用户输入复杂的句子。

我手动滚动了一个使用访问者模式的词法分析器和解析器,它运行得很好,直到我遇到一个左递归问题我的BNF(Backus-Naur Form)规则之一:

object          ::= {adjective} noun 
                  | object AND {adjective} noun 

删除左递归后by following this wiki entry 看起来不错吗?

object      ::= {adjective} noun object2
object2     ::= AND {adjective noun} 
              | !Empty

编辑:

我按照给定here的指南,使用C#滚动词法分析器和解析器。我没有使用任何解析器生成器进行此练习。

另外,我从this website获得了解析器的BNF规则。

2 个答案:

答案 0 :(得分:2)

在这种情况下,有没有理由更喜欢左递归而不是右递归?这不会更简单:

object ::= {adjective} noun |
           {adjective} noun AND object

如果你真的想让你的解决方案有效,你需要让object2正确递归:

object      ::= {adjective} noun object2
object2     ::= AND {adjective noun} object2 |
                !Empty

答案 1 :(得分:2)

通常我有这个规则(你的):

object          ::= {adjective} noun | 
                    object AND {adjective} noun 

我应用以下转换:

第1阶段(仍然是递归) -

object          ::= ad_noun | 
                    object AND ad_noun

ad_noun         ::=  {adjective} noun 

第2阶段(改为右递归) -

object          ::= ad_noun | 
                    ad_noun AND object

ad_noun         ::=  {adjective} noun 
相关问题