如何在以下语法中消除左递归?

时间:2009-07-08 01:52:21

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

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

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

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

接受:

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

拒绝:

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

2 个答案:

答案 0 :(得分:4)

手工完成:

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

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

L :: = { L } L 1 | →<子> 1
L 1 :: =ε| , L L 1

答案 1 :(得分:0)

首先,该语法不会接受你的第一个例子,因为它要求逗号位于close括号之后和open括号之前。我建议将其重新编写为

L::= {L} | ,L

这不会消除左递归,但它至少会与你接受的答案相匹配。