词法分析程序之正规式转换成NFA

来源:互联网 发布:双乾网络支付有限公司 编辑:程序博客网 时间:2024/05/29 04:47

词法分析程序之正规式转换成NFA

本篇依据Thompson方法,运用C语言编写而成。
实验环境:windows7和VS2013
源码下载地址:http://pan.baidu.com/s/1kVPkYDD

接口

Thompson构造法:从正规表达式构造NFA
输入:字母表Σ上的一个正规表达式r
输出:接受L(r)的NFA N

Thompson原理

方法:将r分解成最基本的子表达式,使用下面的规则1和2为r的每个基本符号( ε 或Σ中的符号)构造NFA。用规则3逐步组合前面构造的NFA,直到获得整个正规表达式的NFA为止。
规则1. 对ε, 构造NFA 。
这里写图片描述

这里 i 是新的开始状态,f是新的接受状态。很明显这个NFA识别{ε}。
规则2. 对于Σ中的每个符号a,构造NFA。
这里写图片描述
同样,i 是新的开始状态, f 是新的接受状态。 这个NFA识别 {a}。
规则3 . 如果N(s) 和 N(t) 是正规表达式s和t的NFA,则:
①对于正规表达式 s | t, 可构造复合的NFA N(s|t):
这里写图片描述
②对于正规表达式 st, 可构造复合的NFA N(st):
这里写图片描述
③对于正规表达式 s*, 构造复合的NFA N(s*):
这里写图片描述
④对于括起来的正规表达式 (s), 使用N (s) 本身作为它的NFA。
在构造过程中,每次构造的新状态都要赋予不同的名字。这样,任何NFA的两个状态都具有不同的名字。即使同一符号在r中出现多次,我们也要为该符号的每个实例创建一个独立的带有自己状态的NFA。

程序图

这里写图片描述

测试案例

实验中待识别的正规式:
单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:
ID = letter (letter | digit)(程序中写成a(a|b),a属于a~z,A~Z;b属于0~9)
NUM = digit digit* (写成bb*)

结果

控制台显示的结果:

这里写图片描述
这里写图片描述

换成NFA即为:

这里写图片描述
这里写图片描述

1 0
原创粉丝点击