源程序
def First(string, G):
string_firstset = set()
i = 0
while True:
if i >= len(string):
string_firstset.add('~')
return string_firstset
elif (string[i] >= 'a' and string[i] <= 'z') or string[i] == '+' or string[i] == '*' or string[i] == '~' or string[i] == '(' or string[i] == ')': # 如果是终结符, 直接返回集合
string_firstset.add(string[i])
return string_firstset
else: # 如果是非终结符
# 表示E
if i+1 < len(string) and string[i+1] == "'":
E = string[i] + string[i+1]
else:
E = string[i]
# 找到E所在的那一行
line = 0
while G[line][0] != E:
line += 1
# 求E的first集合
E_firstset = set()
column = 1
while G[line][column] != '':
E_firstset = E_firstset.union(First(G[line][column], G))
column += 1
# ~是否在E的first集合中
if '~' in E_firstset:
if len(E) == 1:
i += 1
else:
i += 2
# string_firtsset集合增加
E_firstset.remove('~')
string_firstset = string_firstset.union(E_firstset)
else:
string_firstset = string_firstset.union(E_firstset)
return string_firstset
# 文法的数据化结构
G = [['']*10 for i in range(10)]
line = 0
# 打开放有文法的文件
f = open('G.txt', 'r')
lines = f.readlines()
f.close()
for g in lines:
print(g, end='')
i = 0
column = 0
while True:
while g[i].isspace() or g[i] == '-' or g[i] == '>' or g[i] == '|': # 去掉空白和无关紧要的符号
i += 1
if i >= len(g):
break
if i>= len(g):
break
while g[i].isalpha() or g[i] == "'" or g[i] == '+' or g[i] == '*' or g[i] =='(' or g[i] == ')' or g[i] == '~': # 获取各字符串
G[line][column] += g[i]
i += 1
if i >= len(g):
break
column += 1
if i>= len(g):
break
line += 1
# for i in range(10): # 打印效果
# print(G[i])
# 打印各非终结符的first集合
print('First(C) = ', end = '')
print(First('C', G))
print("First(B') = ", end = '')
print(First("B'", G))
print('First(B) = ', end = '')
print(First('B', G))
print('First(A) = ', end = '')
print(First('A', G))
print('First(S) = ', end = '')
print(First('S', G))
G.txt
放文法的文件
其中~
代表空
S -> AB
A -> Ca | ~
B -> cB'
B' -> aACB' | ~
C -> b | ~