编译原理课程作业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) 写链表为字符串太方便

时间: 2024-10-27 05:22:06

编译原理课程作业1 消除无用产生式的相关文章

编译原理课程作业2

NFA匹配字符串,突然意识到可以用多层的list,然后整个作业就没有难度了,递归部分一直错我都怀疑人生了,结果发现是类里的递归声明要加类名.. # -*- coding: utf-8 -*- import sys class io(): """read the NFA from file""" def __init__(self,strlist): self.strlist = strlist def i(self): if(len(sys.ar

词法分析器——哈工大编译原理课程(一)

词法分析器——哈工大编译原理课程(一) 程序输入:从code.txt文件中读取内容 程序输出:识别出的单词序列,格式为:(种别码,属性值) ①对于关键字和运算符.分隔符来说,输出格式为(种别码,0),因为每个种别码能唯一地标识出是哪个单词 ②对于标识符来说,输出格式为(id的种别码即36,在哈希桶中的位置) ③对于常量(整数.浮点数.字符串)来说,输出格式为(种别码,在数组中的位置) 1 #include<stdio.h> 2 #include<stdlib.h> 3 #inclu

0909关于编译原理课程的认识

1.编译原理学什么?编译原理是学习编译技术的基本理论和实现技术,包括语言文法的基本知识.词法分析.语法分析.语义分析及中间代码.目标代码生成等内容: 2.为什么学编译原理?可以使我们学生既掌握编译理论和方法方面的基本知识,而且也获得设计.实现.分析.和移植编译程序方面的初步能力: 3怎么学编译原理?首先要巩固先前所学习的c,数据结构等课程,以及即将要学习的离散数学,多提疑问,多参考有关书籍,借助互联网等工具与人交流. 4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路?    

编译原理课程设计——语法分析器

实验目的 了解掌握算符优先分析的基本方法.内容:学会科学思考并解决问题,提高程序设计能力. 实验内容与要求 用算符优先分析方法设计一个分析解释程序,对输入的赋值语句.输出语句.清除语句进行词法分析.语法分析.表达式求值并存储于指定变量中:若存在错误,提示错误相关信息. 文法表示 S -> v=E | E? | clear E -> E+T | E–T | T T -> T*F | T/F | F F -> (E) | v | c 问题分析 由于要求用算符优先分析方法来进行程序的语法

哈工大2015秋 编译原理课程实验1:词法分析

经过一年的C#的历练,确实算是挺喜欢C#的了,这次的编译原理尤为用心.既已提交作业,便拿出来共享一下,或许某学弟学妹能看到呢[偷笑]. 图1 项目资源管理器截图 工程: | Class.cs 主要是Record ErrorRecord Data类的定义,存储词法分析的结果 | Form1.cs WinForm窗体 | Program.cs 自动生成的主程序 | test.cs 主要参与运算的类,通过字符的判断将分析结果及错误提示存储到Data类 运行截图: 图2 运行截图 保存文件: 图3 项目

编译原理大作业(用java编写小型GCC 编译器)

以前只用编译器编译程序,现在学完编译原理这门课以后,通过编译大作业,我对编译器的工作原理有了比较清晰的认识 编译器的工作原理 编译器 (Compiler) 是一种将由一种语言编写的程序转换为另一种编程语言的可执行程序. 现代软件对于编译器的需求远甚从前, 究其原因很简单: 作为中间层, 编译器是构建更高层抽象的基础设施. 编译器意欲将人类可阅读的高阶代码, 翻译为机器能运行的低阶代码. 现代编译器的主要工作流程为: 源代码(source code)→ 预处理器(preprocessor)→ 编译

编译原理第一次作业

一.编译原理是什么?原理我们的计算机系的一门课程,它在我们的科学发展中起到了很重要的作用,也可以说是计算机系统的核心部分之一.它运用编译器.编译系统将我们的语言和计算机的语言进行转换等.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 二.学习编译原理有什么好处? 1.语法分析,语义分析,和代码优化的知识,还有技巧,思想能让我终生受益. 2.我得以学习大量优美的算法,并得以欣赏理论和实践在编译器开发中如何美妙地结合在一起. 3.我可以了解怎样

编译原理小作业词法分析程序

词法分析程序所参照的编码如70页表3.3 (<编译技术>张莉等著.--北京:高等教育出版社,2016.9.ISBN: 978-7-04-046317-0) 用Java语言实现如下: 1 import java.io.IOException; 2 import java.util.Arrays; 3 import java.util.HashMap; 4 import java.util.Map; 5 6 class Code{ 7 public static final int BEGINSY

0916编译原理词法分析作业二

#include<stdio.h>#include<stdlib.h>#include<string.h>#define _KEY_WOED_END "waiting for your expanding" //关键字结束标志 typedef struct{ int typenum; char * word;}WORD; char input[255]; //输入换缓冲区 char token[255]=""; //单词缓冲区 i