上一个文章实现了对LL(1)文法各非终结符求first集和follow集,我们这篇文章则是继续求得LL(1)的预测分析集。
看一下预测分析集的求解方法:
这里我们需要求对于一个串的first集,求解方法如下:
任意符号α的FIRST集求法:
1. α为终结符,则把它自身加入FIRSRT(α)
2. α为非终结符,则:
(1)若存在产生式α->a...,则把a加入FIRST(α),其中a可以为ε
(2)若存在一串非终结符Y1,Y2, ..., Yk-1,且它们的FIRST集都含空串,且有产生式α->Y1Y2...Yk...,那么把FIRST(Yk)-{ε}加入FIRST(α)。如果k-1抵达产生式末尾,那么把ε加入FIRST(α)
注意(2)要连续进行,通俗地描述就是:沿途的Yi都能推出空串,则把这一路遇到的Yi的FIRST集都加进来,直到遇到第一个不能推出空串的Yk为止。
重复1,2步骤直至每个FIRST集都不再增大为止。
这地方借鉴自:【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
通过这一步骤编写求一个串的first集合:
dirFirst = defaultdict(set)
def getDirFirst(curPro):
res = []
# 对于一个字符串求first集
for i in range(1,len(curPro)):
if curPro[i] in vt:
res.append(curPro[i])
break
elif curPro[i] in vn