编译原理学习--词法分析(2)

  自动生成的词法分析器跟之前讲的图转移算法是类似的,因为是自动生成,为了把整个流程形式化,需要用另外一个数学工具--有限状态自动机。

  从数学上讲,有限状态自动机是什么概念呢?

    

  输入一个字符串,如果字符串能够接受,则输出Yes,否则输出No。有限状态自动机是一个五元组,M=(S, Σ, δ, q0, F),其中,Σ-输入字母表,S- 状态集,q0-初始状态,F-终结状态集,δ-转移函数。

  举个例子,什么样的串可以被接受?

    

  由图可知,Σ={a,b},S={0,1,2},q0=0,F={2},δ函数如下所示:

    

  如果按照转移函数,字符串输入完毕后,停留在终结状态,那么字符串就可以被接受。

  再来看第二个例子:

    

  可以发现,转移函数的状态是不确定的,我们称为非确定的有限状态自动机(NFA),那么第一个例子中的就是确定的有限状态自动机(DFA),很明显NFA对接受的判断难度更大,所以为了解决这个问题,我们往往将NFA转换为DFA。那么DFA怎么实现呢?举个简单的方法,拿第一个例子来说,可以把它看成有向图,用邻接矩阵表示:

    

  行表示所有的状态,列表示所有的字符,交叉点表示转移函数。

    

时间: 2024-08-29 08:25:26

编译原理学习--词法分析(2)的相关文章

[编译原理学习]词法分析

此前一直没能系统完整地学过编译原理,只有很粗浅的理解,虽然其实对工作里的任务也没啥影响,但总觉得缺了一大块知识,加上对所谓程序员三大浪漫(编译器,操作系统,图形学)的向往,所以最近跟着网易云课堂推出的计算机专业课程来学习编译原理.无奈生性懒惰,常常下班之后觉得累了,打打游戏啊看看视频啊,拖延症就犯了.......所以在这里打算将学习的过程,心得记录下来,也算是对自己的一个督促.课程传送门http://mooc.study.163.com/learn/USTC-1000002001#/learn/

编译原理学习--词法分析(1)

词法分析的任务: 首先,从阶段上来看,编译器可分为若干个中间阶段: 典型的,可以包含为一个前端,一个后端.前端接收源程序产生一个中间表示,后端接收表示继续生成一个目标程序.所以,前端处理的是跟源语言有关的属性,后端处理跟目标机器有关的属性. 更细节的,前端可以划分为若干个阶段: 下面我们看看词法分析器的任务: 词法分析器读入程序员写的程序,然后对字符流做切分成记号流.举个例子: 这是一个程序员看到的字符流 词法分析器将字符流读入,根据关键字.标识符.标点.字符串.整形数等进行划分,形成记号流(单

编译原理学习导论

编译原理学习导论 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理却一直作为大学本科的必修课程,同一时候也成为了研究生入学考试的必考内容.编译原理及技术从本质上来讲就是一个算法问题而已,当然因为这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,只是讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比較专注解决一种的算法了.在20世纪50年代,编译器的编写一直被觉得是十分困难的事情

编译原理学习笔记 -- 绪论1

1. 语言处理器 语言处理系统 _________ 经过预 _______ 源程序 --> |预处理器| --> 处理的 --> |编译器| --> 目标汇编程序 -------- 源程序 ------- _______ 可重定位的 ______________ --> |汇编器| --> 机器代码 --> |链接器/加载器| --> 目标机器代码 ------- -------------- ↑ 库文件/可重定位对象文件 预处理器:把源程序聚合在一起,并宏

编译原理学习

编译原理学习笔记---- 不确定有穷自动机(NFA) 一个不确定的有穷自动机T是一个五元组,M={K,∑,f,S,Z} ⒈K是一个有穷集他的每一个元素称作一个状态. ⒉∑是一个字母表,他的每一个元素称为一个输入符号. ⒊f是一个从Kx∑*到K的子集映射即K*∑*->2^K,其中2^K表示K的幂集. ⒋S包含于K集,是一个非空初态集合. ⒌Z包含于K是一个非空的终态集合. 确定有穷自动机(DFA) 一个确定的有穷自动机M是一个五元组:M=(K, ∑,f,S,Z)其中, 1)K是一个有穷集,他的每个

编译原理学习基本概念汇总

对于计算机专业的学生来说,肯定听说过或者上过一门课,叫做--编译原理,被称为计算机专业的天书,反正不管是学习这门课的时候,还是现在,我都是没搞懂其中的技术和知识.但就期末考试而言,提前做了几道题目,得到了90+的分数,也算是可喜可贺.各位ITer如果想检验自己的智商的话,大可以去学习编译原理,你会收获很多的.现在我把大学时整理的编译原理最基本的概念分享出来. 第一章-绪论 1. 翻译,是指在计算机中放置一个能由计算机直接执行的翻译程序,它以某一种程序设计语言(源语言)所编写的程序(源程序)作为翻

编译原理学习:TINY语言词法扫描程序实现

最近对解释型程序(类似python或者是linux里的bc计算器)非常感兴趣,就开始学习一下编译原理.今天自己实现了TINY语言的词法扫描程序.大部分参考<编译原理及实践>一书.但是我做了一些小小的改进. 先说一下TINY语言: 1.注释:放在一对大括号内.书上的注释不能嵌套,我做了一点改进,允许嵌套. 2.关键字:read write if end repeat until else 3.类型:只支持整型和布尔型. 4.计算:+ - * / ( ) < = :=,其中:=为赋值运算,=

.net编译原理学习

今天来学习一些.net 的编译原理 首先通过书本上内容了解了: .net framewrok 的核心是运行库执行环境,称为公共语言运行库(CLR),在CLR控制下运行的代码称为代码托管(managed code) 但是在CLR执行已经编写好的源代码之前,需要先进行编译它们,编译分为两个阶段: 1.将源代码编译为microsoft中间语言(MSIL,简称IL) 2.将IL编译为平台专用的代码 稍微详细一点的过程是: 1.如果使用vs进行开发,则将源代码编译为IL的过程由vs来完成. 2.IL代码由

0909 关于编译原理学习的想法

1.编译原理旨在介绍编译程序构造的一般原理和方法,关注的是编译器方面的产生原理和技术问题.学习编译原理有利于提高编程人员的素质和技术. 2.通过学习编译原理可以更好地了解程序设计语言的内部机制,从而更好地了解和运用程序设计语言,最终能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作. 3.(1)反复钻研书本:(2)结合源代码来学习:(3)先行学习简单的,提高兴趣,再来学习困难的. 4.