第三章词法分析教案.doc
《第三章词法分析教案.doc》由会员分享,可在线阅读,更多相关《第三章词法分析教案.doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章 词法分析本章概述执行词法分析的程序称为词法分析器。本章中,我们将将讨论词法分析程序的构造。前一部分讨论手工构造方法,后一部分讨论自动构造方法。主要学习内容:词法分析器的功能和输出形式,词法分析器的设计方法状态转换图的实现,正规表达式与有限自动机,LEX的一般描述和实现。学习目标:了解词法分析器的功能和输出形式,熟练掌握词法分析器设计的原理和方法,能够以转换图为工具使用某种语言的编写并调试一个扫描器。在正确理解正规表达式与有限自动机的有关概念、理论的基础上,了解词法分析的自动产生原理。学习重点和难点:词法分析器的功能和设计方法,正规表达式与有限自动机的等价性,有限自动机的确定化和最小化。
2、本章将讨论词法分析程序的设计原则,单词的描述技术,识别机制及词法分析程序的自动构造原理。首先需要描述和刻画程序设计语言中的原子单位-单词,其次需要识别单词和执行某些相关的动作。描述程序设计语言的词法的机制是正则表达式,识别机制是有穷状态自动机。回顾什么是词法分析程序?实现词法分析(lexical analysis)的程序称为词法分析程序(或扫描器)。词法分析程序的主要任务:对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标准形式属性字(TOKEN)。词法
3、分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。词法分析程序和语法分析程序的关系见图3.1。词法分析工作从语法分析工作独立出来的原因:l 简化设计l 改进编译效率l 增加编译系统的可移植性3.1 对于词法分析器的要求3.1.1 词法分析器的功能和输出形式功能:输入源程序,输出单词符号。单词符号是一个程序语言的基本语法符号。单词的分类(五类):1关键字:由程序语言定义的具有固定意义的标识符。也称为保留字或基本字。2. 标识符:用来表示程序中各种名字的字符串。3. 常 数:常数的类型一般有整型、实型、
4、布尔型、文字型。4. 运算符:如+、 、*、/ 等。5. 界限符:如逗号、分号、括号等。一个程序语言的关键字、运算符、界限符都是固定的,即数量有限及意义明确;而对于标识符和常数通常是不确定的。词法分析器所输出的单词符号常常表示成如下的二元式:(单词种别,单词符号的属性值)单词种别通常用整数编码。一个语言的单词符号如何分种,分成几种,怎样编码,是一个技术性的问题。它主要取决于处理上的方便。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种,也可以一字一种。采用一字一种的分法实际处理起来较为方便。运算符可采用一符一种的分法,但也可以把具有一定共性的运算符视为一种。
5、至于界符一般用一符一种的分法。单词符号的属性是指单词符号的特性或特征。属性值则是反应特性或特征的值。例如,对于某个标识符,常将存放它的有关信息的符号表项的指针作为其属性值;对于某个常数,则将存放它的常数表项的指针作为其属性值。在教程中,我们假定关键字、运算符和界限符都是一符一种。对于它们,词法分析器只给出其种别编码,不给出它自身的值。标识符单列一种。常数按类型分种。考虑下述C十代码段: while(ij)i; 经词法分析器处理后,它将被转换为如下的单词符号序列:while,(,id,指向i的符号表项的指针,id,指向j的符号表项的指针,id,指向i的符号表项的指针,; ,3.1.2词法分析器的
6、设计词法分析器的设计通常要经历如下几步:首先确定词法分析器的接口,即确定是把它作为独立的一遍扫描处理还是作为语法分析的子程序,这里我们将按照词法分析的任务和作为一个独立扫描处理程序的要求来考虑词法分析器的设计。确定单词分类和属性字的结构。根据上步确定的单词分类,对每类单词构造状态转换图。根据状态转换图设计分析算法。在词法分析器的具体实现时要注意下面几点:一、 输入、预处理词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,这个缓冲区称输入缓冲区。词法分析的工作(单词符号的识别)可以直接在这个缓冲区中进行。但在许多情况下,把输入串预处理一下,对单词符号的识别工作将是比较方便的。
7、预处理的主要工作:某些跳格符、回车符和换行符等编辑性字符,在别处的任何出现都没有意义,预处理时可以将其剔掉。注解部分仅在于改善程序的易读性和易理解性。对于它们,预处理时可以将其剔掉。空白符(一个或相继数个)用作单词符号之间的间隔,即用作界符。在这种情况下,预处理时可把相继的若干个空白结合成一个。我们可以构造一个预处理子程序,它能够完成上面所述的任务。二、 单词符号的识别:超前搜索词法分析器的结构如图3.2所示。当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号。当缓冲区里的字符串被处理完之后,它又调用预处理程序装入新串。为什么要采用超前搜索在
8、程序中有一些单词的识别经常需要多读入一些字符才能知道哪些字符组成一个单词。如:1 DO99Kl,102 IF(5.EQ.M) I103 DO99K1.104 IF(5)55这四个语句都是正确的FORTRAN语句。语句1和2分别是DO和IF语句,它们都是以基本字开头的,语句3和4是赋值句,它们都是以用户自定义标识符开头的。又如C中:a=a+;a=a+1;如此之类,等等。三、 状态转换图是一张有限方向图。在状态转换图中,结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。例如,图3.3(a)表示:在状态1下,若输入字符为
9、X,则读进X,并转换到状态2。若输入字符为Y,则读进Y,并转换到状态3。一张转换图只包含有限个状态(即有限个结点),其中有一个被认为是初态,而且实际上至少要有一个终态(用双圈表示)。一个状态转换图可用于识别(或接受)一定的字符串。例如,识别标识符的转换图如图3.3(b)所示。其中0为初态,2为终态。这个转换图识别(接受标识符的过程是:从初态0开始,若在状态0之下输入字符是一个字母,则读进它,并转入状态1。在状态1之下,若下一个输入字符为字母或数字,则读进它,并重新进入状态1。一直重复这个过程,直到状态1发现输入字符不再是字母或数字时(这个字符也已被读进)就进入状态2。状态2是终态,它意味着到此
10、已识别出一个标识符,识别过程宣告终止。终态结上打个星号。意味着多读进了一个不属于标识符部分的字符,应把它退还给输入串。如果在状态0时输入字符不为“字母”,则意味着识别不出标识符,或者说,这个转换图工作不成功。3.2 正规表达式与正规集(正规语言)程序设计语言中的单词是基本语法成分。单词符号的语法可以用有效的工具加以描述,并且基于这类描述工具,实现词法分析程序的自动构造。 正规表达式是典型的词法规则描述工具。 正规式也称正则表达式。正规表达式(regular expression)是说明单词的模式(pattern)的一种重要的表示法(记号),是定义正规集的数学工具。我们用以描述单词符号。下面是正
11、规式和它所表示的正规集的递归定义。定义(正规式和它所表示的正规集):设字母表为S,辅助字母表S= , , |,*,(,)1.和都是S上的正规式,它们所表示的正规集分别为和 ;2.对任何a,a是上的一个正规式,它所表示的正规集为a;3.假定e1和e2都是上的正规式,它们所表示的正规集分别为L(e1)和L(e2),那么,(e1),e1|e2,e1e2,e1*也都是正规式,它们所表示的正规集分别为L(e1),L(e1)L(e2),L(e1)L(e2)和(L(e1)*。4.仅由有限次使用上述三步骤而定义的表达式才是S上的正规式,仅由这些正规式所表示的集合才是S上的正规集。注意其中“ ”、“|”、“*”
12、均为正规式子运算符:(1) “”读为“连接”;(2) “|”读为“或”;(3) “*”读为“闭包”(即,任意有限次的自重复连接)。在不致混淆时,括号可省去,但规定算符的优先顺序为“”、“|”、“*”。连接符“”一般可省略不写。“”、“|”和“*”都是左结合的。例子:令=a,b,上的正规式和相应的正规集的例子有:正规式 正规集a aa|b a,bab ab(a|b)(a|b) aa,ab,ba,bba * e ,a,a, 任意个a的串(a|b)* e ,a,b,aa,ab 所有由a和b组成的串(a|b)*(aa|bb)(a|b)* S*上所有含有两个相继的a或两个相继的b组成的串讨论下面两个例子
13、:例3.1:令S=l,d,则S上的正规式 r=l(l|d)* 定义的正规集为:l,ll,l d,ldd, 其中l代表字母,d代表数字。正规式即是 字母(字母|数字) * 。它表示的正规集中的每个元素的模式是“以字母打头的字母数字串”。就是Pascal和多数程序设计语言允许的的标识符的词法规则。例3.2:有S=d,e,+,-,则S上的正规式 d*(dd*|e )(e(+|-e|)dd* |e)表示的是无符号数的集合。其中d为09的数字。结论:程序设计语言的单词都能用正规式来定义。正规式的等价性:若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价,写作e1=e2。例如:e1=(a|b)
14、, e2=b|a, e1=e2又如:e1=b(ab)* , e2=(ba)*b, e1=e2 e1= (a|b)* , e2=(a*|b*)*, e1=e2正规式的代数运算规律:设U,V,W为正规式,正规式服从的代数运算规律有:(1) U|V=V|U “或”服从交换律(2) U|(V|W)=(U|V)|W “或”的可结合律(3) (UV)W=U(VW) “连接”的可结合律(4) U(V|W)=UV|UW (V|W)U=VU|WU 分配律(5) U=U,U =U “连接”的恒等元素零一律有穷自动机有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规
15、式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具。有穷自动机分为两类:确定的有穷自动机(Deterministic Finite Automata)和不确定的有穷自动机(Nondeterministic Finite Automata) 。关于有穷自动机我们将讨论如下题目:确定的有穷自动机DFA 不确定的有穷自动机NFA NFA的确定化 DFA的最小化3.3.1 确定的有穷自动机DFA一、DFA定义:一个确定的有穷自动机(DFA)M是一个五元组:M=(K,f,s0 ,Z),其中:1. K是一个有穷集,它的每个元素称为一个状态;2. 是一个有穷字母表,它的
16、每个元素称为一个输入符号,所以也称为输入符号表;3. f是转换函数,是在KK上的单值部分映射。即,如果 f(ki,a)=kj,(kiK,kjK)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;4. s0 K是唯一的一个初态;5. Z K是一个终态集(可空),终态也称可接受状态或结束状态。二、一个DFA 的例子:DFA M=(S,U,V,Q,a,b,f,S,Q其中f定义为:f(S,a)=U f(V,a)=Uf(S,b)=V f(V,b)=Qf(U,a)=Q f(Q,a)=Qf(U,b)=V f(Q,b)=Q显然,一个DFA可用一个矩阵表示,该矩阵
17、的行表示状态,列表示输入字符,即k行a列的 矩阵元素表示f(k,a)的值。这个矩阵称为状态转换矩阵。对于上例,有如下状态转换矩阵状态abSUVUQVVUQ+QQQ注意:在状态矩阵中初态结点的旁边标以;终态结点旁边标以。一个DFA也可表示成一张(确定的)状态转换图。假定DFA M含有 m个状态和 n个输入字符,那么,这个图含有m个状态结点,每个结点顶多有n条箭弧射出和别的结点相连接,每条箭弧用中的一个不同输入字符作标记,整张图含有唯一的一个初态结点和若干个(可以是0个)终态结点。注意:初态结点的旁边标以; 终态结点则用双圈表示。对于*中的任何字,若存在一条从初态结点到某一终态结点的通路,且这条通
18、路上所有弧的标记符连接成的字符串等于,则称可为DFA M所识别(读出或接受)。若M的初态结点同时又是终态结点,则空字可为M所识别(或接受)DFA M所能识别的字的全体记为L(M) 。 如有 =abb,显然可为上例的DFA M所识别。换言之:若t* ,f (S,t) =P,其中S为DFA M的初态,PZ,Z为终态集。则称t 可为DFA M所接受(识别)。如果一个DFA M的输入字母表为,则我们也称M是的一个DFA。结论:上的一个字集V,*是正规的,当且仅当存在上的DFA M,使得VL( M)。*上的符号串t 在DFA M上运行:一个输入符号串t,(将它表示成Tt1的形式,其中T, t1*)在DF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 词法 分析 教案
限制150内