Removed_实验一:词法分析器编制实验37
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一:词法分析器编制实验
一教学重点与实现的关键技术
1.1词法分析概述
人们理解一篇文章(或解析一个程序)起码是在单词级别上来思考的。同样,编译程序也是
在单词的级别上来分析和翻译源程序的。词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号(token),把作为字符串的源程序改造成单词符号串的中间程序。因此,词法分析是编译的基础。
执行词法分析的程序称为词法分析器。构造词法分析器的方法分为手工编制和自动生成(如用著名的词法分析器的自动生成工具Lex自动为某种语言的编译构造词法分析器)两种,本实验要求学生利用所学习掌握的知识手工编制一个小型的词法分析器。
1.2词法分析器的设计要求
1.2.1词法分析器的功能和输出形式
词法分析器的功能是输入源程序,输出单词符号。单词符号是一个程序语言的基本语法符号。程序语言的单词符号一般可分为下列五种。
(1)关键字
是由程序语言定义的具有固定意义的标志符。有时称这些标志符为保留字或基本字。例如,Pascal中的begin,end,if,while都是保留字。这些字通常不用作一般标
志符。
(2)标识符
用来表示各种名字,如变量名、数组名、过程名等等。
(3)常数
常数的类型一般有整型、实型、布尔型、文字型等等。例如,
100,3.14159,TRUE,‘Sample’。
(4)运算符
如+、-、*、/等等
(5)界符
如逗号、分号、括号、/*,*/等等。
一个程序语言的关键字、运算符和界符都是确定的,一般只有几十个或上百个。而对于标识符或常数的使用通常都不加什么限制。
词法分析器所输出的单词符号常常表示成如下的二元式:
(单词种别,单词符号的属性值)
单词种别通常用整数编码。一个语言的单词符号如何分种,分成几种,怎么编码,是一个技术性的问题。它主要取决于处理上的方便。标识符一般统归
为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种,
也可以一字一种。采用一字一种的分法实际处理起来较为方便。运算符可采用一
符一种的分法,但也可以把具有一定共性的运算符视为一种。至于界符一般用一
符一种的分法。
如果一个种别只含一个单词符号,那么,对于这个单词符号,种别编码就完全代表它自身了。若一个种别含有多个单词符号,那么,对于它的每个单词
符号,除了给出种别编码之外,还应给出有关单词符号的属性信息。
单词符号的属性是指单词符号的特性或特征。属性值则是反映特性或特征的值。例如,对于某个标识符,常将存放它的有关信息的符号表项的指针作为其属
性值;对于某个常数,则将存放它的常数表项的指针作为其属性值。
在这里,我们给出一种编码方法(以FORTRAN语言为例):
单词符号编码举例
单词符号种别
编码
内部
值
助记符
DIM1$DIM
IF2$IF DO3$DO STO
P
4$STOP END5$END
标识符6内部
符号
串
$IDN
整数7标准
二进
制
$INT
=8$ASG
+9$PLUS
*10$STAR
**11$POWER
,12$COMMA
(13$SLP
)14$SRP
1.2.2词法分析器作为一个独立子程序
为何将词法分析作为一个独立阶段呢?是否还应该将它安排为独立的一遍呢?
把词法分析安排为一个独立阶段的好处是,它可使整个编译程序的结构更简洁、清晰和条理化。词法分析比语法分析要简单得多,可用更有效的特殊方法和
工具进行处理。
但是,这并不意味着我们也必须把词法分析作为独立的一遍。当然,也可以把词法分析安排成独立的一遍。让它把整个源程序翻译成一连串的单词符号
存放于文件中。待语法分析器进入工作是在对从文件输进的这些单词符号进行分
析。这种做法意味着必须在文件中保存整个源程序的内码形式,这似乎是没有必
要的。我们可以把词法分析器安排成一个子程序,每当语法分析器需要一个单词
符号时就调用这个子程序。每一次调用,词法分析器就从输入串中识别出一个单
词符号,把它交给语法分析器。这样,把词法分析器安排成一个子程序就比较自
然。
1.3 词法分析器的实现技术
在以下的讨论中,我们将按照词法分析的任务和作为一个独立子程序的要求来考虑词法分析器的设计。
1.3.1 输入、预处理
词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,这个缓冲区称输入缓冲区。词法分析的工作可以直接在这个缓冲区中进行。但在很多情况下,把输入串预处理一下,对单词符号的识别工作将是比较方便的。
对于许多程序语言来说,空白符、跳格符、回车符和换行符等编辑性字符除了出现在文字常数中之外,在别处的任何出现都没有意义。对于它们,预处理时可以将其剔掉。
我们可以设想构造一个预处理子程序来完成预处理功能。每当词法分析器调用它时,它就处理出一串确定长度的输入字符,并将其装进词法分析器所指定的缓冲区中(称为扫描缓冲区)。这样,分析器就可以在此缓冲区中直接进行单词符号的识别,而不必照管其它繁琐事务。
分析器对扫描缓冲区进行扫描时一般用两个指示器,一个指向当前正在识别的单词的开始位置(指向新单词的首字符),另一个用于向前搜索以寻找单词的终点。
不论扫描缓冲区设的多大都不能保证单词符号不会被他的边界所打断。因此,扫描缓冲区最好使用一个如下所示的一分为二的区域,即著名的双缓冲区设计。具体的操作步骤如下图所示: