1 / 30

有限自动机 (Finite Automata)

有限自动机 (Finite Automata). 描述程序设计语言中的单词的识别过程。 主要内容: 确定有限自动机 DFA(Deterninistic FA) 确定有限自动机 DFA 的实现 非确定有限自动机 NFA(Nondeterninistic FA) NFA 到 DFA 的转换 DFA 的化简. 确定有限自动机 DFA. 确定有限自动机 DFA 为一个五元组 ( , SS,S 0 , f ,TS), 其中: 是一个有穷字母表,它的每个元素称为一个输入字符; SS 是一个有穷集,它的每个元素称为一个状态; S 0  SS 是唯一的一个初始状态;

starbuck
Télécharger la présentation

有限自动机 (Finite Automata)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

  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. a a a,b b a S U V Q b b 状态转换图

  6. 状态转换表

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

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

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

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

  14. NFA到DFA的转换 • 符号合并:A:NFA, A’:DFA 1.令A’的初始状态为S0’=[S1,S2,…Sk], 其中S1…Sk是A的全部初始状态。 2.若S’=[S1,…,Sm]是A’的一个状态, a则定义 f’(S’,a)=f(S1,a)f(S2,a)…f(Sm,a) 3.若S’=[S1,…,Sn]是A’的一个状态,且存 在一个Si是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. a 2 3     a b b 0 10 1 6 7 9 8   b 4 5  例:将如下的NFA转化为DFA

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

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

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

  21. a b a b 1 2 3 1 3 a a | b 1 2 1 2 b b b*   1 3 2 3 1 正则表达式到FA的转换规则:  W • 首先扩展转换图: X

  22. a b a b 1 2 3 1 3 a a | b 1 2 1 2 b b a b*c c a 1 3 2 3 1 DFA到正则表达式的转换规则:

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

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

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

  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 <stdio.h> 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题 附加题: • 分别构造{}和的自动机

More Related