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

简介:

一般方法和步骤

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

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

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

从正规式到NFA

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

Thompson 算法

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

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

想要构造一个正规式,我们需要从最简单的正规式(也就是 ε 和一个个字母)开始,通过一步步添加运算,逐步把它构造成我们想要的目标正规式。最简单的正规式就是 ε 和字母表上的一个个字符。
3_7
NFA 的构造步骤和正规式的构造步骤是相同的,构造两种东西的每一步都可以对应起来。因此,NFA 也要从最开始的小 NFA 开始构造。

每一种 NFA 都能和一个正规式相对应,如下图所示
3_8
回忆NFA,再观察上图中的正规式和NFA 3~6 可以发现这样的一个问题:

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

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

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

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

先从最小的正规式对应的 NFA 开始构造,再把得到的 NFA 进行组合,得到最终的 NFA 。
3_9
注意:

  • 该算法中,NFA 的构造与正规式的构造步骤是一一对应的;
  • 构造一个新的 NFA ,最多会增加两个状态(始、终),对于连接运算,则会减少状态。
相关文章
|
3月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
63 0
|
3月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
112 1
|
3月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
98 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
28 1
|
3月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
32 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
40 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
35 0
|
7天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
7天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
101 68
|
17天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。