Presentation is loading. Please wait.

Presentation is loading. Please wait.

有限自动机 (Finite Automata) 描述程序设计语言中的单词的识别过程。 主要内容: 确定有限自动机 DFA(Deterninistic FA) 确定有限自动机 DFA 的实现 非确定有限自动机 NFA(Nondeterninistic FA) NFA 到 DFA 的转换 DFA 的化简.

Similar presentations


Presentation on theme: "有限自动机 (Finite Automata) 描述程序设计语言中的单词的识别过程。 主要内容: 确定有限自动机 DFA(Deterninistic FA) 确定有限自动机 DFA 的实现 非确定有限自动机 NFA(Nondeterninistic FA) NFA 到 DFA 的转换 DFA 的化简."— Presentation transcript:

1 有限自动机 (Finite Automata) 描述程序设计语言中的单词的识别过程。 主要内容: 确定有限自动机 DFA(Deterninistic FA) 确定有限自动机 DFA 的实现 非确定有限自动机 NFA(Nondeterninistic FA) NFA 到 DFA 的转换 DFA 的化简

2 确定有限自动机 DFA 确定有限自动机 DFA 为一个五元组 ( ,SS,S 0,f,TS) ,其中:  是一个有穷字母表,它的每个元素称为一个 输入字符; SS 是一个有穷集,它的每个元素称为一个状态; S 0  SS 是唯一的一个初始状态; f 是在 SS   SS 上的转换函数 TS  SS ,是一个终止状态集,又称为接受状态 集

3 DFA 的两种表示方式 状态转换图: 结点表示状态,转换边表示转换函数,边 的箭头方向指向转换函数中定义的转换方 向。标识出初始状态和终止状态。 状态转换表: 可用二维数组描述。标识出初始状态和终 止状态。 Trans ( S I , a )= S J

4 一个 DFA 的例子 DFA M=( {a,b}, {S,U,V,Q}, S, f, {Q} ), 其中 f 定义为: f ( S, a )=U f ( V, a )=U f ( S, b )=V f ( V, b )=Q f ( U, a )=Q f ( Q, a )=Q f ( U, b )=V f ( Q, b )=Q

5 S U V Q a b b a b a a,b 状态转换图

6 字符 状态 ab SUV UQV VUQ QQQ 状态转换表

7 DFA 接受的字符串 对于  * 中的任何字符串 t, 若存在一条从初始 结点到某一终止结点的路径,且这条路上所 有弧的标记符连接成的字符串等于 t, 则称 t 可 为 DFA M 所接受(识别)。 DFA M 所能接受的字符串的全体记为 L(M).

8 DFA 的确定性 初始状态唯一。 转换函数 f:SS  SS 是一个单值函数,也就 是说,对任何状态 S  SS, 和输入符号 a  , f(S,a) 唯一地确定了下一个状态。即转换函数 至多确定一个状态。 没有空边。即没有输入为  ( )

9 DFA 的实现 1 状态转换表的形式:(数组 T 存放转换函数) 1. 当前状态 State 置为初始状态 2. 读一个字符  CurrentChar 3. 如果 CurrentChar  Eof 并且 T(State,CurrentChar)  error 则当前状态转为新的状态 T(State,Current) , 读下一字符。重复第 3 步工作。 4. 如果当前字符为 Eof 并且当前状态属于终止状态, 则接受当前字符串,程序结束。否则报错 特点: 程序短小,但占用存储空间多

10 b DFA 的实现 2 状态转换图的形式: 每个状态对应一个带标号的 case 语句 转向边对应 goto 语句 特点: 程序长,但占用存储空间少 i j k a Li: case CurrentChar of a : goto Lj b : goto Lk other : Error( )

11 非确定有限自动机 NFA 定义 1 :一个非确定有限自动机 (NFA)A 是 一个五元组 A=( ,SS,S 0,f,TS). 其中  是字母表 SS 是状态集 S 0 是初始状态集 f 是转换函数,但不要求是单值的 f: SS  (  ∪ { })  2 SS TS 是终止状态集

12 非确定有限自动机 NFA 定义 2 :设 A 是一个 NFA , A= ( ,SS,S 0,f,TS) 则定义 L(A) 为从任意初始状态到任意终止状 态所接受的字符串。 L(A)={  |s 0   s ’, s 0  S 0 s ’  TS } 定义 3 :设 A 1 和 A 2 是同一个字母表上的自动机, 如果有 L(A 1 )=L(A 2 ), 则称 A 1 和 A 2 等价。

13 NFA 到 DFA 的转换 定理 对于每一个非确定自动机 A, 存在一个确 定自动机 A ’, 使得 L(A)=L(A ’ ). 转换: 符号合并 同一状态的不同输出边标有相同的字符。 合并 含有 边

14 NFA 到 DFA 的转换 符号合并: A : NFA, A ’ :DFA 1. 令 A ’ 的初始状态为 S 0 ’ =[S 1,S 2, … S k ], 其中 S 1 … S k 是 A 的全部初始状态。 2. 若 S ’ =[S 1, …,S m ] 是 A ’ 的一个状态, a  则定义 f ’ (S ’,a)=f(S 1,a)  f(S 2,a) …  f(S m,a) 3. 若 S ’ =[S 1, …,S n ] 是 A ’ 的一个状态, 且存 在一个 S i 是 A 的终止状态,则令 S ’ 为 A ’ 的终止状态。

