第4讲 词法分析概述-讲义-编译原理及实践教程(第3版)-黄贤英-清华大学出版社

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4讲词法分析概述
0.本节教学内容:
1)回顾上一章的内容,为本章打下基础
2)教材第3章3.1
3)教材第3章3.2
一.本节教学要求:
掌握词法分析器的任务和功能,理解词法分析器的设计,为实验部分词法分析器的手工生成打下基础。

二.教学方式及学时分配:
采用教师讲授+学生提问的方式
总共2学时,主要分配在第3.2节上,提问及总结以前的内容大约20分钟
三.教学重点:
●词法分析器的任务和功能
●词法分析器的设计
●状态转换图
四.教学难点:
●词法分析器的设计
●状态转换图
五.教学过程中的注意事项:
1.首先介绍词法分析的功能、输入、输出接口,让学生对语法分析的地位和如何编写有一个整体的把握,这样学生做实验才容易上手。

2.以讲解+课堂练习的方式,巩固学生对具体实现方法和步骤的练习。

六.学习方法:
1.从整体上把握词法分析器与周围各部分的关系,为理解和实验作准备。

2.从本节起实验开始,具有一定的难度,要调整学习方法,课上认真理解,课下多动手实践。

七.教学内容
1.复习
2.词法分析器的功能
词法分析的主要任务是从左至右逐个字符地对源程序进行扫描,将字符拼接成单词,每当识别出一个单词,就产生其种别码,把作为字符串的源程序改造成单词符号串的中间形式,提交给语法分析程序使用。

它是编译器中唯一与源程序打交道的部分,主要工作有:
(1)按规则识别单词,输出单词本身及其种别码。

这是词法分析的主要任务;
(2)滤掉源程序中的无用成分,如注释、空格、回车换行等。

这些部分只是有助于源程序的阅读,对生成代码无用;
(3)调用出错处理器,识别并定位错误。

词法错误是源程序中的常见错误,如出现非法字符、违反构词规则的单词等;
(4)调用符号管理器,将识别出来的单词及其属性进行管理。

有些源语言支持宏预处理功能,也可以在词法分析程序中完成。

3.单词的类型
程序设计语言可以根据单词在语言中的作用将单词大致分为5类:
(1)关键字:这类单词在特定语言中有固定的意义,如begin、end、while 等,它们是字母的固定串。

如果作为保留字,则不允许表示其它的意义。

(2)标识符:标识符是程序设计语言中最大的一个类别,作用是为某个实体命名,以便于程序引用,如m_circle、width等。

可以用标识符来命名的实体包括变量、过程、类、对象等,即变量名、过程名、类名、对象名等。

(3)常数:常数一般有整型、实型、布尔型、字符型等。

例如,25、true、'This is a string'、3.14等。

(4)运算符:分为算术运算符(如:+、-、*、/等),布尔运算符(如:not、and、or),关系运算符(如:<、>、>=、<=、=)。

(5)界符:程序设计语言中的特殊符号,类似于自然语言中的标点符号,在程序设计语言中有特殊用途。

