import re
import itertools as it
gz=[["S","S;S"],
["S","id:=E"],
["S","print(L)"],
["E","id"],
["E","num"],
["E","E+E"],
["E","(S,E)"],
["L","E"],
["L","L,E"]]
def f(string):
up=re.findall(r"[A-Z]",string)
low=re.split(r"[A-Z]",string)
#print("up=",up)
#print("low=",low)
result1=[]
result3=[]
for upi in up:
result2=[]
for gzi in gz:
if gzi[0]==upi:
result2.append(gzi[1])
result1.append(result2)
for x in it.product(*result1):
#print("low=",low)
#print("x=",x)
s=join(low,x)
#print("s=",s)
result3.append(s)
return result3
def join(low,up):
s=""
i=0
while i<len(up):
s=s+low[i]+up[i]
i=i+1
s=s+low[i]
return s
def fc(c):
ret=[]
for x in c:
for y in f(x):
ret.append(y)
return ret
def printc(c):
for x in c:
if not re.search(r"[A-Z]",x):
print(x)
c=["S"]
c=fc(c)
c=fc(c)
c=fc(c)
c=fc(c)
printc(c)
gz里边是文法产生式。这里用的是《编译原理》虎书中的文法3-1。
将fc执行多遍,可以得到更长的句子。