编译原理二词法分析-.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理二词法分析-

2.3.2 NFA的定义 NFA的必要 识别程序设计语言中所有记号的DFA遇到的问题 典型的程序设计语言中都有许多记号,每一个记号都能被其自己的DFA识别出来 理论上应该能将所有的记号都合并为一个巨大的DFA。 这不是一个DFA。如果不使用系统化的方法将所有的记号都合并为一个巨大的DFA,将非常复杂。 解决这个问题的方法 将DFA扩展到NFA (对于当前的输入,当前的状态将转换为多个状态) NFA 转换为 DFA的算法 不确定的有穷自动机(NFA) NFA M=(S,Σ,T,S0,A), 其中 S 是状态的集合 ∑是字母表 T是转换函数: S X (∑∪{ε})- S的子集 S0∈S 初始状态 A ? S 接受状态集合 NFA 类似于 DFA,除了 扩展 ∑ 包括 ε NFA 可以包含 ε-转换—无需考虑输入串就有可能发生的转换 例 NFA M=({S,P,Z},{0,1},f,S,{Z}) 其中 f(S,0)={P} f(S,1)={S,Z} f(Z,0)={P} f(Z,1)={P} f(P,1)={Z} L(M): 由自动机 M 所接受(识别)的语言 L(M) :is the set of strings of character字符c1c2…cn ,每一个ci 都属于 ∑∪{ε}, 且存在关系:s1 在T(S0,c1)中,s2在T(S1,c2)中,…,Sn 在T(Sn-1,cn) 中, s0 是初始状态, Sn 是A的元素 c1c2…cn 中的任一 ci 都可能是ε 真正被接受的串是删除了ε的串 c1c2…cn 非确定性 接受特定串的转换序列并不由状态和下一个输入字符在每一步确定下来 例如 2.3.3 用代码实现有穷自动机 从正则表达式到DFA(2.4节) 有穷自动机构造词法分析程序 1 用代码实现 DFA 用代码实现DFA的一般算法 用一个变量保持当前的状态 将转换写成一个双层嵌套的case语句而不是一个循环 第一个case语句测试当前的状态 嵌套着的第2层测试输入字符及所给的状态 state:=1;{start} while state=1 or 2 do case state of 1:case input character of letter:advance the input; state:=2; else state:=…{error or other}; end case 2 用代码实现DFA的状态转换表 使用转换表,可以用代码实现任一DFA 代码图解中用到的变量 转换被保存在一个转换数组 “T”中,T由状态和输入字符索引; 先行输入的转换是由布尔数组 “Advance”给出, 它们也由状态和输入字符索引; 由布尔数组 “Accept”给出的接受状态由状态索引 代码图解 state:=1; ch:=next input character; while not Accept[state] and not error(state) do newstate:=T[state,ch]; if Advance[state,ch] then ch:=next input char; state:=newstate; end while; if Accept[state] then accept; 表驱动的优点 代码的长度缩短了 相同的代码可以解决许多不同的问题 代码较易改变(维护) 缺点 表格会变得非常大,使得程序要求使用的空间也变得非常大 3 代码的动作 进行转换时发生的典型动作是:将字符从输入串中移到属于单个记号累积字符的字符串中 在达到某个接受状态时的典型动作是:将刚被识别的记号及相关属性返回 遇到出错状态的典型动作是:在输入中备份(回溯)或生成错误记号 2.4 从正则表达式到 DFAs 正则表达式与 DFA的等价性 从正则表达式到DFA 从正则表达式到 NFA(2.4.1) 从 NFA 到 DFA(2.4.2) DFA的最小化(2.4.3) 2.4.1 从正则表达式到 NFA “语法制导”法: 按正则表达式的语法结构指引构造过程 正则表达式构造NFA的基本语法结构的构造规则 复合正则表达式e的构造规则 2.4.2 从 NFA 到 DFA 1 转换需解决的问题 删除ε-转换(ε合并) 如果 ,则删除S2 状态合并(消除在单个字符上的多重转换) 2 转换方法——子集法 让DFA 的每个状态对应NFA 的一个状态集合。 即DFA用它的一个状态记录在NFA读入一个输入符号后可能达到的所有状态。 3 对状态集合I的有关运算 状态集合 I 的ε闭包ε_cl

文档评论(0)

woaitiantian + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档