语法分析:将切分的单词序列组合成各类短语短语,常见的方法:自上而下,自下而上。
LL(1):左扫描,左推导。
大体步骤:
1.从文件或其他方式导入\储存文法(实质就是几行符号流) 并把其中的终结字符和非终结字符存在数组\列表里
2.把文法每行的“或”(|)切分成两个即A->B|C 切分为A->B和A->C
for i in gramma:
ss=i[0:1]
j=0
while j<len(i):
if i[j]=='>':
break
j+=1
j+=1 #找到->后的第一个位置
while j<len(i):
if i[j]=='\n':
break
if i[j]!='|':
ss+=i[j]
else:
stack.append(ss)
ss=i[0:1]
j+=1
stack.append(ss)
3.根据文法创建first集和follow 集
(1)first:在切分后的文法中 如果A->a…… (a为终结字符)则把a放入A的follow中 如果A->B ……(B为非终结) 则先递归求B的first,然后放入A的first
(2)follow::先把‘$’放入开始字符(E)的follow;存在 ……Ab(b为非终结),则把b放入A的follow ;存在AB(B为非终结),则把B的first放入A的follow;存在B=EAC,且C的first中含有‘ε’,则把B的follow放入A的follow;若A为某段的最后字符,则把‘$’放入A的follow;若B=……A,则把B的follow放入A的follow
def GetFirst(stack_item):
if stack_item[1] in vt:#产生式第一个为终结
first[stack_item[0]].add(stack_item[1])#将其放入第一个的first
else:
for find_item in stack:
if find_item[0]==stack_item[1]:
GetFirst(find_item)
first[stack_item[0]]=first[stack_item[1]]|first[stack_item[0]]
def GetFollow(vi_item):
for i in stack:
j=1
wh

最低0.47元/天 解锁文章
3835





