2第二章 词法分析3.pdfVIP

  • 6
  • 0
  • 约6.87千字
  • 约 36页
  • 2018-10-19 发布于山东
  • 举报
主要内容 扫描处理 正则表达式 有穷自动机 从正则表达式到DFA TINY扫描程序的实现 利用Lex 自动生成扫描程序 • 正则表达式←→DFA • 因正则表达式简洁,扫描程序的生成通常从正则 表达式开始。 • 正则表达式→DFA方法 1.直译:困难、复杂、无统一规律 2.引入中间构造NFA:简单、有规律 (1)正则表达式→NFA (2 )NFA→DFA。 • 扫描程序的自动过程 (加上NFA→程序)如下图 • 2.4.1 正则表达式→NFA • Thompson结构 (Thompson construction )利 用-转换将正则表达式的机器片段“粘在一起”以构 成与整个表达式相对应的机器。 • 该结构是归纳的,按照正则表达式定义,步骤为 1.为每个基本正则表达式生成一个NFA 2.利用正则表达式运算符号将已构造好的子表达式 的NFA连接起来 • 1) 基本正则表达式 • 与正则表达式a (字母表中单个字符的匹配)等同 的NFA (即在其语言中准确接受)的是: • 与 (空串的匹配)等同的NFA是: • 2) 并置 • 正则表达式r 的NFA图: • 注意:圆角矩形的左边圆圈表示初始状态,右边的双圆 表示接受状态,中间的3个点表示NFA中未显示出的状态 和转换。该图假设与r 相应的NFA中只有一个接受状态。 • 正则表达式rs等同的NFA图: • 通过一个-转换将r 机的接受状态与s 机的接受状态连接 在一起。新机器将r 机的初始状态作为它的初始状态, 并将s 机的接受状态作为它的接受状态。 • 3) 在各选项中选择 r|s对应的NFA图: 这里,添加了一个新的初始状态和一个新的接 受状态,并利用-转换将它们连接在一起。 • 4) 重复 r*对应的NFA图: 这里添加了两个新的状态:一个初始状态和一个接 受状态。 该机中的重复由从r 机的接受状态到它的初始状态 的新的-转换提供,允许r 机来回多次移动。 为保证也能接受空串(即r的重复为零),就必须 画出一个由新初始状态到新接受状态的-转换。 • 注意: Thompson 结构的描述构造并不唯一。 特别是当将正则表达式运算翻译成NFA时,也 可能有另一个结构。 • 例如,并置rs 时,就可以省略在r 机和s机之间 的-转换,将r 机的接受状态等同于s 机的初始 状态,如下: • 构造NFA遵循的原则非常简单: 1.每个状态最多具有两个转换,而且如果有两个 转换,就必须都是-转换。 2.在构造时不能删除状态,而且除了来自接受状 态增加的转换之外,其他转换也不可更改。 • 例2.12 根据Thompson结构将正则表达式 翻译为NFA。 首先为正则表达式a和b分别构造机器: 接着再为并置ab 构造机器: • ab|a的NFA: • 例2.13 利用Thompson 结构完成正则表达式 letter(letter|digit) *的NFA。 首先分别为正则表达式letter 和digit 构建机器: 接着再为选择letter|digit 构造机器: • 现在为重复(letter|digit) *构造NFA,如下所示: • 最后,将letter和(letter|digit) *并置在一起,并构造 该并置的机器以得到完整的NFA: • 例子:正则表达式(a|c)*b按Thompson结构构 造所得NFA如图: • 2.4.2 从NFA到DFA NFA与DFA的区别-转换和多重转换。 (1)消除-转换 -闭包(-closure)是可由-转换从某状态或 某些状态达到的所有状态集合。 (2 )消除在单个输入字符上的多重转换涉及 跟踪可由匹配单个字符而达到的状态的集合。 这两个过程都要求考虑状态的集合而不是单个 状态,所以就将这个算法称作子集构造 (subset construction )。 • 1) 状态集合的-闭包 单个状态s的-闭包定义为:可由一系列的零个或 多个-转换能达到的状态集合S 。一个状态的-

文档评论(0)

1亿VIP精品文档

相关文档