西安电子科技大学编译原理 (1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NFA识别记号的最大特点是它的不确定性,即在当前状态下对同一 字符有多于一个的下一状态转移。 定义:move函数是1对多的; move = { move(0, a) = {0,1}, move(0, b) = 0,...} 状态转换图:同一状态有多于一条边标记相同字符转移到不同 a 的状态;
digit1=[1-9]
num=digit1(digit)*(ε |.digit*digit1)
3
2.3 记号的识别-有限自动机
正规式(模式的描述)
有限状态自动机(识别记号)
id = letter(letter|num)*
69fed? F987y?
正规式:(((letter|digit)*num)*|digit*}num)*
S = {0, 1, 2, 3} Σ = {a, b} move = { move(0, a) = {0, 1}, move(0, b) = 0, move(1, b) = 2, move(2, b) = 3 } s0 = 0 F = {3}
a {0,1} b {0} {2} {3} -
0 1 2 3
辅助定义
letter=[a-z,A-Z] digit=[0-9]

id = letter(letter|digit)* literal=“(letter|digit)*”

integer=digit digit*
num=integer(ε| . integer)
wenku.baidu.com
0000.0000 ? 0000.0000?
id = char(char|digit)*
0
digit 7 char 8
return(gettoken(), install_id()) char
= >
6 return(rel, GE) return(rel, GT)
12
2.3 记号的识别-有限自动机
num = digit+ ( . digit+ )? ( E (+ | -)? digit+ )?
a {0,1} b {0} {2} {3} -
0 1 2 3
a a
0 1
b
2
b
3
b
转换图:0a1b2b3,最直观!
11
2.3 记号的识别-有限自动机
[例2.8] 识别表2.1中记号relation、id和num的转换图。 relation = < | <= | <> | > | >= | =
< return(rel, LT) = 1 2 return(rel, LE) > 3 4 5 return(rel, NE) return(rel, EQ) =
关键字(kw) 标识符 (id) 字面量 (literal, num) 特殊符号 (ks)

kw = {if, while, do, … } 根据特定程序设计语言的要求定义 ks = {+, -, …} 根据特定程序设计语言的要求定义 id=? literal = ? num=?
2
正规式的应用
a a
0 1
b
2
b
3
b
0
a
0
b
0
b
0
a 0 非终态,不接受, 试探下一路径 a
0 0
0 0 1
b b b
0 0 2
a a a
0 1
b b
0 2
非终态,不接受, 试探下一路径 再试探下一路径
0
a
1
b
2
b
3
终态,接受
a
? 不接受,已无路径
15
2.3 记号的识别-有限自动机
NFA识别记号存在的问题 只有尝试了全部可能的路径,才能确定一个输入序列不被接 受,而这些路径的条数随着路径长度的增长成指数增长。 识别过程中需要进行大量回溯,时间复杂度升高且算法趋于 复杂。 问题:是否可以构造这样的有限自动机,它识别正规式所描述的字 符串,且在任何一个状态下遇到同一字符最多有一个状态转移?
NFA
17
2.3 记号的识别-有限自动机
DFA可以看做是NFA的一个特例,其中: (1)没有状态具有 ε 状态转移(ε-transition),即 状态转 换图中没有标记 ε 的边; (2)对每个状态 s 和每个字符 a ,最多有一个下一 状态。{sj} 与NFA相比,DFA的特征是其确定性 定义:move(si, a)=sj; 转换图: 从一个节点出发的边上标记均不相同; 转换矩阵:M [ si , a ] 是一个状态。 且字母表不包括 ε 。
5
2.3 记号的识别-有限自动机
NFA的两种直观的表示方式 ① 状态转换图
a 开始
s0
a
s1
b
s2
b NFA中的每个状态,对应转换图中的一个节点; NFA中的每个move(si, a)=S’,对应转换图中的若干 条有向边(|S’|);表示从节点si出发进入节点sj , 字符a是边上的标记。
6
2.3 记号的识别-有限自动机
20
2.3 记号的识别-有限自动机
a a b 0 b a a 3 2 b 1 b
(a|b)*abb的DFA
识别abb: 1. s = 0, ch = a 2. s = 1, ch = b 3. s = 2, ch = b 4. s = 3, ch = eof 5. yes
识别abab: 1. s = 0, ch = a 2. s = 1, ch = b 3. s = 2, ch = a 4. s = 1, ch = b 5. s = 2, ch = eof 6. no
NFA的两种直观的表示方式 ② 状态转换矩阵
输 入 符 号 a b s0 s1 s2 {s0, s1} {s0} {s2}
每个矩阵元素M[si,a]中的内容,是从状态si出发,经字符a(或ε)所到 达的下一状态sj; 在转换矩阵中,一般以矩阵第一行所对应的状态为初态,而终态需 要特别指出。
a a
0 1
b
2
b
3
b
转换矩阵:m[0, a]={0, 1}, m[1, b]=2, m[2, b]=3
10
2.3 记号的识别-有限自动机
NFA如何识别记号? 对字符串,从初态开始,是否可以经过一系列状态转移到达终态? 例如:字符串abb是否可以被上页的NFA所识别
S = {0, 1, 2, 3} Σ = {a, b} move = { move(0, a) = {0, 1}, move(0, b) = 0, move(1, b) = 2, move(2, b) = 3 } s0 = 0 F = {3}
0 1 2 3
8
b
2.3 记号的识别-有限自动机
NFA如何识别记号? 对字符串,从初态开始,是否可以经过一系列状态转 移到达终态? 例如:字符串abb是否可以被上页的NFA所识别
S = {0, 1, 2, 3} Σ = {a, b} move = { move(0, a) = {0, 1}, move(0, b) = 0, move(1, b) = 2, move(2, b) = 3 } s0 = 0 F = {3}
正规集 描述 正规式 识别 有限自动机
22
自动机及正规式方面的结论
表达能力:正规式=非确定有限自动机=确定有限自
动机
正规式
0 1 2 3 a {0,1} b {0} {2} {3} a a
0 1
b
2
b
3
b
五元组:move(0, a)=1, move(1, b)=2, move(2, b)=3
9
2.3 记号的识别-有限自动机
NFA如何识别记号? 对字符串,从初态开始,是否可以经过一系列状态转移到达终态? 例如:字符串abb是否可以被上页的NFA所识别
9 digit digit 10 return(num,install_num())
.
11 E +,digit
digit 12 return(num,install_num()) E 13 digit digit return(num,install_num())
13
14 digit 15
2.3 记号的识别-有限自动机
21
2.3 记号的识别-有限自动机
有限自动机的等价
定义: 若有限自动机M和M’识别同一正规集,则称M和M’是等 价的,记为M=M’。 定义:自动机M能够识别的语言称为M的语言,记作:L(M) 回忆:正规式的语言即正规集 定义:如果有限自动机M和正规式E的语言相同(L(M)=L(E)), 称:自动机M和E等价 提示:正规式与有限自动机从两个侧面表示正规集。正规式是描 述,自动机是识别。
4
2.3 记号的识别-有限自动机
不确定的有限自动机
(Nondeterministic Finite Automaton, NFA) 定义2.4 NFA是一个五元组(5-tuple): M =(S,∑,move,s0,F),其中 (1) S是有限个状态的集合; (2) ∑是有限个输入字符(包括ε)的集合; (3) move是一个状态转移函数,move(si,a)=S’表 示,当前状态si下若遇到输入字符a,则转移到S’中 的状态,其中S’S; (4) s0是的唯一的初态(也称开始状态); (5) F是终态集(也称接受状态集),它是S的子 集,包含了所有的终态。 返回
7
2.3 记号的识别-有限自动机
[例2.7] 识别正规式(a|b)*abb所描述正规集的NFA的三种表示形式分 别如下。 S = {0, 1, 2, 3}, Σ = {a, b} move = { move(0, a) = {0, 1}, move(0, b) = 0, move(1, b) = 2, move(2, b) = 3 } a b s0 = 0, 0 {0,1} {0} F = {3} 1 {2} 2 {3} 3 a a b b
16
2.3 记号的识别-有限自动机
确定的有限自动机
(Deterministic Finite Automaton, DFA) 定义2.4 DFA是一个五元组(5-tuple): M =(S,∑,move,s0,F),其中 (1) S是有限个状态的集合; (2) ∑是有限个输入字符(不包括ε)的集合; (3) move是一个状态转移函数,move(si,a)=sj’表 示,当前状态si下若遇到输入字符a,则转移到状态sj; (4) s0是的唯一的初态(也称开始状态); (5) F是终态集(也称接受状态集),它是S的子 集,包含了所有的终态。
a
0 1
b
2
b
3

