编译原理,根据文法产生式,生成语言的全部句子

import re
import itertools as it

gz=[["S","S;S"],
    ["S","id:=E"],
    ["S","print(L)"],
    ["E","id"],
    ["E","num"],
    ["E","E+E"],
    ["E","(S,E)"],
    ["L","E"],
    ["L","L,E"]]

def f(string):
    up=re.findall(r"[A-Z]",string)
    low=re.split(r"[A-Z]",string)
    #print("up=",up)
    #print("low=",low)
    result1=[]
    result3=[]
    for upi in up:
        result2=[]
        for gzi in gz:
            if gzi[0]==upi:
                result2.append(gzi[1])
        result1.append(result2)
    for x in it.product(*result1):
        #print("low=",low)
        #print("x=",x)
        s=join(low,x)
        #print("s=",s)
        result3.append(s)
    return result3

def join(low,up):
    s=""
    i=0
    while i<len(up):
        s=s+low[i]+up[i]
        i=i+1
    s=s+low[i]
    return s

def fc(c):
    ret=[]
    for x in c:
        for y in f(x):
            ret.append(y)
    return ret

def printc(c):
    for x in c:
        if not re.search(r"[A-Z]",x):
            print(x)
    
c=["S"]
c=fc(c)
c=fc(c)
c=fc(c)
c=fc(c)
printc(c)

gz里边是文法产生式。这里用的是《编译原理》虎书中的文法3-1。

将fc执行多遍,可以得到更长的句子。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值