我想給JSGF語法生成所有映射到的終端字符串。例如,給定A (B | C) D [E]
,我所需的輸出是:如何根據語法規則生成所有可能的字符串?
A B D E
A C D E
A B D
A C D
我決定先從最簡單的項目,可選的支架,但很快就遇到了磚牆。它適用於1件物品,但不適用於替代物品。任何意見,將不勝感激。
我現在擁有的一切:
import re
rule = raw_input('Enter the rule you want to test: ')
items = re.findall(r"\w[\w ]*\w|\w|\[|\]|\(|\)", rule)
for anitem in range(len(items)):
bracketc = items[:anitem].count('[') - items[:anitem].count(']')
if items[anitem] != '[' and items[anitem] != ']':
if bracketc > 0:
optional = True
else:
optional = False
while optional == True:
print ' '.join(items)
it2 = items[:]
it2.remove(it2[anitem])
print ' '.join(it2)
break
它適用於1個項目,並給予一個字符串AB [C] d,返回:
A B [ C ] D
A B [ ] D
,但在日益複雜壞了,所以我我猜我需要完全不同的東西。
怎麼樣像'答:BC | BCA'導致無限的潛在字符串 –
我現在不擔心遞歸;)我只是想現在最簡單的版本工作,假設規則中的每個項目都是終端節點 –