语法分析-LL(1)分析的python实现

语法分析:将切分的单词序列组合成各类短语短语,常见的方法:自上而下,自下而上。

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
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值