第 1 页 实验二:THOMPSON 算法的实现 一.实验目的 掌握THOMPSON 算法原理和方法
二.实验要求、内容及步骤 1
输入字母表上的正规式r,输出一个接受L(r)的NFA; 2
采用C++语言,实现该算法; 3
编制测试程序 4
调试程序; 三.实验设备 计算机、Windows 操作系统、Visual C++ 程序集成环境
四.实验原理 Thompson 构造法:从正规表达式构造NFA 输入:字母表Σ上的一个正规表达式r 输出:接受L(r)的NFA N 方法:将 r 分解成最基本的子表达式,使用下面的规则 1 和2 为 r 的每个基本符号( ε 或Σ中的符号)构造NFA
用规则 3 逐步组合前面构造的NFA,直到获得整个正规表达式的NFA 为止
对ε, 构造NFA 第 2 页 这里 i 是新的开始状态,f 是新的接受状态
很明显这个NFA 识别{ε}
对于Σ中的每个符号 a,构造 NFA 同样,i 是新的开始状态, f 是新的接受状态
这个NFA 识别 {a}
如果 N(s) 和 N(t) 是正规表达式 s 和 t 的NFA,则: ①对于正规表达式 s | t, 可构造复合的NFA N(s|t): ②对于正规表达式 st, 可构造复合的NFA N(st): ③对于正规表达式 s*, 构造复合的NFA N(s*): 第 3 页 ④对于括起来的正规表达式 (s), 使用 N (s) 本身作为它的 NFA
在构造过程中,每次构造的新状态都要赋予不同的名字
这样,任何NFA的两个状态都具有不同的名字
即使同一符号在 r 中出现多次,我们也要为该符号的每个实例创建一个独立的带有自己状态的 NFA
第 4 页 五
程序设计框架 第 5 页 六
程序流程图 七
实验代码 核心代码如下: #ifndef THOMPSON_H