news 2026/4/16 13:27:57

正则表达式 → 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/4/15 14:47:51

Java计算机毕设之基于SpringBoot的高校学习讲座预约系统的设计与实现预约记录(学生信息、预约状态)、签到(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/16 12:38:18

WSL2下安装PyTorch-GPU失败?试试我们的预装镜像方案

WSL2 下 PyTorch-GPU 环境搭建太难?这个预装镜像让你 5 分钟上手 在 Windows 上做深度学习开发,你是不是也经历过这些崩溃时刻? 刚配好 WSL2,兴冲冲地 pip install torch,结果 torch.cuda.is_available() 返回 False&a…

作者头像 李华
网站建设 2026/4/16 11:00:13

计算机毕业设计springboot基于的养老院管理系统 基于SpringBoot的智慧养老机构综合服务平台 面向银发一族的SpringBoot康养社区信息管理系统

计算机毕业设计springboot基于的养老院管理系统074ek634 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。人口老龄化曲线陡升,传统纸质与Excel已无法承载日益复杂的入…

作者头像 李华
网站建设 2026/4/12 17:27:19

4.5 专家能力!Agent Skills从入门到精通:为AI植入专家能力的实战教程

4.5 智能涌现的基石:精通Agent Skills,为AI植入专家能力(从入门到精通) 引言 Agent Skills是让AI具备特定领域专家能力的关键机制。通过定义和注册Skills,你可以让AI掌握特定的知识、技能和工作流程,从而在特定领域表现出专家级的能力。 本文将深入解析Agent Skills的…

作者头像 李华
网站建设 2026/4/15 14:50:25

5.7 重构指南!AI赋能的系统体检与外科手术:大型项目重构的实战经验

5.7 维护与重构:AI赋能的系统"体检"与"外科手术"(重构实战指南) 引言 系统维护和重构是软件开发的重要环节。AI可以帮助分析系统问题、生成重构方案、执行重构操作。本文将深入解析AI赋能的系统维护和重构。 系统体检 体检流程 #mermaid-svg-WOsSWO…

作者头像 李华
网站建设 2026/4/16 12:07:53

Agent Skills 必知必会

文章目录什么是 Agent Skills核心组成分层加载机制Skills 的核心优势Agent Skills 工作原理技能与上下文窗口技能与代码执行SKILL.md 编写指南Frontmatter(前言)配置SKILL.md 提示内容编写辅助资源的组织与绑定理解Skills与MCP的关系为什么技能和MCP能很…

作者头像 李华