编译原理课程作业1 消除无用产生式

Posted Dystopia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理课程作业1 消除无用产生式相关的知识,希望对你有一定的参考价值。

前言:

一年前在知乎上看到一个回答,答主说自己学了两天Python,用十几个小时做完了全部的编译原理课程作业,当时吓傻了我,现在看来,虽然两天学会比不上,但Python做课程作业的速度简直是快,课程作业1里我还傻傻的用list的extend和append,加上set函数,到第二次作业里我才发现,

没有什么结构体是一个list不能解决的,如果有,那就再套一个list

课程作业题:

消除无用产生式

# -*- coding: utf-8 -*-
class Solution:
    def __init__(self,vn,vt,p1,p2,s):
        self.vn = vn
        self.vt = vt
        self.p1 = p1
        self.p2 = p2
        self.s = s

    def step1(self):
        #算法2.1
        set_vn = set(self.vn)#集合vn vt
        set_vt = set(self.vt)
        #1
        self.vn_1 = []
        self.p1_1 = []
        self.p2_1 = []
        #2
        for i in range(len(self.p2)):
            if set_vt >= set(self.p2[i]):
                self.vn_1.extend(list(self.p1[i]))
        self.vn_1 = list((set(self.vn_1)))#去重
        #print self.vn_1
        #3#4
        while 1:
            len_vn_1 = len(set(self.vn_1))
            for i in range(len(self.p2)):
                if (set(self.vn_1)|set_vt)>=(set(self.p2[i])):
                    self.vn_1.extend(self.p1[i])
            if len_vn_1 == len(set(self.vn_1)):
                break
        self.vn_1 = list((set(self.vn_1)))#去重
        #print self.vn_1
        #5
        for i in range(len(self.p2)):
            if (set(self.vn_1)|set_vt)>=(set(self.p2[i])|set(self.p1[i])):
                self.p1_1.append(self.p1[i])
                self.p2_1.append(self.p2[i])

        return self.vn_1,self.vt,self.p1_1,self.p2_1,self.s


    def step2(self):
        #算法2.2
        set_vn = set(self.vn)#集合vn vt
        set_vt = set(self.vt)
        #1
        self.vn_2 = []
        self.vt_2 = []
        self.p1_2 = []
        self.p2_2 = []
        #2
        self.vn_2 = [S]
        #3#4
        while 1:
            len_vn_2 = len(set(self.vn_2))
            len_vt_2 = len(set(self.vt_2))
            for i in range(len(self.p1)):
                if set(self.p1[i])<=set(self.vn_2):
                    set_action_2 = set(self.p2[i])
                    for x in set_action_2:
                        if x in self.vn:
                            self.vn_2.append(x)
                        else:
                            self.vt_2.append(x)
            if (len_vn_2 == len(set(self.vn_2)))and(len_vt_2 == len(set(self.vt_2))):
                break
        self.vn_2 = list((set(self.vn_2)))#去重
        self.vt_2 = list((set(self.vt_2)))#去重
        #5
        for i in range(len(self.p1)):
            if (set(self.p1[i])|set(self.p2[i]))<=(set(self.vn_2)|set(self.vt_2)):
                self.p1_2.append(self.p1[i])
                self.p2_2.append(self.p2[i])

        return self.vn_2,self.vt_2,self.p1_2,self.p2_2,self.s

class io:
    def __init__(self,vn,vt,p1,p2,s):
        self.vn = vn
        self.vt = vt
        self.p1 = p1
        self.p2 = p2
        self.s = s
    def i(self):
        vn = []
        vt = []
        vn = raw_input("please input Vn: ")#读入Vn
        vt = raw_input("please input Vt: ")#读入Vt
        vn = vn.strip().split( )
        vt = vt.strip().split( )
        p1 = []
        p2 = []
        s = []
        while(1):
            p = raw_input("please input P: (print ‘q‘ to quit)")
            if p == "q":
                break
            lists_p = p.strip().split(->)
            p1.append(lists_p[0])
            p2.append(lists_p[1])
        s = raw_input("please input S: ")#读入S
        s = s.strip().split( )
        print vn,vt,p1,p2,s
        return vn,vt,p1,p2,s

    def o(self):
        print "the result is: "
        print "Vn: " + " ".join(self.vn)
        print "Vt: " + " ".join(self.vt)
        print "P: "
        for x in range(len(self.p1)):
            print str(self.p1[x]) + "->" + str(self.p2[x])
        print "S: " + " ".join(self.s)

print "example: if we input:\nVn: S U V W\nVt: a b c\nP: S->aS\nP: S->W\np: S->U\nP: U->a\nP: V->bV\nP: V->ac\nP: W->aW\nS: S"

vn = [S, U, V, W]
vt = [a, b, c]
p1 = [S, S, S, U, V, V, W]
p2 = [aS, W, U, a, bV, ac, aW]
s = [S]
while 1 :
    m = Solution(vn,vt,p1,p2,s)#计算
    vn,vt,p1,p2,s = m.step1()
    m = Solution(vn,vt,p1,p2,s)
    vn,vt,p1,p2,s = m.step2()

    n = io(vn,vt,p1,p2,s)#输出
    n.o()

    h = io(vn,vt,p1,p2,s)
    vn,vt,p1,p2,s = h.i()

按着书中的算法2.1和2.2做的

总结起来用到了以下几个函数方法:

1.list:

list L1.extend(list L2) 合并list,

append() 方法向列表的尾部添加一个新的元素。只接受一个参数。

extend()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。

实际上list L.append(x)就太万能了,能加list或者是元素,一对多的映射也完全可以用[[]]来解决

2.set:

list(set(list L))去重组合拳

3.读文件

list L = string s.strip().split(‘ ‘) 读字符串为链表太方便

4.写文件

string s  = " " .join(List L) 写链表为字符串太方便

以上是关于编译原理课程作业1 消除无用产生式的主要内容,如果未能解决你的问题,请参考以下文章

编译原理作业

编译原理—翻译方案属性栈代码

编译原理第一次作业

编译原理课程作业2

如何消除左递归何时需要消除左递归—编译原理

编译原理要点