15 NFA 到 DFA 的转换 合并 ( Close(S) ) 1. 对 S 状态寻找 边,如果有令 Ss = {S} 2. 对任意状态 Si  Ss, 如果有: f(Si, )= Sj 则 消除 边: Ss= Ss  Sj 重复上述操作直至没有 边 3. 对 a  f(Ss,a)=  f(Sk,a) Ss={S1, …,Sm},k=1, …,m. 4. 如果 Ss 中包含初始状态则 Ss 也为初始状 态,如果有终止状态,则 Ss 为终止状态。

16 NFA 到 DFA 的转换 NFA 到 DFA 的转换过程 : 1. NFA 初始状态集的 合并集作为 DFA 的初始 状 态。 2. 对 DFA 中一状态 S ,对 a , 进行符号合并和 合并得到的状态设为 S ’, 定义 DFA 的转换 函数为 f(S,a)=S ’. 3. 直至没有新状态产生为止。

17 例:将如下的 NFA 转化为 DFA bb b a a 0 1 2 4 3 5 67 8 9 10

18 DFA 的化简(极小化) 状态等价 对 DFA 中的两个状态 S 1 和 S 2 , 如果将它们看作是初始状态,所接受 的符号串相同,则定义 S 1 和 S 2 是等价的。 方法 状态合并法 状态分离法

19 DFA 的化简 状态合并法(状态吸收方法) 寻找等价状态 S 1 和 S 2 如果 S 2 为初始状态,则 S 1 和 S 2 对调 S 2 的出现修改为 S 1 删除状态 S 2 。 状态分离法 初始化为两个不等价状态集组:非终止状态 组和终止状态组。 对每组中的某个状态分离出与之不等价的状 态组,直至所有状态组内部状态都等价为止

20 正则表达式与有限自动机等价 定理:对任一确定有限自动机 A ,存在一正 则表达式 e, 使得 L(A)=L(e), 反之亦然。 关系图: DFA 正则表达式 NFA

21 正则表达式到 FA 的转换规则: 13 a b 12 a | b 13 b * 123 ab 12 a b 1 23 b 首先扩展转换图: X W 

22 123 ab 12 a b 1 23 13 a b 12 a | b 13 a b * c a b c DFA 到正则表达式的转换规则:

23 词法分析器的工作过程 词法分析器( Scanner ) 输入流 词法描述(正则表达式) NFA DFA TokenList error

24 词法分析器的设计 人工构造词法分析器过程: 1. 确定词法分析器的接口,即确定词法分析 器是作为语法分析的一个子程序还是作为 独立一遍。 2. 确定单词分类和 Token 结构。 3. 根据 2 步,构造每一类单词的描述 正则表达式  NFA  DFA 。 4. 根据 3 步设计算法实现 DFA 。 利用工具自动生成: ScanGen Lex

25 词法分析器的生成器- Lex 功能: 依据语言的正则表达式,自动生成该语言的 词法分析程序。 执行过程: 正则 表达式 文件 Lex.l Lex 词法 分析器 lexyy.c C 编译器 a.out 输入流 Token 序列

26 Lex 中的元字符 [abc] :字符 a 、 b 或 c 中的任一个。 a? : 一个可选的 a 。 [^ab] :除了 a 、 b 外的任何一个字符。. :除了新行之外的任一字符。 \. :字符 “.” 。 {xxx} :名字为 xxx 的正则表达式。 [a-z] : a 到 z 中的任一字符。 为了与减号区别,减号表示为 “\-” 。

27 Lex 输入文件的格式 输入文件格式: {declarations} % {rules} % {auxiliary procedures} %{ 声明变量, 常量 %} 正则定义 p {action}

28 例子 %{ LT, LE, IF, THEN, ELSE #include int count =0; %} letter [A-Za-z] digit [0-9] id {letter} ({letter}| {digit})* % if {return (IF);} {id} {yylval = installid();return (ID);} “ < ” {yylval = LT; return (RELOP);} % installid() { …… }

29 单元总结 两个工具: 有限自动机、正则表达式 三个算法: 正则表达式到 FA 的转换 NFA 到 DFA 的转换 DFA 的化简 一个实现: DFA 的实现

30 作业:  构造正则表达式 (a|b)*abb(a|b)* 的最简 DFA 。要求先构造 NFA ,其次转换为 DFA , 最 后加以极小化。  书上 Pp58 第 8 题 附加题:  分别构造 { } 和  的自动机


Download ppt "有限自动机 (Finite Automata) 描述程序设计语言中的单词的识别过程。 主要内容: 确定有限自动机 DFA(Deterninistic FA) 确定有限自动机 DFA 的实现 非确定有限自动机 NFA(Nondeterninistic FA) NFA 到 DFA 的转换 DFA 的化简."

Similar presentations


Ads by Google