当前位置:   article > 正文

编译原理阅读笔记_"刚才我们画的自动机,假如输入的字符串是\"hello\"(带引号)。一开始状态机处于状态1,"

"刚才我们画的自动机,假如输入的字符串是\"hello\"(带引号)。一开始状态机处于状态1,"
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的运行来解析字符串,有兴趣的读者可以自行寻找有关的资料。)
 】
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/464221
推荐阅读
相关标签
  

闽ICP备14008679号