news 2026/2/13 14:52:37

正则表达式 → NFA(通过 Thompson 构造法)→ DFA(通过子集法)→ 最小化 DFA(合并等价状态)是 Lex 类工具的核心流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
正则表达式 → NFA(通过 Thompson 构造法)→ DFA(通过子集法)→ 最小化 DFA(合并等价状态)是 Lex 类工具的核心流程

核心内容解读与补充背景的综合分析如下:

  1. NFA 的定义与结构
    示例中的 NFA $ M_2 $ 明确给出了以下要素:

    • 状态集合 $ Q $:如 $ {q_0, q_1, q_2} $;
    • 输入符号集 $ \Sigma $:如 $ {a, b} $;
    • 初态 $ q_0 $,终态集合 $ F $(如 $ {q_2} $);
    • 状态转换函数 $ \delta $:允许从一个状态在某个输入符号或 $ \varepsilon $(空串)下转移到多个状态。
      转换图直观展示状态间连接,转换矩阵则以表格形式表示相同信息。
  2. NFA 与 DFA 的关系

    • DFA 是 NFA 的特例:DFA 在每个状态下对每个输入符号有且仅有一个后继状态,而 NFA 可有零个、一个或多个。
    • 等价性定理:对于任意 NFA $ M $,都存在一个 DFA $ M’ $,使得两者接受的语言完全相同,即 $ L(M) = L(M’) $。这是词法分析器构造的理论基础。
  3. NFA 转 DFA 的关键操作——子集构造法(Subset Construction)
    核心思想是将 NFA 的“不确定性的状态集合”作为 DFA 的单个状态。具体步骤包括:

    • ε_闭包(ε-CLOSURE)
      对于状态集合 $ S,,\varepsilon\text{-CLOSURE}(S) $ 是从 $ S $ 中每个状态出发,仅通过 $ \varepsilon $-转移能到达的所有状态的并集。例如,若 $ q_0 \xrightarrow{\varepsilon} q_1 $,则 $ \varepsilon\text{-CLOSURE}({q_0}) = {q_0, q_1} $。
    • DFA 初态确定
      DFA 的初态为 $ \varepsilon\text{-CLOSURE}({q_0}) $。
    • 状态扩展与标记
      对每一个未标记的 DFA 状态(即 NFA 的状态子集),对每个输入符号 $ a \in \Sigma $:
      1. 计算所有可通过 $ a $ 弧到达的状态集合 $ T = \bigcup_{p \in S} \delta(p, a) $;
      2. 再求 $ \varepsilon\text{-CLOSURE}(T) $,得到新的状态子集;
      3. 若该子集不在当前 DFA 状态集中,则加入并标记为未处理;
      4. 添加对应转换边。
    • 重复直到所有状态都被处理完毕。最终,包含原 NFA 终态的状态子集即为 DFA 的终态。
  4. 应用背景:编译原理中的词法分析

    • 正则表达式 → NFA(通过 Thompson 构造法)→ DFA(通过子集法)→ 最小化 DFA(合并等价状态)是 Lex 类工具的核心流程。
    • 将正则规则转化为自动机后,可在 $ O(n) $ 时间内扫描输入字符串($ n $ 为长度),实现高效词法识别(如识别if关键字、变量名、数字常量等)。
    • 使用 DFA 的优势在于其确定性,避免回溯,适合高速解析。
# 示例:简化版 ε-CLOSURE 实现(基于邻接表表示的 NFA)defepsilon_closure(epsilon_transitions,states):""" epsilon_transitions: dict, 如 {q0: [q1], q1: [q2], q2: []} states: set of initial states returns: set of all states reachable via ε-transitions """closure=set(states)stack=list(states)whilestack:state=stack.pop()fornext_stateinepsilon_transitions.get(state,[]):ifnext_statenotinclosure:closure.add(next_state)stack.append(next_state)returnclosure# 示例调用eps_trans={0:[1],1:[2],2:[]}print(epsilon_closure(eps_trans,{0}))# 输出: {0, 1, 2}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 12:19:19

Java毕设项目推荐-基于SpringBoot+协同过滤的河南特色美食分享系统的设计与实现河南地域美食文化传播、美食经验交流、探店推荐【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/2 23:59:08

计算机毕业设计springboot基于+Vue的刷题系统 SpringBoot+Vue 驱动的在线编程训练平台 前后端分离的 Java 智能题库与自测系统

计算机毕业设计springboot基于Vue的刷题系统3pv2q478 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在“人人可编程”的时代,碎片化学习与即时反馈成为刚需。传统纸…

作者头像 李华
网站建设 2026/2/8 12:03:37

Docker prune清理无用镜像释放PyTorch磁盘空间

Docker Prune 清理无用镜像释放 PyTorch 磁盘空间 在 GPU 服务器上跑着第 N 个 PyTorch 实验时,突然收到“磁盘空间不足”的报警——这几乎是每个深度学习工程师都经历过的噩梦。明明只拉了几个官方镜像,怎么不到一周就占了上百 GB?问题往往不…

作者头像 李华
网站建设 2026/2/11 1:23:38

Anaconda Prompt常用命令汇总:PyTorch开发必备

Anaconda Prompt 常用命令与 PyTorch-CUDA 开发环境实战 在深度学习项目中,最让人头疼的往往不是模型设计或训练调参,而是“环境配不起来”——明明代码没问题,却因为 CUDA 版本不对、PyTorch 缺依赖、Python 环境混乱而卡住。这种“在我机器…

作者头像 李华
网站建设 2026/2/9 10:57:41

如何快速安装PyTorch并启用CUDA?一文搞定GPU加速配置

如何快速安装PyTorch并启用CUDA?一文搞定GPU加速配置 在深度学习项目开发中,最让人头疼的往往不是模型设计本身,而是环境搭建——尤其是当你要让 PyTorch 成功调用 GPU 时。你有没有经历过这样的场景:满怀信心地运行训练脚本&…

作者头像 李华
网站建设 2026/2/10 15:05:47

4.7 自动化集成!Headless模式实战:将AI能力集成到脚本与CI的完整方案

4.7 编程接口:驾驭Headless模式,将AI能力集成到脚本与CI(自动化实战) 引言 Headless模式允许你通过编程接口调用AI能力,将AI集成到脚本、CI/CD流程等自动化场景中。本文将深入解析Headless模式的原理和使用方法。 什么是Headless模式? 概念解析 #mermaid-svg-iEPjeqo…

作者头像 李华