编译原理笔记4:从正规式到词法分析器(1):构造词法分析器的一般步骤、从正规式到 NFA

概述

构造词法分析器的一般步骤:

  1. 确定词法规则:词法规则定义了源代码中各种词法单元(tokens)的模式。例如,关键字、标识符、运算符、常量等都可以作为词法单元。确定需要识别的词法单元及其模式是构造词法分析器的第一步。

  2. 将正规式转换为非确定性有限自动机(NFA):正规式(Regular Expression)是一种用于描述模式的形式化表达式。使用正规式作为输入,可以构造一个对应的非确定性有限自动机(NFA)。NFA 是一种状态转换图,其中状态表示正规式的子表达式,转换边表示正规式操作(如连接、选择、闭包)。

  3. 将 NFA 转换为确定性有限自动机(DFA):NFA 可能存在多个同时活跃的状态,因此需要将其转换为确定性有限自动机(DFA),以便更容易进行分析和实现。DFA 是一种具有确定的状态转换的有限自动机。

  4. 构建词法分析表:根据词法规则和 DFA,构建词法分析表。词法分析表是一个二维表格,其中行表示 DFA 的状态,列表示输入符号。表格中的每个条目指示在给定状态下,对应输入符号应该执行的操作(如转换到下一个状态、输出词法单元等)。

  5. 实现词法分析器:根据词法分析表,实现词法分析器的代码。词法分析器接受源代码作为输入,并根据词法规则逐个识别出词法单元,并生成对应的词法单元流供后续的语法分析使用。

从正规式到 NFA 的转换:

  1. 对正规式进行语法分析:将正规式进行语法分析,拆分为更小的子表达式,并确定它们之间的运算关系(连接、选择、闭包等)。

  2. 构建 NFA 片段:根据子表达式和运算关系,构建对应的 NFA 片段。每个 NFA 片段有一个初始状态和一个接受状态,通过转换边连接起来。

  3. 合并 NFA 片段:根据运算关系,将 NFA 片段合并成一个更大的 NFA。合并时,将前一个 NFA 的接受状态与后一个 NFA 的初始状态之间添加 ε(空转换)边。

  4. 确定初始状态和接受状态:确定整个正规式对应的 NFA 的初始状态和接受状态。

通过这样的步骤,我们可以将正规式转换为对应的 NFA,为后

续的 DFA 构造和词法分析器实现奠定基础。

一般方法和步骤

  1. 用正规式描述模式(描述词法规则);
  2. 为每个正规式构造一个 NFA ,这个 NFA 识别正规式表示的正规集(即,将正规式转成 NFA。正规式和NFA在这里就描述同一个正规集了,他们两个是等价的);
  3. 将上一步得到的 NFA 转换成与之等价的 DFA ,这一步叫做”确定化“;
  4. 优化上一步得到的 DFA,使其状态数最少,这一步叫做 ”最小化“;
  5. 从 上一步 得到的 DFA 来构造词法分析器。

在上面的步骤中,我们通过 NFA 构造 DFA 而非直接构造 DFA ,是因为有专门的算法工具来一步步完成从正规式->NFA->DFA->分析器的工作。这样我们就可以省略中间的手工劳动步骤。

在这里插入图片描述

虚线框内部的,就是 Lex 的工作内容和原理。

我们使用的时候,直接从正规式使用工具转化为词法分析器就可以了。接下来我们从正规式开始一步步搞懂词法生成器是怎么一回事。

从正规式到NFA

先复读一下正规式:正规式是用来描述词法规则的,也就是描述:记号该长成什么样子、数字该长成什么样子之类。

Thompson 算法

它的任务,是将正规式转化为与其等价的 NFA。

也就是说,它可以将任意的字母表 Σ 上的正规式 r ,转化为一个能够接受 L® 的 NFA N。

想要构造一个正规式,我们需要从最简单的正规式(也就是 ε 和一个个字母)开始,通过一步步添加运算,逐步把它构造成我们想要的目标正规式。最简单的正规式就是 ε 和字母表上的一个个字符。

[)(./img/3_7.png)]

NFA 的构造步骤和正规式的构造步骤是相同的,构造两种东西的每一步都可以对应起来。因此,NFA 也要从最开始的小 NFA 开始构造。

每一种 NFA 都能和一个正规式相对应,如下图所示

在这里插入图片描述

回忆NFA,再观察上图中的正规式和NFA 3~6 可以发现这样的一个问题:

Q:我们知道自动机可以有多个终态,可是 3-6 的这几个自动机直接使用已有的自动机作为自己的一部分,怎么可以假设这些被包含的自动机只有一个终态呢?

A:这是因为图中的 NFA 都是递归构造出来的——也就是说,我们认为上面3-6自动机中的 N§、N(Q) 自动机也都是用 Thompson 构造算法构造的,而只要是该算法构造出的 NFA,就一定都是只有一个终态的。

而且,其实对于任意的多终态 NFA,我们都可以把它转化一个单终态NFA——方法非常简单,只需要将它的所有终态引出一条 ε 边,指向一个唯一的新终态即可。

例:用 Thompson 算法构造正规式 r=(a|b)*abb 的 NFA N®

先从最小的正规式对应的 NFA 开始构造,再把得到的 NFA 进行组合,得到最终的 NFA 。
在这里插入图片描述

注意:

  • 该算法中,NFA 的构造与正规式的构造步骤是一一对应的;
  • 构造一个新的 NFA ,最多会增加两个状态(始、终),对于连接运算,则会减少状态。
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VengaZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值