编译原理阅读笔记

1.用于我们常常要编写 命令行解释程序,编译器的工作原理有点类似于此,因此掌握编译原理很有意义
2.基础:自动机原理
3.汇编语言的编写依赖于特定的机器。所以需要编译程序,来分离物理设备,和编程语言。
4.硬件-fortran编译器-fortran语言
5.上下文无关文法
【在机器翻译系统中
P=“capital of China” 如何翻译?
中国的首都(北京) 或 瓷都(景德镇)
有歧义
用前后文信息 排歧    
X China y  x 中国 y
U China v  u 瓷器 v 
下雨天留客天留我不留
白天鹅再飞
诡辩术 “断章取义” 的 语言学本质:前后相关语言中,去掉W 的前后文,在 W 的释义集合中,选择有利于自己的意义。


上下文无关文法和它所描述的上下文无关语言,在定义程序设计语言、语法分析、简化程序设计语言的翻译等方面有重要意义。

【上下文无关,没有歧义】
----------------------------
6.三型文法,有穷自动机,正则表达式
7.代码改进技术,编译器(分析程序生成器)
8.
(1)解释程序
一边翻译,一边执行
(2)汇编程序
(3)连接程序
将不同目标中的编译或者汇编代码收集到一个可执行文件中
(4)装入程序
(5)预处理器
开展翻译前,删除注释,展开宏替换
(6)编辑器
(7)调试程序
(8)描述器
(9)项目管理程序(工程管理程序)
--------------------------------
代码翻译步骤
(1)扫描程序
记录到记号中【符号全量展开】
(2)语法分析
将代码形成分析树【生成分析树】
(3)语义分析程序
将数据类型及属性送入分析树【分析树挂载数据结构】
(4)源代码优化程序 【优化分析树】
【以上应该和硬件不相干,实际上难以做到,因为以上的有些东西由于设备不同可能有可能无,例如有的设备上硬件带有某音频视频编码, 则在上层可以加载调用,其他机器则无此功能,导致上层编码和设备有一定关系。】
(5)代码生成器  【生成】
生成适合机器的目标代码
(6)目标代码优化程序 【优化】
尝试优化目标代码


【符号展开-分析树操作-生成优化】
【符号-分析树-替换生成】
----------------------
【思考,能否针对工作开发基于某语言之上的伪编译器。从而使得工作加速,
例如,!#/usr/lib/perlwork  执行方法
perlwork xxx.perlwork 其功能是所有编译的代码在执行代码前先去汇报一下所在机器,操作者,本脚本名等。
这样开发者使用脚本的方法和perl一样,但是却得到了额外的工作相关的功能
有空再继续思考】
----------------------
【正则表达式转化为 非确定有穷自动机(多条路) 再转化为 确定有穷自动机(一条路)


正则表达式的规则很容易理解,但是正则表达式并不能直接用来解析字符串,我们还要引入一种适合转化为计算机程序的模型。今天我们引入的这种模型就叫做有穷自动机(finite automation,FA),有时也叫有穷状态机(finite state machine)。有穷自动机首先包含一个有限状态的集合,还包含了从一个状态到另外一个状态的转换。有穷自动机看上去就像是一个有向图,其中状态是图的节点,而状态转换则是图的边。此外这些状态中还必须有一个初始状态和至少一个接受状态。下面的图展示了一个有穷自动机,有根从外边来的箭头指向的状态表示初始状态,有个黑圈的状态是接受状态:
 
 
 
现在我们来看看有穷自动机怎么处理输入的字符串:
一开始,自动机处于初始状态
输入字符串的第一个字符,这时自动机会查询当前状态上与输入字符相匹配的边,并沿这条边转换到下一个状态。
继续输入下一个字符,重复第二步,查询当前状态上的边并进行状态转换
当字符串全部输入后,如果自动机正好处于接受状态上,就说该自动机接受了这一字符串。
刚才我们画的自动机,假如输入的字符串是"hello"(带引号)。一开始状态机处于状态1,输入引号以后就沿引号的边转换到了状态2;接下来输入hello都会沿着a-z这条边回到状态2,最后输入引号,转换到了状态3。由于状态3是接受状态,那么这个自动机就会接受这个字符串。而如果字符串是"abc(不带后面的引号),那么当字符串输入完毕之后自动机会处在状态2,而状态2不是接受状态,所以这个自动机就不接受"abc这个字符串。一个自动机接受的所有字符串组成的集合称作这个自动机的语言。这里语言的概念和上一回我们介绍正则表达式的语言概念是一样,都表示一个有限字符集上的字符串集合。
 
上面我们画的自动机是一个确定性有穷自动机(DFA),其特点是从每一个状态只能发出一条具有某个符号的边。也就是说不能出现同一个符号出现在同一状态发出的两条边上。但是,还有一种非确定性有穷自动机(NFA),它允许从一个状态发出多条具有相同符号的边,甚至允许发出标有ε(表示空)符号的边,也就是说,NFA可以不输入任何字符就自动沿ε边转换到下一个状态。下图展示了一个非确定性有穷自动机:
 
 
 
非确定性有穷自动机在遇到两条边上有相同的符号,会选择哪一边呢?遇到ε边到底会转移还是不会转移呢?答案是,NFA会自动猜测应该选择哪一条边,而且每次都能猜对。比如说,上面的NFA,假如输入字符串是aa,它就会选择右边这条路径,并且接受这个字符串;假如输入字符是aaa,它就会走左边这条路径,并接受字符串。它绝不会在输入字符是aaa的时候选择右边路径然后做出不接受这一判断。由于我们的计算机并没有这种“猜测”能力,大家可能会对NFA具有这种能力感到奇怪。有些人在刚刚接触这些概念的时候可能会觉得NFA因为具有自动猜测的能力,应该要比DFA更加强大。但事实上是,DFA、NFA和正则表达式是等价的,任何NFA都存在一个与之接受同样语言的DFA,和一个定义相同语言的正则表达式;同理任何正则表达式,也存在一个接受其所定义语言的NFA和一个DFA。这三种模型虽然定义迥然不同,但却表示同样的正则语言。幸运的是,只需要很简单的规则,就能把任何正则表达式转化成NFA,而任何一个NFA又都可以转化为DFA,这样我们就能把正则表达式转化为易于编程的DFA,来真正进行词法分析的工作。(注,也有正则表达式引擎直接模拟NFA的运行来解析字符串,有兴趣的读者可以自行寻找有关的资料。)
 】
1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值