可以细分为单界符(如;、'等)和双界符(如/*等)。

4.单词的种别码
词法分析程序的输入是源程序字符串,输出是与源程序等价的符号序列。

这些符号序列可以是如下的二元形式:
(种别码,单词的值)
其中种别码表示单词的种类,通常用整数表示。

单词如何分种,如何编码,没有统一的规定,主要取决于处理上的方便。

基本原则是不同的单词能彼此区别且有唯一的表示。

一般来讲,一种程序设计语言的关键字、界符和运算符都是固定的,可以采用一字一种,标识符一般统归为一种。

常数则按类型(整型、实型、字符型、布尔型等)分种。

Sample语言的单词编码如表3.1。

表3.1S ample语言单词的编码
5.词法分析器的设计
词法分析器的接口: 输入是文本形式的源程序,输出包括3项:token串,符号表,源程序清单和错误信息。

词法分析程序的总体设计: 词法分析工作主要由识别单词和查填符号表两
项工作完成。

词法分析程序的顶层数据流图
图3.1词法分析程序的详细数据流图
各个加工完成的功能如下:
读入一行(加工1.1):收到读下一行命令后,从源程序读入一行,装入缓冲区,行计数+1,并打印源程序清单。

在这里需要注意的是,回车换行在源程序(文本文件)中用两个字符0D0AH来表示,而用高级语言(C语言)读入内存后,就用一个字符0AH来表示,这是在用高级语言编写词法分析器时常被忽略导致错误的原因。

读一非空字符(加工1.2):从缓冲区读取一个字符,列计数+1,直到读取一个非空字符为止。

若缓冲区已空,则再读一行到缓冲区,此时列计数置0,行计数+1。

字符分类(加工1.3):根据单词的首字符以决定对不同类的单词进行识别。

输出TOKEN串(加工1.4):对所有识别出来的单词按二元式(TOKEN值,单词自身的值)的形式输出。

识别标识符/关键字(加工1.5):当读入的单词首字符是字母时,开始识别标识符或关键宇,边拼写边从缓冲区读入下一字符,列计数+1,当读入的字符为非字母数字时,标识符识别完成,但此时已多读入一个符号,所以必须将该字符回退到缓冲区,列记数-1。

识别出来的单词是否是关键字,必须查关键字表进行判断。

若是关键字,返回该关键字的种别码。

否则识别的单词就是标识符,返回标识符的种别码。

识别数值型常数(加工1.6):当读入的单词首字符是数字时,开始识别整数或实数。

边拼写边读入下一字符,列计数+1,当遇到“.”时,还要继续拼写该常数(实数情况)。

如果遇到E,要识别带指数的常数,当遇到其它非数字字符时,数字常数拼写完毕,此时已多读入一个字符,需回退一个字符到缓冲区,列计数-1。

返回整型常数或者实型常数的种别码。

处理注释和除号(加工1.7):当读入的单词首字符是“/”时,开始识别注释或除号,若是注释时,最后两个连续读出的符号是“*/”,不需再读下一符号,
列计数不变,此时该加工没有返回值。

当判定是除号“/”时,已多读入一个字符,需回退一个字符到缓冲区,列计数-1,返回除号“/”的种别码。

识别文字常数(加工 1.8):当读入的单词首字符是单引号时,忽略单引号,开始拼写字符常数,不断读下一符号,列计数+1,搜索下一个引号,当再读到引号时,字符常数拼写结束。

最后返回该字符常数及字符常数的种别码。

识别其它界符和运算符(加工1.9):若读入的单词首字符是除了“/”和“'”以外的其它界符或运算符,对于<、>、:等符号,还需再读入一个符号,判别是否为双界符。

若不是,列计数-1,返回该单词的种别码。

查填符号表(加工2):对标识符和常数识别后,要填写符号表,同一个单词在符号表中只存放一次。

因此若识别出来的单词是标识符或字符常数,首先查看名字栏和类型栏(字符常数的类型栏中填有“字符常数”)判断有无同名和同类型的入口。

如果没有,则将该单词填写到符号表的新入口中,并填写相关的属性栏。

对数字常数的处理方法是:先查符号表的V AL栏,若表内无相同的常数,则将数值型常数填入符号表内,在TYPE栏内填入整型或实型。

6. 状态转换图
状态转换图是一张有限方向图。

结点用圆圈表示,称为状态。

状态之间用带箭头的弧线连接,称为边,由状态s到状态r的边上标记的字符表示使状态s转换到状态r的输入字符或字符类。

(d)
状态转换图
根据状态转换图,可以很方便地将其转换为高级语言的程序,用来识别所定义的单词,该程序的代码量与图中的状态数和边数成正比。

每个状态对应一段代码,如果一个状态具有出边,该状态的代码便读入一个字符,并选择应转向的边。

八.本节作业:
《编译原理重点难点分析.习题解析.实验指导》第3章习题P29
九.本章参考资料:
1.《编译原理》第3章,吕映芝编,清华大学出版社
2. 编译原理实验指导书, 第3章例题部分
3. 编译原理——习题与解析第3章,伍春香编,清华大学出版社。

相关文档
最新文档