LL(1)分析法中求first集合的Python实现

源程序

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 | ~
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值