【编译原理笔记】3.4 Tokens Recognization

1、Finite State Automata(有限状态自动机)

1.1 非确定性有限自动机(NFA)

定义组成

  1. 状态集合S:有限的状态集

  2. 输入字母表Σ:不包括空字符串ε

  3. 转移函数:对于每个状态和Σ∪{ε}中的符号,给出下一状态集合

  4. 起始状态s₀:特殊的开始状态

  5. 接受状态集合F:S的子集

关键特性

  • 允许ε转移(空转移)

  • 同一输入可能转移到多个状态

  • 接受条件:存在一条从起始状态到接受状态的路径,路径上的符号序列构成输入字符串

1.2 确定性有限自动机(DFA)

定义组成

  • 与NFA类似,但转移函数是确定性的

  • 对每个状态和Σ中的符号,有唯一的下一状态

  • 不允许ε转移


2、RE、NFA、DFA之间的等价转换

我们以以下例题来具体介绍:

Please construct a DFA with minimum states for the following regular expression.

(ab^*a)^*(a|b)b^*

2.1 RE to NFA(从正则表达式到NFA的转换)

2.1.1 Thompson构造算法

输入:正则表达式r over Σ 输出:接受L(r)的NFA

基础情况

  1. 对于ε:创建两个状态,通过ε连接

  2. 对于a∈Σ:创建两个状态,通过a连接

归纳构造

  1. 选择运算(r|s):并行连接两个NFA

  2. 连接运算(rs):串联连接两个NFA

  3. 闭包运算(r*):添加ε转移实现循环

2.1.2 例题解答

题中给出的是RE(正则表达式),第一步先将RE转换为NFA:

核心原则——将多步变为单步,遵循以下变换规则:

2.2 NFA to DFA

2.2.1 核心概念

  • ε-闭包:从给定状态通过ε转移可达的所有状态集合

  • move函数:从状态集合在输入符号a下的转移结果

子集构造算法

 初始化Dstates包含ε-closure(s₀)
 while (Dstates中有未标记状态T) {
     标记T
     for (每个输入符号a) {
         U = ε-closure(move(T, a))
         if (U不在Dstates中)
             添加U为未标记状态
         Dtran[T, a] = U
     }
 }

ε-闭包计算

 function ε-closure(T) {
     push all states in T onto stack
     result = T
     while (stack not empty) {
         pop t from stack
         for (每个状态u,满足t→u通过ε转移) {
             if (u不在result中) {
                 add u to result
                 push u onto stack
             }
         }
     }
     return result
 }

2.2.2 例题解答

第二步将NFA转换为DFA:

2.3 Minimal DFA

2.3.1 具体算法

算法目标

找到接受相同语言的最小状态DFA

算法步骤

  1. 初始划分:{接受状态} ∪ {非接受状态}

  2. 迭代细化:根据转移行为进一步划分状态组

  3. 终止条件:划分不再变化

  4. 选择代表:每个组选一个状态作为代表

  5. 清理优化:移除死状态和不可达状态

划分规则

状态s和t在同一组,当且仅当:

  • 对每个输入符号a,s和t都转移到同一组中的状态

2.3.2 例题解答

第三步最小化DFA:

4、关键定理和性质

4.1 等价性定理

  1. 任何正则表达式都可以转换为等价的NFA

  2. 任何NFA都可以转换为等价的DFA

  3. 任何DFA都可以找到等价的最小DFA

  4. 这三种表示法描述的语言类相同(正则语言)

4.2 最小DFA的唯一性

对于任何正则语言,最小状态数的DFA在状态重命名意义下是唯一的。

直接获取哈工大编译原理课程官方完整笔记较难,不过可以通过以下途径尝试获取: 1. **哈工大校内课程平台**:若能通过一定渠道登录哈工大校内的课程教学平台,可能有该课程老师上传的课件、笔记等教学资料。 2. **学校图书馆**:哈工大图书馆可能有编译原理课程相关的学习资料,包括老师整理的笔记、优秀学生的课堂笔记等,可咨询图书馆工作人员查找。 3. **网络资源**:在一些知识分享平台,如知乎、CSDN、GitHub等,可能有学习过该课程的学生分享的笔记。在搜索时可以使用“哈工大编译原理课程笔记”等关键词精准查找。 4. **联系哈工大学生**:通过校友群、社交平台等方式联系哈工大正在学习或学过该课程的学生,看是否能获取他们的笔记。 以下是编译原理中简单的词法分析代码示例(Python实现): ```python import re # 定义词法规则 token_patterns = [ (&#39;NUMBER&#39;, r&#39;\d+&#39;), (&#39;PLUS&#39;, r&#39;\+&#39;), (&#39;MINUS&#39;, r&#39;-&#39;), (&#39;MULTIPLY&#39;, r&#39;\*&#39;), (&#39;DIVIDE&#39;, r&#39;/&#39;), (&#39;LPAREN&#39;, r&#39;\(&#39;), (&#39;RPAREN&#39;, r&#39;\)&#39;), (&#39;WHITESPACE&#39;, r&#39;\s+&#39;) ] def tokenize(code): tokens = [] position = 0 while position < len(code): match = None for token_type, pattern in token_patterns: regex = re.compile(pattern) match = regex.match(code, position) if match: value = match.group(0) if token_type != &#39;WHITESPACE&#39;: tokens.append((token_type, value)) position = match.end(0) break if not match: raise ValueError(f"Invalid character at position {position}: {code[position]}") return tokens # 测试代码 code = "3 + 5" tokens = tokenize(code) for token in tokens: print(token) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

colus_SEU

留下你的鼓励,予我前行动力😄

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值