1、编译程序原理与实现,张晶2011.3,第2章 outline,一、词法分析概述 1,词法分析程序的功能 2,词法分析相关的一些问题 二、正则表达式 三、有限自动机 1,确定有限自动机DFA 2,非确定有限自动机NFA,NFA到DFA的转换 3,DFA的化简 4,正则表达式到NFA的转换 四、词法分析程序构造,三、有限自动机,正则表达式 - specification 有限自动机 Implementation 什么是有限自动机?有限自动机是描述有限状态系统的数学模型。 有限状态系统: 状态:是将事物区分开的一种标识. 具有离散状态的系统:如数字电路(0,1);电灯开关(on,off);十字路口的
2、红绿灯;其状态数是有限的。 具有连续状态的系统:水库的水位、室内的温度等可以连续发生变化;可以有无穷个状态. 有限状态系统是离散状态系统。 在很多领域,如网络协议分析、形式验证、代码安全、排版系统等有重要应用。,有限自动机的例子-经典的过河问题,一个人带着一头狼,一头羊,以及一棵白菜处于河的左岸。人和他的伴随品都希望渡到河的右岸。有一条小船,每摆渡一次,只能携带人和其余三者之一。如果单独留下狼和羊,狼会吃羊;如果单独留下羊和白菜,羊会吃菜。怎样才能渡河,而羊和白菜不会被吃掉呢?,过河问题模型化,有限自动机的模型,有限自动机FA可以理解成状态控制器 FA有有限个状态,其中有初始状态,终止状态 起
3、始:处于初始状态,读头位于输入带开头 中间:从左到右依次读取字符,发生状态迁移 结束:读头到达输入带末尾,状态到达终态,输入带,输出,有限自动机的五要素,有限状态集 SS 有限输入符号集 转移函数 (s,a) = t 一个开始状态s0 一个终止状态集 TS输入:字符串 输出:若输入字符串结束,且到达终止状态,则接受,否则拒绝。 例如: “101” 输出拒绝,“1010”输出接受。,1、确定有限自动机DFA,确定有限自动机DFA是一个五元组 M =(SS,S0,TS), SS :有限的状态集合 S0,S1,S2, :有限的输入字符表 :状态转换函数,SS SS 是单值全映射函数; S0 :初始状
4、态, S0 SS TS :终止状态集,TSSS,例1:DFA M=(0,1,2,3,4,a,b,0,3) 其中为: ( 0, a ) = 1 ( 0, b ) = 4 ( 1, a ) = 4 ( 1, b ) = 2 ( 2, a ) = 3 ( 2, b ) = 4 ( 3, a ) = 3 ( 3, b ) = 3 ( 4, a ) = 4 ( 4, b ) = 4,DFA的两种表示形式,转换表(transition table) 易于实现 转换图(transition graph) 直观,易于理解,转换表,行:状态 列:字符 元素:表示状态转换,状态或 开始状态:默认表的第一行表示开始
5、状态,或者状态加上角标+ 终止状态:状态加上角标-,转换表,例1:DFA M=(0,1,2,3,4,a,b, ,0,3) 其中为:( 0, a ) = 1 ( 0, b ) = 4 ( 1, a ) = 4 ( 1, b ) = 2 ( 2, a ) = 3 ( 2, b ) = 4( 3, a ) = 3 ( 3, b ) = 3 ( 4, a ) = 4 ( 4, b ) = 4,转换图,状态 转换边f(S1,a) = S2开始状态终止状态,S0,S,S,a,S1,S2,转换图,0,2,1,3,a,b,a,b,a,b,b,a,4,a,b,转换图,DFA的例子,例2:,: a, b, c,
6、d SS: S0, S1, S2, S3 开始状态: S0 终止状态集: S3 f: (S0,a) S1, (S0,c)S2, (S0,d)S3, (S1,b)S1, (S1,d)S2, (S2,a)S3, (S3, c)S3,S1,S2,DFA的确定性,形式定义 初始状态唯一:S0 转换函数是单值函数,即对任一状态和输入符号,唯一地确定了下一个状态 转换表 初始状态唯一:第一行 表元素唯一 转换图 初始状态唯一: 每个状态最多发出n条边,n是字母表中字母的个数,且发出的任意两条边上标的字母都不同,DFA的一些概念,DFA接受的字符串 如果M是一个DFA, a1 a2 an 是一个字符串,如果
7、存在一个状态序列 (S0, S1 , ,Sn),满足S0 S1 , S1 S2 , , Sn-1 Sn 其中 S0 是开始状态,Sn 是接受状态之一,则串a1 a2 an 被DFA M接受.DFA定义的串的集合(DFA接受的语言) DFA M接受的所有串的集合,称为M定义的语言,记为 L(M),DFA接受的语言,例1中自动机接受的语言是L(aba(a|b)*)例2中自动机接受的语言是 L(ab*da | ca | d)c*),DFA接受的语言,若DFA M只有一个状态,既是开始状态又是终止状态,则DFA M定义的串集是L() = 若若DFA M只有一个状态,并且是开始状态或DFA M有若干个状
8、态,但开始状态到终止状态之间没有通路,则DFA M定义的串集是空集,或,设计有限自动机,自动机的设计是一个创造过程,没有固定的算法和过程 例1: = a,b,构造自动机识别由所有奇数个a和奇数个b组成的字符串。,S奇a,奇b,S奇a,偶b,S偶a,奇b,S偶a,偶b,b,b,b,a,a,b,a,a,关键:不需要记住所看到的整个字符串,只需记住至此所看到的a和b的个数是奇数还是偶数,设计有限自动机,例2:设计有限自动机M,识别0,1上的语言 L = x000y| x,y0|1*分析:该语言的特点是每个串都包含连续3个0的子串。自动机的任务就是识别/检查 000 的子串。(注:遇同一个条件不能变成
9、不同的状态),q0,q1,q2,q3,0,0,0,1,1,1,0,1,设计有限自动机,?例3:设计有限自动机M,识别0,1,2上的语言,每个字符串代表的数字能整除3。分析: (1) 一个十进制数除以3,余数只能是0,1,2;(2) 被3整除的十进制数的特点:十进制数的所有位数字的和能整除3。,q0,q1,q2,1,1,0,2,1,0,0,2,2,DFA与程序设计语言的单词结构,例4:使用DFA定义程序设计语言的无符号实数0.12, 34.15 接受00.12, 00., ., 33. 拒绝,DFA与程序设计语言的单词结构,例5:使用DFA定义程序设计语言的标识符x, Xy, x123, xYz
10、 接受 23x, 12_x, _x 拒绝,q0,q1,letter,letter,digit,DFA与程序设计语言的单词结构,例6:使用DFA定义程序设计语言的保留字 if, else, while, for,i,f,s,e,e,l,i,l,h,e,w,r,o,f,DFA的实现,目的 给定一个DFA M定义了一个串集 编写一个程序,检查给定的串是否被DFA M所识别或接受 两种途径 基于转换表 基于转换图,基于转换表的DFA实现,主要思想 输入 : 一个字符串,以#结尾. 输出: 如果接受则输出true 否则输出 false 数据结构: 转换表 (二维数组 T) 两个变量 State: 记录当
11、前状态; CurrentChar: 记录串中当前正在被读的字符;,基于转换表的DFA实现,算法主要思想 1. State = InitState; 2. Read(CurrentChar); 3. while T(State, CurrentChar) error otherwise, return false.,S0 (c) S2 (a) S3 (b) S0 (a) S1 (b) S1 (d) S2 (a) S3 (c) S3 (c) S3,1) cab 接受 or 拒绝?,2)abdacc 接受 or 拒绝?,拒绝,接受,基于转换图的DFA实现,每个状态对应一个带标号的case 语句 每条
12、边对应一个 goto 语句 对于每个终止状态,增加一个分支,如果当前字符是字符串的结束符#,则接受;,i,Li: case CurrentChar ofa :goto Ljb : goto Lkother : Error( ),基于转换图的DFA实现,每个状态对应一个带标号的case 语句 每条边对应一个 goto 语句 对于每个终止状态,增加一个分支,如果当前字符是字符串的结束符#,则接受;,Li: case CurrentChar ofa :goto Ljb : goto Lk# : return true;other : return false;,LS0: Read(CurrentCh
13、ar); switch (CurrentChar) case a: goto LS1;case c: goto LS2:case d: goto LS3; other: return false; ,LS1: Read(CurrentChar); switch (CurrentChar) case b: goto LS1;case d: goto LS2:other: return false; ,LS2: Read(CurrentChar); switch (CurrentChar) case a: goto LS3;other: return false; ,LS3: Read(Curre
14、ntChar); switch (CurrentChar) case c: goto LS3:case #: return true;other: return false; ,两种实现方式的比较,转换表方式: 是通用的算法,不同的语言,只需改变输入的转换表,识别程序不需改变;转换图方式: 不需要存储转换表(通常转换表是很大的),但当语言改变即自动机的结构改变时,整个识别程序都需要改变。,小结,确定有限自动机 确定有限自动机定义的语言 确定有限自动机的实现,作 业,构造一个DFA,使它能够识别出所有能被3整除的二进制数。 分别用转换表方式和转换图方式编程实现上述自动机,并用实例验证上述自动机是否正确。,