我想,给定一个 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
但随着复杂性的增加而崩溃,所以我猜我需要一些完全不同的东西。