第三章 词法分析(3)
- 格式:pps
- 大小:1.38 MB
- 文档页数:109
第3章词法分析3.5 有穷自动机❑有穷自动机是一个更一般化的状态转换图,是一个语言的识别器(recognizer),对输入的串说“yes”or “no”❑确定的和不确定❑识别的语言恰好是正规表达式所能描述的语言❑介绍三类有穷自动机▪NFA▪ -NFA▪DFA3.5.1 不确定的有穷自动机❑不确定的有穷自动机(Non-Deterministic Finite Automata,简称NFA)是一个五元组M=(∑,S,δ,s0,F),其中:▪输入符号集合∑;▪状态集合S;▪转移函数δ:S⨯(∑⋃{ε})→P(S);•可以用转换图或转移表表示▪状态s0是开始状态,s∈S;▪F⊆S,接受状态(终止状态)集合。
S = { 0, 1, 2, 3 }s 0= 0F = { 3 }= { a, b }例3.14 识别语言(a|b)*abb 的NFA 转换图(Transition Diagrams )1starta0abb3b2输入符号ab 0{0, 1}{0}1∅{2}2∅{3}状态识别语言(a|b)*abb 的NFA 转换表(Transition Tables )1starta0abb3b2例,Input: ababb接受输入字符串ababb 的状态转移序列1starta0abb3b2?210000*********−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−ab abb aba bb a b a ACCEPT !Input: aabb练习3.5.3 找出所有标记为aabb 的路径1starta0εa,ba3b2000003221011100−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−bb a abb a a bbaa a,ba,bInput: aabb练习3.5.3 找出所有标记为aabb 的路径1startaa,ba3b2a,b a,b010120120123Input: aabb练习3.5.4 找出所有标记为aabb 的路径321030321010−→−−→−−→−−→−−→−−→−−→−−→−−→−−→−bb a a bb a aεε1starta 0εb 3b2aεεε定义❑一个NFA接受输入字符串x,当且仅当存在从初始状态到某个接受状态的路径,使得该路径的边上的标记恰好连成字符串x❑一个NFA接受(或定义)的语言是它接受的全体输入字符串的集合。
❑一个NFA接受(或定义)的语言是从初始状态到某个接受状态的所有路径上的标记串的集合。
例3.17识别aa *|bb *的NFA12startaabb34εε例,Input: aaa22210−→−−→−−→−−→−aaaε3.5.4 确定的有穷自动机❑确定的有穷自动机(Deterministic Finite Automata,, F),其中:简称DFA)是一个五元组M = (∑, S, δ, s▪输入字母表∑;▪状态集合S;▪转换函数δ: S⨯∑→S;▪初态s∈S;▪终态集合F⊆S;DFA是NFA的特例:1. 没有输入 上的转换;2. 对每个状态s和输入符号a,有且只有1条标记为a的边离开s。
Fig 3-24 模拟DFA的算法s←s0c ←nextchar;while c ≠eof dos ←move(s,c);c←nextcharend;if s is in F then return“yes”else return“no”例3.19 识别语言(a |b )*abb的DFAstart3b21b ababa a(How to get it?)例,Input: ababb321210−→−−→−−→−−→−−→−bb a b a构造DFA的一些例子Construct a DFA that accepts a language L over = {0,1} s.t.1.L is the set of all strings with three consecutive 0’s2.L is the set of all strings without three consecutive 0’sDFA -examples(a)Q ={q 0, q 1, q 2, q 3} ={0,1}F = {q 3}q 0q 1q 2q 30,1111startDFA -examples(b)Q ={q 0, q 1, q 2, q 3} ={0,1}F = {q 0, q 1, q 2}q 0q 1q 2q 30,1111start识别包含子串011的由0和1组成的符号串的NFA (0|1)*011 (0|1)*q 0q 1q 2q 311start11包含子串011的由0和1组成的符号串全体DFAq 0q 1q 2q 3110,11start不包含子串011的由0和1组成的符号串全体q 0q 1q 2q 3110,11start01*0*| 1*00*1(00*1)*或1*(0|01)*不包含子序列011的由0和1组成的符号串全体q 0q 1q 2q 3110,11start01*| 1*00* |1*00*10*或1*0*10* |构造一个DFA ,它接受的语言为{x | x {0,1}*,且当x 看成二进制数时,x 模3与同余0}。
q 210q 101q 01接受0和1的个数都是偶数的字符串的DFA31201111start 偶0偶1奇0奇1奇0偶1偶0奇13.6 从正则表达式到有限自动机3.6.1 从NFA到DFA的变换❑不确定的原因:多值转换函数▪对某个输入有多个转换▪ -转移NFA DFA子集构造法(Subset Construction)❑DFA的一个状态是NFA的一个状态集合❑读了输入a1a2…an后,NFA能到达的所有状态:s1,s2, …,s k,则DFA到达状态{s1,s2, …,s k}No input isconsumed NFA状态上的操作操作描述ε-Closure(s)s∈S,从状态s只经过ε-转换就可以到达的NFA状态集ε-Closure(T) T⊆S,从状态集T中的状态s只经过ε-转换就可以到达的NFA状态集move(T,a)从状态集T中的状态s只经过输入符号a-转换就可以到达的NFA状态集子集构造法❑DFA的初始状态ε-closur e(s),s0是NFA的初态❑其余状态由ε-closure(move(T,a))生成,其中T是由NFA的状态构成的状态集(也就是DFA的状态)▪∀t∈T, 计算ε-closure(move(t,a))19开始εab εab6782345εεεεε输入符号a b状态例3.2119开始εab εab6782345εεεεε输入符号a bA状态A = {0, 1, 2, 4, 7}计算ε-closure(0)19开始εab εab6782345εεεεε输入符号a bAB状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}计算ε-closure(move(A,a))ε-closure (move ({0,1,2,4,7},a))=ε-closure ({3,8})={1, 2, 3, 4, 6, 7, 8}19开始εab εab6782345εεεεε输入符号a bA BB状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}19开始εab εab6782345εεεεε输入符号a b A BCB状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}19开始εab εab6782345εεεεε输入符号a b A BCB C状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}19开始εab εab6782345εεεεε输入符号a b A B CB BC状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}19开始εab εab6782345εεεεε输入符号a b A B C B BDC状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}D = {1, 2, 4, 5, 6, 7, 9}19开始εab εab6782345εεεεε输入符号a b A B C B BDC D状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}D = {1, 2, 4, 5, 6, 7, 9}19开始εab εab6782345εεεεε输入符号a b A B C B B D C BCD状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}D = {1, 2, 4, 5, 6, 7, 9}19开始εab εab6782345εεεεε输入符号a b A B C B B D C B C DBC状态A = {0, 1, 2, 4, 7}B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}D = {1, 2, 4, 5, 6, 7, 9}B DstartaAab ba b C b a 19startεab εab6782345εεεεε输入符号a b A B C B B D C B C DBC状态Fig3-29 Algorithm For Subset Constructioninitially, ε-closure(s0)is only (unmarked) state in Dstates; while there is unmarked state T in Dstates do begin mark T;for each input symbol a do beginU:= ε-closure(move(T,a));if U is not in Dstates thenadd U as an unmarked state to Dstates;Dtran[T,a] := UendFig 3-30 Computation of ε-closurepush all states in T onto stack;initialize ε-closure(T) to T;while stack is not empty do beginpop the top element t off the stack;for each state u with edge from t to u labeled εdo if u is not in ε-closure(T)do beginadd u to ε-closure(T) ;push u onto stackend如果DFA的某个状态至少包含NFA的一个接受状态,那么,这个状态是DFA的一个接受状态。