状态转换矩阵:M[si,a]是一个状态的集合
0 1 2 3 a {0,1} b {0} {2} {3} -
b
14
2.3 记号的识别-有限自动机
NFA识别输入序列的一般方法:反复试探所有路径,直到到达终态, 或者到达不了终态。 不确定性带来的问题:识别输入序列时,在当前状态下遇到同一字 符,应转移到哪个下一状态? [例2.9] 在正规式 (a|b)*abb的NFA上识别输入序列abb和abab。
b 0 2 3 0
识别abb:0a1b2b3,状态,接受 识别abab:0a1b2a1b2,?
从这个例子看DFA的优点在 什么地方? 相对于NFA,有什么缺点?
19
2.3 记号的识别-有限自动机
DFA识别输入序列的算法被称为DFA模拟器或驱动器。 算法2.1 模拟DFA 输入 DFA D和输入字符串x (eof)。D的初态为s0,终态集为F 输出 若 D 接受 x,回答“yes”,否则回答“no”。 方法 用下述过程识别x: s := s0; ch := nextchar; -- 初值 while (ch≠eof) -- x结束? loop s := move(s, ch); ch := nextchar;-- 循环转移 end loop; if s is in F -- 终态返回 then return “yes”; else return “no”; end if;
上次课内容回顾
词法分析 程序由单词构成
源程序 词法分析 语法分析 符 号 表 管 理 语义分析 中间代码生成 代码优化 目标代码生成 目标代码
1
(分类:4类) 怎么判断单词属于 哪一类?模式 模式的形式化表达: 正规式与正规集 正规式简化表示、 辅助定义
出 错 处 理
正规式的应用
单词(组成程序的要素)
18
2.3 记号的识别-有限自动机
DFA对NFA施加的两条限制: 限制1:没有ε状态转移 限制2:同一状态经过同一字符最多有一个状态转移 [例2.10] 正规式(a|b)*abb的DFA,识别输入序列abb和abab:
a a b 0 b a a 3 2 b 1 b
0 1 2 3
a 1 1 1 1
相关文档
最新文档