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 13:31:12

卷积神经网络反向传播过程PyTorch代码实现

卷积神经网络反向传播过程PyTorch代码实现 在图像识别任务日益复杂的今天,如何高效训练卷积神经网络(CNN)成为开发者面临的核心挑战之一。尽管现代深度学习框架已经极大简化了模型搭建流程,但要真正掌握其内在机制,尤其…

作者头像 李华
网站建设 2026/4/15 13:30:52

Java计算机毕设之基于SpringBoot的粮食供应链管理系统的设计与实现基于SpringBoot的供应链管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/15 13:30:19

Git rebase合并提交历史,整洁PyTorch代码仓库

Git rebase合并提交历史,整洁PyTorch代码仓库 在现代深度学习项目中,一个常见的尴尬场景是:你花了几周时间调通了一个复杂的模型训练流程,终于准备提交PR时却发现提交记录里满是 fix cuda error again、wip: almost done、oops, t…

作者头像 李华
网站建设 2026/4/15 13:31:08

PyTorch-CUDA-v2.6镜像更新频率说明

PyTorch-CUDA-v2.6 镜像:构建高效 AI 开发环境的关键实践 在深度学习项目日益复杂、算力需求持续攀升的今天,一个稳定、可复现且开箱即用的开发环境,往往决定了团队能否快速从原型验证迈向实际部署。尤其当多个开发者协作、跨本地与云平台切…

作者头像 李华
网站建设 2026/4/10 6:17:39

5.3 项目管理!规范编译为plan.md与tasks.md:高效项目管理的实战技巧

5.3 计划与任务:将规范"编译"为plan.md与tasks.md(项目管理实战) 引言 在AI原生开发中,规范文档(spec.md)需要转化为开发计划(plan.md)和任务清单(tasks.md)。本文将深入解析如何将规范"编译"为计划和任务。 规范到计划的转换 转换流程 #mer…

作者头像 李华
网站建设 2026/4/13 0:35:39

5.6 DevOps实战!自动化构建与CI-CD:从代码到部署的完整流水线

5.6 DevOps实战!自动化构建与CI/CD:从代码到部署的完整流水线 引言 自动化构建和CI/CD是AI原生开发的重要环节。本文将深入解析如何实现自动化构建和CI/CD流程。 CI/CD流程 流程图 #mermaid-svg-qOSXBfZcxnkFTAjJ{font-family:"trebuchet ms",verdana,arial,sa…

作者头像 李华