Coding style 如何编写这种递归语法?

Coding style 如何编写这种递归语法?,coding-style,grammar,Coding Style,Grammar,我的语法如下: S->S{S}S|null 这里null表示没有任何东西可以代替S。 我需要生成这个语法生成的所有可能的2n括号字符串。 我试着编写代码,但程序内存不足。有人能帮我把这个语法编码成2n个括号吗 提前非常感谢为您准备了一些虚拟代码: function grammar: S(string), n(int), generatedStrings(collection) if (|S| == 2*n) // Store in generatedStrings

我的语法如下:

S->S{S}S|null

这里null表示没有任何东西可以代替S。 我需要生成这个语法生成的所有可能的2n括号字符串。 我试着编写代码,但程序内存不足。有人能帮我把这个语法编码成2n个括号吗


提前非常感谢

为您准备了一些虚拟代码:

function grammar: S(string), n(int), generatedStrings(collection)
    if (|S| == 2*n)
        // Store in generatedStrings
        return
    else if (|S| > 2*n)
        return

    grammar(S + '{}', n, generatedStrings)
    grammar(S +'{'+ S +'}', n, generatedStrings)
    grammar(S +'{'+ S +'}'+ S, n, generatedStrings)
    grammar('{'+ S +'}'+ S, n, generatedStrings)
    grammar('{'+ S +'}', n, generatedStrings)
    grammar('{}'+ S, n, generatedStrings)

然后,您只需要一些机制来确保不会向生成的字符串集中添加重复项。我会使用一个set类型的数据结构(换句话说,一个只允许存储每个值中一个值的结构)。

首先,证明此语法生成所有平衡花括号字符串

(提示:首先证明
S->S{S}null
生成所有此类字符串。)

然后编写一个函数来生成所有这些:

function generate(num_opens, num_closes, string_so_far, N)
    if (num_opens + num_closes == N)
        print string_so_far;
        return;
    if (num_opens > num_closes)
        generate(num_opens, num_closes+1, string_so_far . '}', N)
    generate(num_opens+1, num_closes, string_so_far . '{', N)

generate(0, 0, N)

这可能符合问题的“精神”,也可能不符合问题的精神。

您能否以电子邮件的形式发布您的代码?我相信有人能够指出它抛出内存不足错误的原因。这种语法是不明确的
{}{}
可以解析为
null{S}S
S{S}null
。因此,任何生成方法都可能输出两次
{}{}
。编写一个递归下降解析器可能更容易,将所有2^(2n)个2n
{
/
}
字符串提供给它,并打印成功解析的字符串。我认为这不起作用,因为S可以不同,但这段代码要求它们是相同的。例如,
{}{{{}}
与此语法匹配,但我认为您的代码永远不会输出它。当然会。如果六个递归调用的编号为1..6,则该字符串按以下顺序生成:5->5->5->6.OK坏例子:-)。试试
{{}{{}{{}
。好的,但是…S真的会不同吗?诚然,我已经有好几年没有对语法做过任何事情了,但我不记得它们是这样工作的。很确定“s”表示任何与“s”匹配的东西,即使它出现两次。但我可能错了