我正在尝试从给定文件生成所有终端字符串,直到达到一定长度。例如,如果您有类似
的内容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中执行此操作感到困惑 - 我没有做太多。任何帮助将不胜感激!
答案 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()
作为集合。