第2章词法分析.ppt

上传人:s****8 文档编号:82705743 上传时间:2023-03-26 格式:PPT 页数:96 大小:705.50KB
返回 下载 相关 举报
第2章词法分析.ppt_第1页
第1页 / 共96页
第2章词法分析.ppt_第2页
第2页 / 共96页
点击查看更多>>
资源描述

《第2章词法分析.ppt》由会员分享,可在线阅读,更多相关《第2章词法分析.ppt(96页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第2章章 词法分析词法分析2.1词法分析器设计方法词法分析器设计方法 2.2一个简单的词法分析器示例一个简单的词法分析器示例2.3正规表达式与有限自动机简介正规表达式与有限自动机简介2.4正规表达式到有限自动机的构造正规表达式到有限自动机的构造2.5词法分析器的自动生成词法分析器的自动生成词词法法分分析析的的任任务务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成为单词符号串形式的中间程序。词法分析程序也叫词法分析器或扫描器。其功能是输入源程序,输出单词符号。词法分析可采用如下两种处理结构词法分析可采用如下两种处理结构:(1)把词法分析程序作为主程序。将词

2、法分析作为独立的一遍来完成。字符串形式的源程序字符词法分析器符号表单词符号串程序单词(2)把词法分析程序作为语法分析程序调用的子程序。进行语法分析时,每当需要一个单词时便调用词法分析程序。字符串形式的源程序字符词法分析器语法分析器符号表单词取下一单词2.1 词法分析器设计方法词法分析器设计方法2.1.1单词符号的分类与输出形式单词符号的分类与输出形式1.单词符号分类单词符号分类单词符号是程序语言的基本语法单位。程序语言的单词符号单词符号通常分为五种:(1)保留字保留字:如if、while(2)标识符标识符:标记常量、变量、函数等的名字(3)常数常数:如实型0.618、布尔型TRUE(4)运算符

3、运算符:如+、-、*、/、(5)界符界符:分界符,如,、;、(、)注意:保留字、运算符和界符的个数确定,标识符标识符和常数常数的个数不确定。2.单词符号的输出形式单词符号的输出形式(单词种别单词种别,单词自身的值单词自身的值)(1)单词种别单词种别:单词种别表示单词的种类。一个语言的单词符号如何分类、分为几类、如何编码主要取决于处理上的方便。通常,每种单词对应一个整数码。保留字保留字:可全体视为一种,也可一字一种一字一种;标识符标识符:统归为一种;常数常数:统归为一种,或按整、实、布尔等再分;运算符运算符和界符界符:一符一种,或统归为一种。(2)单词自身的值单词自身的值单词自身的值是编译其它阶

4、段需要的信息。对于单词符号,若一个种别只含一个单词,则其种别编码就代表它自身的值。若一个种别含多个单词,则除种别编码外,还应给出单词自身的值,以便把同一种类的单词区别开来。注意:标识符自身的值是标识符自身的字符串,常数自身的值是常数本身的二进制数值二进制数值。此外,也可用指向某类表格中一特定项目的指指针针来区分同类中的不同单词。例如,对于标识符,可用它在符符号号表表的入口指针作为自身的值;常数可用它在常常数数表表的入口指针作为自身的值。2.1.2状态转换图状态转换图词法分析中,可用状状态态转转换换图图识别单词。状态转换图中,结点代表状态;结点之间由有向边连接,有向边上可标记字符。如图,状态i下

5、,若输入字符为x,则读入x并转到状态j;若输入字符为y,则读入y并转到状态k。jkixy状态转换图中状态的数目是有限的,其中必有一个初初态态和若干个终终态态,终态结点用双圈表示。识识别别标标识识符符的的状状态态转转换图换图如下:012 2(a)字母字母或数字其它*012 2(b)数字数字其它*识别无符号整数的状态转换图识别无符号整数的状态转换图如下:*012 72356数字数字数字数字E或数字数字其它数字其它其它E4识别无符号数的状态转换图如下:在状态转换图中,到达单词符号的终态时即给出相应的单词编码。若到达终态时多读入了一个符号,则识别出该单词后再将多读入的那个符号退回。对此类情况的处理方法

6、是在终态上以*作为标识。jki数字字母图2-4不含回路的分支状态对不含回路的分支状态,可让它对应一个switch()语句或一组if-else语句。状态状态i对应的switch语句如下:s=getchar();switch(s)casea:casez:;/*实现状态j功能的语句*/case0:case9:;/*实现状态k功能的语句*/对于含回路的状态,可让它对应一个while语句。ij字母或数字其它状态状态i对应的while语句如下:getchar();while(letter()|digit()getchar();/*实现状态j功能的语句*/状态转换图中的终态终态一般对应一个return()语

7、句。return意味着从词法分析器返回到调用段,一般指返回到语法分析器。2.2 一个简单的词法分析器示例一个简单的词法分析器示例2.2.1C语言子集的单词符号表示语言子集的单词符号表示大多数程序语言的单词符号都可用状态转换图予以识别。下面构造一个C语言子集的简单词法分析器,该C语言子集的所有单单词词符符号号及其种种别别编编码码和内内码码值值如下表所示。由于直接使用整数编码不利于记忆,故该例采用一些助记符表示种别编码。表表2.1C语言子集的单词符号及内码值语言子集的单词符号及内码值单词符号种别编码助记符内码值while1whileif2ifelse3elseswitch4switchcase5c

8、ase标识符6idid在符号表中位置常数7numnum在常数表中位置+8+9*10*=11relopLE11relopLT=11relopEQ=12=;13;2.2.2C语言子集对应的状态转换图的设计语言子集对应的状态转换图的设计首先首先对输入串做预处理。即剔除多余的空格、注释等。其次其次把保留字作为一类特殊标识符处理。即对保留字不专设对应的状态转换图,当状态转换图识别出一个标识符时就去查表,确定它是否为一个保留字。C语言子集对应的状态转换图语言子集对应的状态转换图如下:01*2开始空白字母字母或数字非字母数字34数字数字*非数字返回(id,id在符号表中位置)或返回(保留字,-)返回(num

9、,num在常数表中位置)567*89101112131415*其它其它*;其它*返回(+,-)返回(,-)返回(*,-)返回(relop,LE)返回(relop,LT)返回(relop,EQ)返回(,-)返回(;,-)非法字符错注意注意:(1)状态2识别出一个单词符号后需先查保留字表,若匹配则为保留字,否则为标识符。若为标识符,还需查符号表,看表中是否有此标识符。若符号表中无此标识符,则先将它登录到符号表中,再返回它在符号表中入口地址作为内内码码值值;若表中有此标识符,则直接返回其入口地址作为内内码码值值。(2)状态4识别出一个常数后需先将它转换成二二进进制制常常数数再登录到常数表,然后返回它

10、在常数表中的入口指针作为内码值内码值。2.2.3状态转换图的实现状态转换图的实现状态转换图易于用程序实现,最简单的办法是让每个状态对应一小段程序让每个状态对应一小段程序。对图25,首先引进一组变量和过程:(1)character:字符变量,存放最新读入的源程序字符。(2)token:字符数组,存放构成单词符号的字符串。(3)getbe():若character中字符为空,则调用getchar(),直至character为非空。(4)concatenation():将token中字符串与character中字符连接作为token中的新字符串。(5)letter()和digit():判断chara

11、cter中的字符是否为字母和数字的布尔函数,若是则返回true,否则返回false。(6)reserve():按token数组中的字符串查保留字表,若是保留字则返回其编码,否则返回0。(7)retract():扫描指针回退一个字符,同时将character置为空白。(8)buildlist():将标识符登录到符号表或将常数登录到常数表。(9)error():进行出错处理。C语言子集对应的的词法分析器如下:token=;/*对token数组初始化*/s=getchar();getbe();/*滤除空格*/switch(s)casea:casez:while(letter()digit()conc

12、atenation();/*将当前读入的字符送入token数组*/getchar();retract();/*扫描指针回退一个字符*/c=reserve();if(c=0)buildlist();/*将标识符登录到符号表*/return(id,id在符号表中的入口指针);elsereturn(保留字码保留字码,null);break;case0:case1:case9:while(digit()concatenation();getchar();retract();buildlist();/*将常数常数登录到常数表中*/return(num,num的常数表入口指针);break;case+:r

13、eturn(+,null);break;case-:return(-,null);break;case*:return(*,null);break;case上的一个字字指的是由中字符构成的一个有穷序列;不包含任何字符的序列称为空字空字。*表示上所有字的全体,包括空字。例如,若=a,b则*=,a,b,aa,ab,ba,bb,aaa,2表示不含任何元素的空集。注意注意、和的区别:表示不包含任何字符的序列,它是正规集中的一个元素;表示不含任何字的集合,它是一个空的正规集;表示由空字组成的集合。3使用括号可改变运算符的运算次序。若规定*优先于,优先于|,则在不混淆情况下,可省去括号。4*的正规式R和S

14、的连接连接可形式化为RS=|R&S例如,R=a,b,S=1,2,RS=a1,a2,b1,b25R自身的n次连接记为 Rn=RRR6R0=,R*=R0R1R2R3,R*为R的闭包R+=RR*,称R+是R的正闭包。闭包R*中的每个字都是由R中的字经过有限次连接而成的。对于正规式R和S,若它们表示的正规集L(R)=L(S),则称R和S等价,记为R=S。正规式具有下列性质正规式具有下列性质:(1)交换律:R|S=S|R(2)结合律:R|(S|T)=(R|S)|TR(ST)=(RS)T(3)分配律:R(S|T)=RS|RT(R|S)T=RT|ST(4)同一律:R=R=R例例2.1=a,b,R=a(a|b

15、)*是上正规式,试求R表示的正规集。解:L(R)=L(a(a|b)*)=L(a)L(a|b)*)=L(a)(L(a|b)*=L(a)(L(a)L(b)*=a(ab)*=aa,b*=a,a,b,aa,ab,ba,bb,aaa,=a,aa,ab,aaa,aab,aba,abb,aaaa,例例2.2判断下述正规式之间是否等价:(1)(a|b)*与a*|b*(2)(ab)*与a*b*(3)(a|b)*与(a*b*)*解:(1)(a|b)*对应的正规集其a,b可任意交替出现,如abbaaab,而(a*|b*)对应的正规集只可出现任意个a或任意个b,因此两者不等价。(2)(ab)*对应的正规集以任意个ab

16、对出现,即ababab,而a*b*对应的正规集则是任意个a后接任意个b,即aabb,因此两者不等价。(3)(a|b)*对应的正规集其a,b可任意交替出现,如aababbb,而(a*b*)*可采用如下方法得到相应的字:(a*b*)*(a*b*)(a*b*)(a2b1)(a1b3)aababbb。反之,(a*b*)*产生的任意字也可由(a|b)*得到,因此两者等价。例例2.3证明:若L(a+)=a*-,则a+=aa*证明:L(a+)=a*-=,a,a2,a3,-=a,a2,a3,=a,a,a2=aa*=L(a)L(a*)=L(aa*)故a+=aa*2.3.2有限自动机有限自动机有限自动机(FA)分

17、为确定有限自动机DFA和非确定有限自动机NFA两种。1.确定有限自动机确定有限自动机(DFA)确定有限自动机Md(记为DFAMd)是一个五元组Md=(S,f,s0,Z),其中,(1)S是一个有限状态集;(2)是一个有穷输入字母表;(3)f是一个从S到S的单值映射,如f(si,a)=sj,其中si,sjS,a;(4)s0是唯一的初态,s0S;(5)Z是一个终态集,ZS。例如,图示DFA可表示为Md=(S,f,s0,Z),其中,S=s1,s2,s3,s4=a,b,cf是S到S的单值映射:f(s1,a)=s2,f(s1,b)=s3f(s1,c)=s4s0=s1Z=s2,s3,s4s1s2s3s4cb

18、a2.非确定有限自动机非确定有限自动机(NFA)非确定有限自动机Mn(记为NFAMn)是一个五元组Mn=(S,f,Q,Z),其中,(1)S、Z的意义与DFA相同;(2)f是从S*到S的子集的子集的映射;(3)Q是一个非空初态集非空初态集,QS。NFA和和DFA的主要区别的主要区别:NFA可有若干个初态,而DFA仅有一个初态;NFA的状态转换函数f是一个多值函数,即f(si,a)=某些状态的集合,它表示由当前状态和当前输入字符不能唯一确定下一个状态,即允许同一个状态对同一个输入字符可有不同的输出边;而DFA的状态转换函数f是一个单值函数。例如,图示NFA表示为:Mn=(S,f,Q,Z),其中,S

19、=s1,s2,s3,s4=a,cf是S*到S子集的映射:f(s1,a)=s1,s2,s3f(s1,c)=s4Q=s1Z=s2,s3,s4图27NFA状态转换s1s2s3s4caaa3状态转换图与状态转换矩阵状态转换图与状态转换矩阵DFA和NFA都可用状态转换图状态转换图表示。假定DFA有m个状态、n个输入符,则其状态转换图含有m个状态,每个状态最多有n条输出边与其它状态相连,每条边用中的一个字字符符作标记,整个图含一个初态一个初态和若干个终态。假定NFA有m个状态、n个输入字,则其状态转换图含有m个状态,每个状态最多有n条输出边与其它状态相连,每条边用*中的一一个个字字作标记,整个图含有若干个

20、初态若干个初态和若干个终态。DFA和NFA也可用状状态态转转换换矩矩阵阵表示。状态转换矩阵的行表示状态,列表示输入符,矩阵元素表示f(si,a)的值。例例2.4DFAMd=(s0,s1,s2,a,b,f,s0,s2),且f(s0,a)=s1,f(s0,b)=s2,f(s1,a)=s1f(s1,b)=s2,f(s2,a)=s2,f(s2,b)=s1试给出Md的状态转换图与状态转换矩阵。解:状态转换图:状态转换矩阵:as12 s2s0abbab字符字符状态状态abs0s1s2s1s1s2s2s2s1例例2.5NFAMn=(s0,s1,s2,a,b,f,s0,s2,s1),且f(s0,a)=s2,f

21、(s0,b)=s0,s1,f(s1,a)=f(s1,b)=s2,f(s2,a)=,f(s2,b)=s1试给出Mn的状态转换图与状态转换矩阵。解:状态转换图:状态转换矩阵:字符字符状态状态abs0s2s0,s1s1s2s2s12 s1s0s2bbbba说明:对于FAM,若存在一条从初态到终态的通路,通路上有向边所标识的字符依次连接得到字符串,则称可为FAM所接受接受或称为FAM所识别识别。FAM所能识别的字符串的集合称为FAM所识别的语言,记为L(M)。对任意FAM和FAM,若L(M)=L(M),则称有限自动机M与M等价。2.4 正规式到有限自动机的构造正规式到有限自动机的构造由正规式与有限自动

22、机的等价性知:若R是上的一个正规式,则必存在NFAM,使得L(M)=L(R);反之亦然。2.4.1由正规式构造等价的由正规式构造等价的NFAM由正规式构造等价的NFAM的方法:(1)将正规式R表示为拓广转换图。X2 YR(2)采用下述三条转换规则构造NFAM。sisjr1|r2*1.r1r22.3.sjsjsisir1r2sisisir1r1r1r2sjsjsjsksk对于正规式R,首先将其表示为拓广转换图,其中X为初态,Y为终态,然后逐步运用三条转换规则不断加入新结点,直至每条有向边上仅标识的一个字母或为止,至此NFAM构造完成。例例2.6构造b*(d|ad)(b|ab)+对应的NFA。解:

23、首先用R+=RR*把正规式改造为b*(d|ad)(b|ab)(b|ab)*然后构造其NFAM,如下图所示:b*(d|ad)(b|ab)(b|ab)*XY(b|ab)*d|adb*b|ababadbdb|abb41235bX41d26bb3578adbaabXX132YYY2.4.2NFAM的确定化的确定化首先首先定义定义FAM的任一状态子集I的_CLOSURE(I):(1)若siI,则si_CLOSURE(I);(2)若siI,则从si出发经过所能到达的状态sj属于_CLOSURE(I)。其次定义其次定义Ia:对FAM的任一状态子集I,若a是中的一个字符字符,则定义Ia=_CLOSURE(J)

24、,其中J是从I中某一状态出发经过a所能到达的所有状态的集合。例例2.7对下图,取I=_CLOSURE1=1,2,求从状态I出发经一条有向边a所能到达的状态集J和_CLOSURE(J)。a1524ae e6378e ee eae ee eJ=5,3,4_CLOSURE(J)=5,6,2,3,8,4,7用子集法对用子集法对NFA确定化的方法确定化的方法:(1)构造一张转换表,该表的第1列为状态子集I,不同输入符a对应表中一列Ia。(2)表的首行首列为_CLOSURE(s0)。(3)根据首行首列中的状态集,为每个输入符a求其Ia并记入相应的Ia列中。若此Ia不同于第1列已存在的所有状态子集,则将其顺

25、序列入空行中的第1列。(4)重复(3)直至对每个I及a均已求得Ia,且无新的状态子集Ia加入第1列为止。(5)重命名第1列的每个状态集,所得状态转换矩阵即为与NFAM等价的DFAM。例例2.8正规式(a|b)*(aa|bb)(a|b)*的NFAM如下:试将其确定化为DFAM。34251X6abababab2 Y解:用子集法将上述NFAM确定化为IIaIbX,1,21,2,31,2,41,2,31,2,3,5,6,Y1,2,41,2,41,2,31,2,4,5,6,Y1,2,3,5,6,Y1,2,3,5,6,Y1,2,4,6,Y1,2,4,5,6,Y1,2,3,6,Y1,2,4,5,6,Y1,2

26、,4,6,Y1,2,3,6,Y1,2,4,5,6,Y1,2,3,6,Y1,2,3,5,6,Y1,2,4,6,YSab012132214335464564635重命名为:a2 32 52 42 6120abbaababbaabb于是得到对应的DFA如下:2.4.3DFAM的化简的化简NFA确定化所得的DFA可能含有多余的状态,需化简。所谓DFAM的化简的化简,是指寻找一个状态数比M少的DFAM,使得L(M)=L(M)。化简后的DFAM满足下述条件:(1)无多余状态;(2)状态集中无相互等价的状态。两两个个状状态态相相互互等等价价是指:对于给定的DFAM,假定状态s1,s2S且s1s2,若从s1出

27、发能识别字符串而停于终态,从s2出发也能识别而停于终态;反之,若从s2出发能识别而停于终态,从s1出发也能识别而停于终态,则称s1和s2等等价价,否则称s1和s2是可区分可区分的。DFAM的状态最小化过程状态最小化过程:将M的状态集分割成一些不相交的子集,使得任意两个不同子集的状态是可区分的,而同一子集中的任意两个状态都是等价的。最后,从每个子集中选出一种状态,同时消去其它等价状态,就得到最简的DFAM且L(M)=L(M)。DFAM的化简方法的化简方法:(1)首先将DFAM的状态集S中的终态与非终态分开,形成两个子集,得到基本划分。(2)对当前已划分出的I(1),I(2),I(m)子集,看 每

28、每个个I是否能进一步划分。对某个I(i)=s1,s2,sk,若存在输入字符a使得Ia(i)不不全全包包含含在当前划分的某个子集I(j)中,即跨越两个子集,则将I(i)一分为二。(3)重复(2),直到每个子集均不能再分不能再分。不能再分是指子集要么仅有一个状态,要么有多个状态但这些状态不可区分。(a)无需划分(b)需划分s4s3s3s1s2s1s2aaaa如何进行子集的划分呢如何进行子集的划分呢?假定当前子集I(i)=s1,s2,其中s1和s2经过有向边a分别到达状态t1和t2,而t1和t2分属于当前已划出的两个不同子集I(j)和I(k),则应将I(i)分为两部分:I(i1)=s|sI(i)且s

29、经有向边a到达t1I(i2)=I(i)I(i1)由于t1和t2是可区分的,因此I(i1)中的状态与I(i2)中的状态可区分。划分结束后,子集个数不再增加,从每个子集中选一个状态形成新的DFA。例如,I(i)=s1,s2,s3若挑选s1作为I(i)的代表,则原来指向s2和s3的有向边均改为指向新DFA中的s1。若I(i)中含原来的初态,则s1为新初态;若I(i)中含原来的终态,则s1为新终态。例例2.9化简由例2.8得到的DFA。2 32 52 42 6120abbaababbaabbab解:(1)先将状态集S=0,1,2,3,4,5,6划分为终态集3,4,5,6和非终态集0,1,2。(2)考察

30、0,1,2a:因0,2,1a=1,3不属于3,4,5,6和0,1,2,故将0,1,2划分为0,2和1。(3)考察0,2b:因0,2b=2,4,不属于已划分出的某个子集,故0,2划分为0和2。(4)考察3,4,5,6a:3,4,5,6a=3,6,属于3,4,5,6,故不划分。(5)考察3,4,5,6b:3,4,5,6b=4,5,属于3,4,5,6,故不划分。(6)按顺序把状态子集0,1,2,3,4,5,6重命名为0,1,2,3,得到化简后的DFAM:Sab0121322133331203 3aabbbaab2.4.4正规式到有限自动机构造示例正规式到有限自动机构造示例例例2.10试用DFA的等价

31、性证明正规式(a|b)*与(a*b*)*等价。解:(1)正规式(a|b)*对应的NFA如下:X12 Yab用子集法确定化得如下转换表:IIaIbX,1,Y1,Y1,Y1,Y1,Y1,YSab011111重命名转换表得:于是得到DFA如下:0ab1ab0ba化简:因0,1a=1,故不划分。因0,1b=1,故不划分。因此,最简DFA如下:IIaIbX,1,2,3,Y2,3,1,Y2,3,1,Y2,3,1,Y2,3,1,Y2,3,1,YSab011111重命名得状态转换矩阵:由于(a|b)*和(a*b*)*对应的状态转换矩阵相同,故二者等价。(2)(a*b*)*对应的NFA如图2-20所示,用子集法

32、将NFA确定化得下述转换表:例例2.11C语言可接受的合法文件名为device:name.extension其中device:和.extension可省。假定device,name和extension都是字母串,长度不限但至少为1,试画出识别文件名的DFAM。解:所求正规式为(cc*:|)cc*(.cc*|)相应的NFAM如下图所示:X2Y1234c:ccccc首先进行预处理。然后用子集法确定化、重命名。Sc:.01-112324-35-44-355-IIcI:I.X,21,3,Y-1,3,Y1,3,Y2423,Y-4Y-3,Y3,Y-YY-2 4022 132 5cc:cccc于是得到DFA

33、如下:最后对DFA化简化简,化简后仍为上图。例例2.12某高级程序语言无符号数的正规式为digit+(.digit+)?(e(+|)?digit+)?其中digit表示数字,()?表示()中内容可有可无,试给出其DFAM。解:用d代表digit,其NFA如下图所示:X2 Y1234d5eddddedd+IIIdI.IeX1,Y1,Y1,Y24,523,Y4,55Y3,Y3,Y4,55YYYSd.e0 11 1232 43564 435 66 6用子集法将NFAM确定化,然后重命名。032 1522 42 6ddedddedd于是得到下图所示的DFAM:由状态转换矩阵可见,状态5和6面对输入符号

34、的下一状态相同,但状态5为非终态,状态6为终态,故上述DFA已为最简。例例2.13构造一DFA,它接收=a,b上所有满足下述条件的字符串:该字符串中的每个a都有至少一个b直接跟在其右边。解:=a,b,所求正规式为b*(abb*)*。相应的NFAM如下图所示:X2 Y12babb*X2Y1b342abbIIaIbX,1,2,Y31,2,Y34,2,Y1,2,Y31,2,Y4,2,Y34,2,YSab01213212313用子集法将NFAM确定化,然后重命名。2 02 32 21abaabbb于是得到DFAM如下:2 0bb1a用DFAM的化简方法得到最终划分:0,2,3,1重命名后得到化简的DF

35、AM如下:从FAM到正规式的转换规则如下:sisjr1|r21.2.3.sjsir1r2*sjsir1r1r2sisjsir1r2sjsksir1sjsk2.5 词法分析器的自动生成词法分析器的自动生成由于不同高级语言中单词的结构大致相同,基本上都可用一组正规式描述,因而希望构造一自动生成系统:只要给出某高级语言单词的一组正规式及识别各类单词时应采取的语义动作,该系统便可自动产生该语言的词法分析程序。LEX是美国Bell实验室研制的一个词法分析程序的自动生成工具。对任一高级程序语言,用户必须用正正规规式式描述该语言的各个词法类(LEX的的源源程程序序),LEX就可自动生成该语言的词法分析程序。

36、LEX及其编译系统的作用如下:LEX源程序LEX编译系统词法分析程序L输入串词法分析程序L单词符号串LEX源程序由用“%”分隔的三部分组成:正规式的辅助定义式、识别规则、用户子程序。LEX源程序的书写格式:辅助定义式%识别规则%用户子程序其中,一、三部分可省,识别规则不可省。若用户子程序缺省,则第二个“%”可省;但若无辅助定义式,第一个“%”不能省。一个简单的LEX源程序如下:(单词的类别编码用整数编码表示)AuxiliaryDefinitions/*辅助定义*/letterA|B|C|Z|a|b|c|zdigit0|1|2|3|9%RecognitionRules/*识别规则*/1while

37、return(1,null)2do return(2,null)3ifreturn(3,null)4elsereturn(4,null)5switchreturn(5,null)6return(6,null)7return(7,null)8(return(8,null)9)return(9,null)10+return(10,null)11return(11,null)12*return(12,null)13/return(13,null)14=return(14,null)15;return(15,null)16letter(letter|digit)*if(keyword(id)=0)re

38、turn(16,null);return(id);elsereturn(keyword(id)或letter(letter|digit)*return(16,getSymbolTableEntryPoint()17digit(digit)*val=int(id);return(17,null);return(val)或digit(digit)*return(17,getConstTableEntryPoint()18(letter|digit|(|)|+|*|/|=|;)*return(18,null);inslit(id);return(pointer,lenth)该LEX源程序中用户子程序为空,其中识别规则A18中的过程inslit(id)是将字符串常量字符串常量id存放到字符表中,pointer指向存放该串的起始位置,lenth存放串长度。LEX可以用两种方式来使用:一种是将LEX作为一个单独的工具,用以生成所需的识别程序;另一种是将LEX和语法分析器自动生成工具(如YACC)结合起来使用,用以生成一个编译程序的扫描器和语法分析器。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