我感到非常怀旧所以我决定写一个冒险游戏创建者,允许用户输入复杂的句子。
我手动滚动了一个使用访问者模式的词法分析器和解析器,它运行得很好,直到我遇到一个左递归问题我的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规则。
答案 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