使用语法/规则在Python中生成所有终端字符串?

时间:2011-09-12 00:57:16

标签: python grammar context-free-grammar bnf

我正在尝试从给定文件生成所有终端字符串,直到达到一定长度。例如,如果您有类似

的内容
A = A B
A = B
B = 0
B = 1

然后你会得到类似

的东西
0
1
0 0
0 1
1 0
1 1

这是我认为不会过于困难但我陷入困境的事情。我现在可以读取值并将它们附加到字典中,规则存储为如下列表:

{'B': [['0'], ['1']], 'A': [['A', 'B'], ['B']]}

看起来你想要做的是从一个非终端符号(ex A或B)开始,然后迭代每个规则。如果规则中的符号不​​是非终端符号,则打印或保存它,如果它是非终端符号,则用规则替换它,然后再次检查。我对如何在Python中执行此操作感到困惑 - 我没有做太多。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

伪代码:

for each symbol:
    push that symbol onto the stack

while an item X can be popped off the stack:
    if X contains a non-terminal
        calculate each possible result with variation of the leftmost nonterminal
        if that variation is lower than the max length
             push it to the stack
    else
        add the popped X to a set Q of results (for de-duping)

print out the contents of Q (sorted, if so desired)

(注意:“非终端单一评估变体”意味着如果一个字符串是“AAB”,你将评估A的 1 ,而不评估另一个(而不是B) ,因为它没有非终端选项。)然后你在一个单独的路径中评估另一个A - 你最终将两个东西推到堆栈上。)

请注意,在Python中,您只需使用从列表末尾添加/删除堆栈,并使用set()作为集合。