Productions = {
"stat_list": [("<stat>", 0.2), ("stat_list", 0.8)],
"stat": [("<cmpd_stat>", 0.2), ("<stat>", 0.3), ("<if_stat>", 0.3), ("<iter_stat>", 0.4), ("
<assgn_stat>", 0.5), ("<decl_stat>", 0.7)],
"cmpd_stat": [("{ <stat_list> }", 0.5)],
#more code...
"type": [("int", 0.2), ("double",0.8)],
"const": [("<digit><digit_seq>",0.7)],
"digit_seq": [("{empty]", 0.2), ("<digit><digit_seq>", 0.8)],
"char": [( "[A-Z]", 0.2), ("[a-z]", 0.4), ("_", 0.7)],
"digit": [([0, 2, 3, 4, 5, 6, 7, 8, 9], 0.5)],
def generateRandom(Productions):
r5 = random.randint(0, 1)
for i in Productions:
if Productions[i] >= r5:
return Productions.get(i)
def getStatementFromExpansion(prog):
start = generateRandom(Productions)
while prog in "<" or ">":
if start == "<stat_list>":
return prog.replace(start, Productions.items(start), 1)
if start == '<stat>':
return prog.replace(start, Productions.items(start), 1)
#more similar code...
prog = "int main () { <stat> return 0; }"
print(getStatementFromExpansion(prog))
因此,此分配的目的是循环通过该编,并且每次看到<>都会对其进行扩展,例如
答案 0 :(得分:0)
由于Productions是列表的字典,因此您尝试将列表与int进行比较。您必须访问要比较的Productions [i]的特定值。
例如,现在您具有以下键值对:
"type": [("int", 0.2), ("double",0.8)],
您想使用0.2与r5进行比较,您可以使用:
Productions['type'][0][1]
#list at type - first tuple of the list - second value of the tuple
一旦知道要访问的值,就可以将方括号以菊花链方式连接,因为它返回一个对象,然后可以使用该对象使用方括号来访问某个值。
P.S get()用于字典,可让您“获取”某个键的值,并且还可以在键不存在的情况下获取默认值。另一方面,index()为您提供列表中某个对象的首次出现的索引位置。