1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| 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))
|