收藏 分享(赏)

编译原理ch3 词法分析。.ppt

上传人:hwpkd79526 文档编号:8139291 上传时间:2019-06-10 格式:PPT 页数:164 大小:1.05MB
下载 相关 举报
编译原理ch3 词法分析。.ppt_第1页
第1页 / 共164页
编译原理ch3 词法分析。.ppt_第2页
第2页 / 共164页
编译原理ch3 词法分析。.ppt_第3页
第3页 / 共164页
编译原理ch3 词法分析。.ppt_第4页
第4页 / 共164页
编译原理ch3 词法分析。.ppt_第5页
第5页 / 共164页
点击查看更多>>
资源描述

1、1,第三章 词法分析,2,学习内容,3.1 词法分析的任务 3.2 词法分析程序的设计与实现 3.3 正规式与有穷自动机 3.4 词法分析程序的自动构造工具,3,学习目标,掌握:词法分析程序的构造,正规式和正规文法到有穷自动机的转换,NFA到DFA的转换、DFA的化简 理解:正规文法、正规式、DFA的概念、NFA的概念 了解:词法分析程序的自动构造工具,4,3.1 词法分析的任务,词法分析是编译过程中的第一个阶段,它的主要任务是扫描源程序,按构词规则识别单词,并报告发现的词法错误。 输入:源程序字符串 输出:单词符号(最基本的语法单位),5,词法分析程序的功能,词法分析程序主要执行以下功能:

2、读入源程序字符串,识别开具有独立含义的最小语法单位单词(符号); 把单词变换成长度统一的且为定长的属性字; 其他功能: 滤掉空格,跳过注释、换行符 某些预加工处理,6,词法分析程序的实现方式,1.词法分析单独作为一遍优点: 结构清晰、各遍功能单一,有利于集中考虑词法分析一些枝节问题。,7,词法分析程序的实现方式,2.词法分析程序作为单独的子程序 更通常情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。,8,词法分析程序的输出,1.单词的种类 单词符号一般可分为下列五种: 基本字(关键字):begin、end、if、while、var 标识符:常量名、变量名

3、、过程名 常数(量):25、3.1415、true、“ABC” 运算符:、*、= 界符:逗点、分号、括号,9,词法分析程序的输出,单词类别:表示单词种类,常用整数编码,它是语法分析需要的 几种常用的单词内部形式: 1)一类一种:按单词种类分类。 2)一字一种:保留字、运算符和分界符采用一符一类,所有标识符为一个编码,所有常数为 一个编码。,10,词法分析程序的输出,2.单词的输出形式: (单词种别,单词符号的属性值) 单词的属性值:指单词符号的特征,通过属性值把同一种类的单词区别开来。关键字、常数、运算符和分界符的属性值即为自身值,标识符的的属性值为为存放该标识符的符号表入口的指针。,11,例

4、1(一类一种),单词的种别可以用整数编码表示,假如标识符编码为1,常数为2,关键字为3,运算符为4,界符为5。 if i=5 then x:=y 关键字 if (3, if) 标识符 i (1,指向i的符号表入口) 等号 (4, = ) 常数 5 ( 2, 5 ) 关键字 then ( 3, then ) 标识符 x ( 4,指向x的符号表入口) ,12,例2(一字一种),C程序while (i=j) i-;输出单词符号:=, - 若一个种别只有一个单词符号,则种别编码就代表该单词符号。,13,3.2 词法分析程序的设计与实现,状态图 状态转换图是为了识别正规文法所表示的单词而设计的一种有限方

5、向图。 在状态转换图中,结点代表状态,用圆圈表示。状态之间用箭弧连接,箭弧上的标记(符号)代表在射出结点状态下可能出现的输入符号或符号类。,14,3.2 词法分析程序的设计与实现,一张状态转换图只包含有限个状态,即有限个结点,其中有一个初态,并由若干终态(用双圆圈表示)。,15,复习正规文法,3型文法(正规文法): 它是2型文法的特例,任一产生式的形式都为 AaB或 Aa,其中A ,BVN ,aVT。 在程序设计语言中,3型文法通常用来描述单词的结构。 正规文法又成为右线性文法。 左线性文法:产生式为 ABa或 Aa,16,由正规文法构造状态图,1.对于右线性文法,状态图的构造步骤如下: 步骤

