【问题标题】:How can I eliminate left recursion in the following grammar?如何消除以下语法中的左递归?
【发布时间】:2009-07-08 10:27:55
【问题描述】:

这是语法,它应该描述一种用逗号作为分隔符的嵌套大括号的语言:

L ::= {L} | L,L |

我希望语法接受和拒绝的更多字符串示例:

接受:

{,{,,{,}},,{,}}
{{{{}}}}
{,{}}

拒绝:

{}{}
{,{}{}}
{{},{}

【问题讨论】:

  • 您使用什么工具来获取左递归错误?
  • 不是家庭作业,只是想通过一本关于编译器的书来完成我的工作。为了好玩,我发誓!

标签: language-agnostic syntax context-free-grammar


【解决方案1】:

手工完成:

L ::= { L } | { L } , | , L | ε

或者,我们可以使用更系统的方法,并在removing immediate left recursion 上应用来自维基百科的算法,而不是仅仅使用它:

L ::= { L } L1 | L1
L1 ::= ε | ,L L1

【讨论】:

  • 想不出从这个语法导出{{},}的方法
  • @litb:外部 {} 是第一条规则 {L} {},首先是第二条规则 L,L,其中第一个 {} 和第二个为空。
  • 点头,我只是点击了你的意思是 JK 的语法 vs. wkf 是我的坏。
【解决方案2】:

首先,该语法不会接受您的第一个示例,因为它要求逗号位于右大括号之后和左大括号之前。我建议将其重写为

L::= {L} | ,L

这不会摆脱左递归,但它至少会匹配您可接受的答案。

【讨论】:

  • 不正确。他的语法将接受{,},其中“,”由 L1=L2,L3 产生,L2 和 L3 为空。
  • 你的权利 - 我没有意识到那是最后的空规则的重点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多