news 2026/6/10 16:07:04

正则表达式 → 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/6/10 11:56:11

解决wslregisterdistribution failed问题,快速接入GPU算力

解决 wslregisterdistribution failed 问题,快速接入 GPU 算力 在人工智能开发日益普及的今天,越来越多的研究者和工程师选择在 Windows 上搭建深度学习环境。尽管 Linux 仍是主流平台,但 WSL2(Windows Subsystem for Linux 2&am…

作者头像 李华
网站建设 2026/6/9 21:24:39

5.1 架构设计!AI原生开发驾驶舱:构建统一控制中心的5个核心模块

5.1 顶层设计:构建你的AI原生开发"驾驶舱"(架构设计最佳实践) 引言 AI原生开发需要一个"驾驶舱"——一个统一的控制中心,让你能够管理整个开发流程。这个驾驶舱不仅要集成AI能力,还要提供清晰的工作流、可视化的进度、以及完整的工具链。 本文将深…

作者头像 李华
网站建设 2026/6/10 10:31:33

5.5 代码审查!review指令标准化审查:提升代码质量的5个关键步骤

5.5 协同与审查:调用框架中的/review指令,实现标准化审查(代码审查实战) 引言 代码审查是保证代码质量的重要环节。AI可以自动进行代码审查,检查代码风格、潜在问题、最佳实践等。本文将深入解析AI代码审查的实现。 AI代码审查 审查流程 #mermaid-svg-YMOlhcTsGPyUqqs…

作者头像 李华
网站建设 2026/6/10 11:29:51

Docker Network配置多个PyTorch容器通信

Docker Network 配置多个 PyTorch 容器通信 在现代深度学习系统中,单机单卡早已无法满足大模型训练对算力的需求。越来越多的团队转向分布式训练方案,而如何快速、稳定地搭建可复用的多节点环境,成为工程落地的关键挑战之一。 设想这样一个场…

作者头像 李华
网站建设 2026/6/10 11:45:32

Dify应用监控PyTorch模型调用次数与Token消耗

Dify应用监控PyTorch模型调用次数与Token消耗 在当今大模型快速落地的背景下,企业对AI服务的可观测性和成本控制能力提出了更高要求。一个训练好的模型如果无法被有效监控其使用情况,就难以实现商业化闭环——你不知道它被调用了多少次、消耗了多少资源&…

作者头像 李华
网站建设 2026/6/9 21:33:37

目前流行的AI IDE都有哪些

当前AI IDE的发展已经超越了早期的代码补全,进入了“智能体编程”时代,AI能更独立地理解和完成复杂开发任务。下面这个表格可以帮助你快速把握几款主流工具的核心特点。工具名称核心定位突出特点适用场景Trae​自适应AI IDE,追求“全自动”开…

作者头像 李华