6、1:增加节点Z为终态(假定文法的字母表中不包括符号Z); 步骤2:将每一个非终结符号设置为一个对应的状态; 步骤3:对于形如Aa的每一个规则,引一条从状态A到Z的弧,弧上标记为a;而对于形如AaB的每个规则,引一条从状态A到B的弧,标记为a(其中BVN ,aVT )。,17,由正规文法构造状态图,2.对于左线性文法,状态图的构造步骤如下: 步骤1:增加节点S为初态(假定文法的字母表中不包括符号S); 步骤2:将每一个非终结符号设置为一个对应的状态; 步骤3:对于形如Aa的每一个规则,引一条从状态S到A的弧,弧上标记为a;而对于形如ABa的每个规则,引一条从状态B到A的弧,标记为a(其中BVN

7、,aVT )。,18,例子,假设某语言的标识符用一下正规文法来定义: GS: SlA A lA dA这里l,d VT ,l az, d 09,构造该文法的状态图。,19,状态转换图识别的串,在状态转换图中,从某一初态结点到某一终态结点序列称为路。对于某一符号串,若存在一条路产生,则称符号串能被该状态转换图识别,否则符号串不能被该状态转换图识别。,20,例子,21,词法分析程序的构造,程序设计语言各类单词的词法都能用相应的正规文法来描述,由正规文法可以构造出相应的状态图,进而识别一个单词。 状态转换图非常容易用程序来实现,最简单的办法是让每一个状态结对应一小段程序 一个词法分析程序可以通过一下步

8、骤得到:1.根据语言的词法规则写出描述单词的正规文法;2.将正规文法转换成相应的状态图;3.将状态图转换成算法的流程图,进而实现词法分析程序。,22,例子:状态转换图的实现,构造一个识别某种简单语言所有单词符号的转换图,下表列出了这个语言的所有单词符号。,23,24,几点重要限制不必使用超前搜索 所有基本字都是保留字;用户不能用它们作自己的标识符 基本字作为特殊的标识符来处理;不用特殊的状态图来识别,只要查保留字表。 如果基本字、标识符和常数(或标号)之间没有确定的运算符或界符作间隔,则必须使用一个空白符作间隔。DO99K=1,10 要写成 DO 99 K=1,10,25,思想:每个状态结点对

9、应一小段程序。 做法: 1)对不含回路的分叉结,可用一个CASE语句或一组IF-THEN-ELSE语句实现,GetChar( ); if (IsLetter( ) 状态j的对应程序段; else if (IsDigit( ) 状态k的对应程序段; else if (ch=/) 状态l的对应程序段; else 错误处理;,26,2)对含回路的状态结,可对应一段由WHILE结构和IF语句构成的程序.,GetChar( ); while (IsLetter( ) or IsDigit( )GetChar( ); 状态j的对应程序段,27,3)终态结点表示识别出某种单词符号,因此,对应语句为RETUR

10、N (C,VAL)其中,C为单词种别,VAL为单词自身值.,28,全局变量与过程 1)ch 字符变量、存放最新读入的源程序字符 2)strToken 字符数组,存放构成单词符号的字符串 3)GetChar 子程序过程,把下一个字符读入到 ch 中 4)GetBC 子程序过程,跳过空白符,直至 ch 中读入一非空白符 5)Concat 子程序,把ch中的字符连接到 strToken,29,6)IsLetter和 IsDisgital 布尔函数,判断ch中字符是否为字母和数字 7)Reserve 整型函数,对于 strToken 中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0 8)

11、Retract 子程序,把搜索指针回调一个字符位置 9)InsertId 整型函数,将strToken中的标识符插入符号表,返回符号表指针 10)InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针。,30,int code, value; strToken := “ ”; /*置strToken为空串*/ GetChar(); GetBC(); if (IsLetter() beginwhile (IsLetter() or IsDigit()beginConcat(); GetChar(); endRetract();code := Reserve()

12、;if (code = 0)beginvalue := InsertId(strToken);return ($ID, value);endelsereturn (code, -); end,31,else if (IsDigit() beginwhile (IsDigit()beginConcat( ); GetChar( );endRetract();value := InsertConst(strToken);retrnr($INT, value); end else if (ch =) return ($ASSIGN, -); else if (ch =+) return ($PLUS

13、, -);,32,else if (ch =*) beginGetChar();if (ch =*) return ($POWER, -);Retract(); return ($STAR, -); end else if (ch =;) return ($SEMICOLON, -); else if (ch =() return ($LPAR, -); else if (ch =) return ($RPAR, -); else ProcError( ); /* 错误处理*/,33,3.3 正规式与有穷自动机,用正规表达式描述词法规则 构造正规表达式等价的NFA 构造NFA等价的DFA 化简

14、DFA 根据DFA编写程序,实现词法分析器 正规式NFA DFA DFA最小化词法分析器,34,单词的描述工具,作用: 描述单词的构成规则,基于这类描述工具建立词法分析技术,进而实现词法分析程序的自动构造. 工具有: 正规文法正规式(Regular Expression),35,为什么要引进正则表达式?,对于字母表,我们感兴趣的是它的一些特殊字集正规集。 正规集是字母表上的符合一定规则的符号串构成的集合 正则表达式是一种适合描述符号的表示法,可由它定义正规集。,36,正规式(regular expression),定义(正规式和它所表示的正规集): 设字母标为 1 和都是上的正规式,它们所表示

15、的正规集分别为和; 2 任何a ,a是上的一个正规式,它所表示的正规集为a;,37,正规式(regular expression),3 假定e1和e2都是上的正规式,它们所表示的正规集分别为L(e1)和L(e2),那么,(e1), e1e2, e1e2, e1也都是正规式,它们所表示的正规集分别为L(e1), L(e1)L(e2), L(e1)L(e2)和(L(e1)。(递归) 4 仅由有限次使用上述三步骤而定义的表达式才是上的正规式,仅由这些正规式所表示的字集才是上的正规集。,38,其中的“”读为“或”(也有使用“+”代替 “” 的);“ ”读为“连接”;“”读为“闭包”(即,任意有限次的自

16、重复连接)。在不致混淆时,括号可省去,但规定算符的优先顺序为“”、“ ”、“” 。连接符“ ”一般可省略不写。“”、“ ”和“” 都是左结合的。,正规式(regular expression),39,例 令=a,b, 上的正规式和相应的正规集的例子有:正规式 正规集 a a ab a,b ab ab (ab)(ab) aa,ab,ba,bb a ,a,a, 任意个a的串 (ab) ,a,b,aa,ab 所有由a 和b组成的串 (ab)(aabb)(ab) 上所有含有两个相继 的a或两个相继的b组成 的串,40,例 =l,d,r=l(l d) 定义的正规集: l,ll,ld,ldd,(标识符)

17、例 =d,.,e,+,-,则上的正规式 d(.dd )(e(+- )dd )表示的是无符号数的集合。其中d为09的数字。 正规式比正规文法更容易让人理解单词是按怎样的规律构成的,且可以从某个正规式自动地构造识别程序。,举例,41,正规式的运算律,设r,s,t为正规式,正规式服从的代数规律有: 1. rs=sr “或”服从交换律 2. r(st)=(rs)t “或”的可结合律 3 . (rs)t=r(st) “连接”的可结合律 4 . r(st)=rsrt (st)r=srtr 分配律 5 . r=r, r=r 是“连接”的恒等元素 6 . rr=r r* =|r|rr| “或”的抽取律,42,

18、两个正规式等价,若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价,写作e1=e2。例如: e1= (ab), e2 = ba又如: b(ab) = (ba)b (ab) = (ab),43,正规文法和正规式间的转换,等价性: 对任意一个正规文法,存在一个定义同一语言的正规式 对任意一个正规式,存在一个定义同一语言的正规文法,44,将上的一个正规式r转换成正规文法,VT= ,首先形成产生式Sr,S为G的开始符,r为正规式 不断利用下面的规则做变换,直到每个产生式最多含有一个终结符为止,45,例: 将R=a(a|d)*转换成相应的正则文法 令转换成文法G=(VN,VT,P,S) 其中V

19、T=a,d, 文法开始符为S 首先形成Sa(a|d)*,然后变换 SaA A(a|d)*,A(a|d)A A,AaA AdA,最终有产生式: SaA , A , AaA,AdA,46,将正规文法转换成正规式,将每条产生式改写为正规式 用代入法解正规式方程组 最后只剩下一个开始符号定义的正规式,其中不含非终结符,47,例:将文法GS转换成正规式G:Sa A|aAdA|d 先由产生式得: S=aA|a A=d*d 将A代入S中得: S=ad*d|a 利用正规式变换得 S=a(d*d|)=ad*说明:d*d| =(|d|dd|)d|=d|dd|= d* 所求正规式为ad*,48,有穷自动机 (Fin

20、ite Automata),49,词法规则的描述,状态转换图 难于书写,非线性结构 更好的方式的要求 线性方式表达 与状态转换图等价,50,有穷自动机(也称有限自动机),是一种识别装置 作用:能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合 意义:为词法分析程序的自动构造寻找特殊的方法和工具。 分类:确定的有穷自动机(Deterministic Finite Automata)不确定的有穷自动机(Nondeterministic Finite Automata),51,确定型有穷状态自动机DFA,一个确定的有穷自动机(DFA)D是一个五元组:D=(K,f,S,Z)其中 K:有

21、穷非空的状态集合; :有穷非空的输入符号字母表;f:转换函数,是在KK上的映像,即,如 f(ki,a)=kj,(kiK,kjK)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;SK是唯一的一个初态;Z_ K是非空的终态集合。,52,DFA的确定性表现在转换函数f:KK是一个单值函数,也就是说,对任何状态kK,和输入符号a,f(k,a)唯一地确定了下一个状态。从状态转换图来看,若字母表含有n个输入字符,那末任何一个状态结点最多有n条弧射出,而且每条弧以一个不同的输入字符标记。,53,例:有DFA M=(0,1,2,3,a,b,f,0,3) 其中f

22、为:f(0,a)=1 f (0,b)=2f (1,a)=3 f (1,b)=2 f (2,a)=1 f (2,b)=3 f (3,a)=3 f (3,b)=3 识别上所有含有相继两个a或相继两个b的字,54,有限自动机可以用状态转换矩阵表示。 一个DFA可用一个矩阵表示,该矩阵的行表示状态,列表示输入字符,矩阵元素表示f(s,a)的值,这个矩阵称状态转移矩阵。 上例所对应的状态转移矩阵如图:,f(0,a)=1 f (0,b)=2f (1,a)=3 f (1,b)=2 f (2,a)=1 f (2,b)=3 f (3,a)=3 f (3,b)=3,从有穷状态自动机构造状态转换图,55,有限自动机

23、也可以表示成状态转换图。,f(0,a)=1 f (0,b)=2f (1,a)=3 f (1,b)=2 f (2,a)=1 f (2,b)=3 f (3,a)=3 f (3,b)=3,56,从状态转换图构造有穷状态自动机,例如:从下面状态图构造DFA DFA D=(S,Z,A,B,a,b,M,S,Z) 其中M定义为:M(S,a)=A M(S,b)=B M(A,a)=Z M(A,b)=B M(B,a)=A M(B,b)=Z M(Z,a)=Z,57,运行DFA与识别一个字符串,对于中的任何字,若存在一条从初态结点到某一终态结点的通路,且这条通路上的所有弧的标记符连接成的字等于,则称可被DFA M所识

24、别(读出或接受)。 若M的初态结点同时又是终态结点,则空字可为M所识别(或接受)。,58,DFA的行为很容易用程序来模拟.DFA M=(K,f,S,Z)的行为的模拟程序 K:=S; c:=getchar; while ceof do K:=f(K,c);c:=getchar; if K is in Z then return (yes)else return (no),59,运行DFA与识别一个字符串,有限状态机M所能识别的符号串的全体记为L(M)。 可以证明:上的字集V*是正规集,当且仅当存在上的DFA M,使得VL(M)。,60,举例,例:从下图结点S出发,最终到达结点Z,请判断01101

25、 或1001可否被识别?,61,非确定有穷状态自动机,一个非确定的有穷自动机(NFA)D是一个五元组:N=(K,M,S,F)其中 K:有穷非空的状态集合; :有穷非空的输入字母表; M:转换函数,是在K * 到K的子集(2 K) 所组成集合的映像, M(R, T)=Q1,Q2,.Qn S=K是非空的初态集合; F=K是非空的终态集合.,62,DFA与NFA的区别,DFA是NFA的特例。,63,举例,文法G3.2:Z-Za|Aa|Bb;A-Ba|Za|aB-Ab|Ba|b对应的自动机NFA N=(S,A,B,Z,a,b,M,S,Z) 其中M:M(S,a)=A M(S,b)=BM(A,a)=Z M

26、(A,b)=BM(B,a)=A,B M(B,b)=ZM(Z,a)=A,Z,a,b,S,A,B,a,b,Z,b,a,a,a,a,64,运行NFA与识别一个字符串,对于*中的任何字 ,若存在一条从某一初始态结点到某一终态结点的通路,且这条通路上所有弧的标记字依次连接成的字(忽略那些标记为的弧)等于 ,则称可为NFA M所识别。 若M的某些结点既是初态结点同时又是终态结点,或者存在一条从某个初态结点到某个终态结点的通路,则可被M识别,65,例:识别(a|b)*ab 的NFA,66,识别所有含相继两个a 或相继两个b的字,67,举例(字符串被NFA所接受),对于输入字符串babbabb,运行G3.2的

27、NFA,a,b,A,B,a,b,Z,b,a,a,a,a,S,68,运行NFA,运行NFA:识别一个字符串是否被NFA所接受,是否能达到终态集合中的某个状态 状态转换图的下一状态不唯一,如何解决?,69,DFA和NFA的关系,DFA、NFA都可以识别一个字符集上的字符串 可以用DFA、NFA定义上的字符串的集合 DFA是NFA的特例.对每个NFA N一定存在一个DFA ,使得 L(M)=L(N)。对每个NFA N存在着与之等价的DFA M。 与某一NFA等价的DFA不唯一。 有一种算法,将NFA转换成接受同样语言的DFA。这种算法称为子集法。,70,NFA到DFA的变换,Z定义1:首先定义FA

28、M的任一状态子集I的_CLOSURE(I):(1)若qI, 则q_CLOSURE(I);(2)若qI, 则从q出发经过任意条弧所能到达的任何状态q 都属于_CLOSURE(I)。 定义2:对FA M的任一状态子集I, 若a是中的一个字符,则定义 Ia=_CLOSURE(J),其中J是从I中某一状态出发经过a所能到达的所有状态的集合。,71,例子,例:如图所示的状态图:令I=1,求-closure(I)=? Ia=?根据定义:-closure(I)=1,3Ia=-closure(J)=-closure(1,a))=-closure(2,4)=2,4,6,72,对于每个NFA M存在一个DFA M

29、”,使L(M)=L(M”)。 步骤一:对NFA M=(S, ,,S0, F) 的状态转换图进行以下改造: 引进新的初态结点X和终态结点Y,X,Y S ,从X到S0中任意状态结点连一条箭弧,从F中任意状态结点连一条箭弧到Y。 对M的状态转换图按如下方式实施替换,其中k是新引入的状态。,转化步骤,73,A,j,74,重复这种分裂过程直至状态转换图中的每条箭弧上的标记为,或为中的单个字母。将最终得到的NFA记为M,显然L(M)=L(M). 步骤二:用子集法对NFA确定化,75,用子集法对NFA确定化: (1)构造一张转换表, 该表的第1列为状态子集I,不同输入符a 对应表中一列Ia。 (2)表的首行

30、首列为_CLOSURE(X)。 (3)根据首行首列中的状态集, 为每个输入符a求其Ia并记入相应的Ia列中。若此Ia不同于第1列已存在的所有状态子集, 则将其顺序列入空行中的第1列。 (4)重复(3)直至对每个I及a均已求得Ia, 且无新的状态子集Ia加入第1列为止。 (5)重命名第1列的每个状态集, 所得状态转换矩阵即为与NFA M等价的DFA M”。,76,把NFA确定化的过程:不失一般性,设字母表只包含两个a和b,我们构造一张表:,77,首先,置第1行第1列为-closure(X)求出这一列的Ia,Ib; 然后,检查这两个Ia,Ib,看它们是否已在表中的第一列中出现,把未曾出现的填入后面

31、的空行的第1列上,求出每行第2,3列上的集合. 重复上述过程,直到所有第2,3列子集全部出现在第一列为止。,78,例:正规式(a|b)*(aa|bb)(a|b)*的NFA M如下,试将其确定化为DFA M。,79,现在把这张表看成一个状态转换矩阵,把其中的每个子集看成一个状态。 这张表唯一刻划了一个确定的有限自动机M,它的初态是-closure(X) ,它的终态是含有原终态Y的子集。 不难看出,这个DFA M与M等价。,80,81,练习:已知有限自动机如图,(1)以上状态转换图表示的语言有什么特征? (2)构造识别该语言的有限自动机DFA.,82,83,DFA的化简,说一个有穷自动机是化简了的

32、,即是说,它没有多余状态并且它的状态中没有两个是互相等价的。一个有穷自动机可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有穷自动机。 所谓有穷自动机的多余状态,是指这样的状态:从自动机的开始状态出发,任何输入串也不能到达的那个状态;或者从这个状态没有通路到达终态。,84,DFA的最小化就是寻求最小状态DFA,最小状态DFA的含义: 没有多余状态(死状态) 没有两个状态是互相等价(不可区别) 两个状态s和t可区别:不满足 兼容性同是终态或同是非终态 传播性从s出发读入某个aa和从 t出发读入某个a到达的状态等价。,85,对一个DFA M最小化的基本思想:把M的状态集划分为一些不相

33、交的子集,使得任何两个不同子集的状态是可区别的,而同一子集的任何两个状态是等价的。最后,让每个子集选出一个代表,同时消去其他状态。,86,具体做法: 对M的状态集进行划分 首先,把S划分为终态和非终态两个子集,形成基本划分。 假定到某个时候,已含m个子集,记为=I(1),I(2),I(m),检查中的每个子集看是否能进一步划分: 对某个I(i),令I(i)=s1,s2, ,sk,若存在一个输入字符a使得Ia(i) 不会包含在现行的某个子集I(j)中,则至少应把I(i)分为两个部分。,87,重复上述过程,直到所含子集数不再增长。 对于上述最后划分中的每个子集,我们选取每个子集I中的一个状态代表其他

34、状态,则可得到化简后的DFA M。 若I含有原来的初态,则其代表为新的初态,若I含有原来的终态,则其代表为新的终态。,88,89,90,练习:将下面的DFA最小化,91,将这个DFA最小化: 首先分终态和非终态两个集:K1=1,2 和 K2=3,4。由于状态1输入1到达状态K1集,而状态2输入1到达K2集故将k1分为K11=1, K12=2;由于状态3,和 4 输入1,或0 都到达k2集所以状态3,4等价。则可以分割成三个子集:1,2,3,4 。,92,从正规式到词法分析器,构造词法分析器的一般方法和步骤:用正规式对模式进行描述;为每个正规式构造一个NFA,它识别正规式所表示的正规集;将构造出

35、的NFA转换成等价的DFA,这一过程也被称为确定化;优化DFA,使其状态数最少,这一过程也被称为最小化;从优化后的DFA构造词法分析器。,93,正规式与有限自动机的等价性 定理:1. 对任何FA M,都存在一个正规式r,使得L(r)=L(M)。2. 对任何正规式r,都存在一个FA M,使得L(M)=L(r)。,正规式NFA,94,1.有穷自动机正则式 第一步,在M的状态转换图上加进两个结,一个为x结点,一个为y结点。从x结点用弧连接到M的所有初始结点,从M的所有终态结点用弧连接到y结点。形成一个与M等价的M, M只有一个初态x和一个终态y 第二步,逐步消去M中的所有结点,直至只剩下x和y结点。

36、在消结过程中,逐步用正规式来标记弧,95,其消结的规则如下:,最后x和y结点间的弧上的标记则为所求的正规式r,96,例:已知一个NFA如下图a所式。将其转换成正规式。,97,98,练习:,99,2.正则式 有穷自动机 语法制导方法:按正规式的语法结构指引构造过程,首先将正规式分解成一系列子表达式,然后使用下面规则为r构造NFA,对r的各种语法结构的构造规则具体描述如下:,1. (a) 对于正规式,所构造的NFA为:,100,(b) 对于正则式,所构造NFA:,(c)对于正则式a,a,则 NFA:,101,2. 若s,t为上的正则式,相应的NFA分别为N(s)和N(t);,(a)对于正则式R=s

37、|t, NFA(R),(b)对正则式R=st,NFA(R),102,(c)对于正则式R=s*, NFA(R),(d)对R=(s),与R=s的NFA一样.,103,例:为R=(a|b)*abb构造NFA,使L(N)=L(R),104,105,其实,分解R的方式很多,用下图的(a)(b)(c)(d) 分别表明另一种分解方式和所构造的NFA。,106,107,更简单的方法:构造上的NFA M 使得 L(V)=L(M)。首先,把V表示成:,然后,按下面的三条规则对V进行分裂,108,109,例:,(a|b)*(aa|bb)(a|b)*,110,111,对于正规文法G和有限自动机M,如果L(G)L(M)

38、,则称G和M是等价的。关于正规文法和有限自动机的等价性,有以下结论:,正规文法与有限自动机的等价性,112,定理:1.对每一个右线性正规文法G或左线性正规文法G,都存在一个有限自动机(FA) M,使得L(M)L(G)。2.对每一个FA M,都存在一个右线性正规文法GR和左线性正规文法GL,使得L(M)L(GR)L(GL)。,113,1.将正规文法(右线性文法)转换为有穷自动机 设右线性文法G=(VN,VT,P,S),下面介绍将其转换成有穷自动机M=(K,f,S0,Z),使得L(G)=L(M)的方法。令K=VNZ,Z是M中新增的终态;=VT, S0=S;f由下列方法确定: 对于G的每条形如AaB

39、的规则,在M中设转换函数f(A, a)=B; 对于G的每条形如Aa的规则,在M中设转换函数f(A, a)=Z。,114,例:对于正规文法GS:SaB|bB BbS|a|b,可以转换成自动机M=(K,f,S0,Z),其中:K=S,B,Z,=a,b,S0=S,Z=Z,f为:f(S, a)=B,f(S, b)=B,f(B, b)=S,f(B, a)=Z,f(B, b)=Z。这是一个NFA。对应的状态图如下:,115,练习:将下列文法转换为FA(状态转换图) A0 | 0B | 1D B0D | 1C C0 | 0B | 1D D0D | 1D,116,从GR出发构造NFA M = ,M的状态转换图如

40、右图所示。,117,将左线性文法转换为有穷自动机 设左线性文法G=(VN,VT,P,S),有穷自动机M=(K,f,S0,Z),则M中的K=VNS0,S0 是M中新增的初态;=VT, Z=S;f由下列方法确定: 对于G的每条形如ABa的规则,在M中设转换函数f(B, a)=A; 对于G的每条形如Aa的规则,在M中设转换函数f(S0, a)=A。,118,例:设左线性文法GS:SSa|Aa|Bb ABa|a BAb|b,则按照上述方法构造的有穷自动机.,119,设左线性文法GS:SSa|Aa|Bb ABa|a BAb|b,则按照上述方法构造的有穷自动机为M=(K,f,S0,Z),其中:K=S0,A

41、,B,S,=a,b,Z=S,f为:f(S, a)=S,f(A, a)=S,f(B, b)=S, f(B, a)=A,f(S0, a)=A,f(A, b)=B,f(S0, b)=B。其对应的状态图如下:,120,2.将有穷自动机转换成右线性文法 若有限自动机是NFA则将其确定化,设确定的有穷自动机M=(K,f,S0,Z),则转换得到右线性文法G=(VN,VT,P,S),其中:VN=K,VT=,S=S0,P中的规则用如下方法确定: 对M中任一形如f(A, a)=B的转换函数,有规则AaBP; 对M中的终态Z,则加一条规则ZP。,121,例:给出与下图的NFA等价的正规文法G,122,自动机、正则文

42、法、正则表达式的相互转化,123,例:请构造与正则式R=(a*b)*ba(a|b)* 等价的状态最少的DFA。 (1)首先构造NFA:,124,125,(2)NFA确定化,126,得到DFA:,127,(3)DFA最小化,128,练习,构造识别字母表a,b上以“a”开始,以“bb”结尾的所有字符串的状态最小的DFA。,129,词法分析程序的实现,词法分析程序的构造方法 词法分析程序的编写,130,构造词法分析程序的方法,用手工方式,即根据识别语言单词的状态转换图,使用某种高级语言,例如,C语言直接编写词法分析程序。 利用自动生成工具LEX自动生成词法分析程序。,131,词法分析程序实现中 要考

43、虑的问题,确定实现词法分析程序的执行方式 确定属性字的结构 缓冲区预处理,超前搜索 关键字的处理,符号表的实现 查找效率,算法的优化实现 词法错误处理,132,属性字,词法分析程序输出属性字一般采用下面的形式:(符号类,符号值) 属性字是符号的机内表示,有统一固定的长度,133,超前搜索,源程序的输入和预处理 在内存开辟缓冲区,将程序文本放进该缓冲区 预处理:删除无用字符等 当词法分析器调用预处理程序时,预处理程序就处理一定长度的字符并将其装入词法分析器所指定的缓冲区。,134,词法分析程序对缓冲区扫描时,设置两个指示器,一个指向当前正在识别的单词的开始位置,称为起始指针;另一个用于向前搜索,

44、以寻找单词的终点,称为扫描指针。,135,WhatALongWord,136,单词符号的识别:超前搜索 词法分析程序在读取单词时,为了判断是否已读入整个单词的全部字符,常采取向前多读取字符并通过读取的字符来判别,即所谓超前搜索技术。 例如:DO99K=1,10 DO 99 K = 1,10 DO99K=1.10 需要超前搜索才能确定哪些是基本字,137,关键字的识别与查表算法,对于关键字,先把它们当成标识符,然后去查关键字表。若在表中查到,则为关键字,获取相应的类别码;否则,认为是标识符。 查找算法: 线性查找 折半查找 Hash函数,138,出错处理,对定义外的(如,对首字符不是字母的,不是

45、数字的,不是运算符和分界符的)单词进行出错处理。,139,词法分析中使用的数据,字符表:(字母表)列出源程序中所有可能的字符。 特定符号与机内表示表:一切特定符号与相应编码。 标识符表:登录一切源程序中出现的一切标识符。此表的序号作为属性字的值。 常数表:登录一切源程序中出现的常数。此表的序号作为属性字的值。,140,使用状态图设计词法分析程序,多数语言的词法规则可用正则文法和正则表达式来描述。正则文法或正则表达式定义的语言都可以被状态图识别。 使用状态图设计词法分析程序的步骤如下: 对程序设计语言的单词按类构造相应的状态图。(这里把关键字与标识符作为一类) 合并各类单词的状态图,增加一个出错

46、处理终态,构成一个识别该语言所有单词的状态转换图 对状态图的每一个终点编一段相应的子程序。,141,2,0,1,字母,字母|数字,其它,3,4,5,6,数字,数字,其它,+,-,7,8,*,/,9,10,11,13,=,:,;,16,17,其它,13,=,举例,142,词法分析程序的结构,取字符子程序 取符号子程序,一般有如下约定: 进入子程序时,已经取到当前符号的一个字符。 离开子程序时,已经取到其后继字符。 查造标识符表子程序 查造常量表子程序 查符号机内表示对照表子程序,143,词法分析程序的自动生成(Lex),LEX是由美国Bell实验室的M.Lesk和Schmidt于1975年用C语

47、言研制的一个词法分析程序的自动生成工具。对任何高级程序语言,用户必须用正规表达式描述该语言的各个词法类(这一描述称为LEX的源程序),LEX就可以自动生成该语言的词法分析程序。LEX及其编译系统的作用如图。,144,图 LEX及其编译系统的作用,145,一个LEX源程序由用“%”分隔的三部分组成:第一部分为正规式的说明,第二部分为识别规则,最后一部分为用户子程序。其书写格式为:说明部分%识别规则%用户子程序,146,其中,说明部分和用户子程序是任选的,而识别规则是必需的。如果用户子程序缺省,则第二个分隔符号“%”可以省去;但如果无说明部分,第一个分隔符号“%”不能省去,因为第一个分隔符号用于指示识别规则部分的开始。,147,说明部分:对识别规则部分要引用的文件和变量进行说明,通常可包括头文件表、常数定义、全局变量定义以及正规式定义等。正规式定义用来定义在规则部分引用的正规式,类似于c的宏定义。除宏定义外,其余代码用%和%括起来。,148,% #include ”stdio.h”int sum#define PI 3.14 % digit 0-9 letter A-Za-z id (letter) (letterdigit)*,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报