THOMPSON 算法的实现.docx
《THOMPSON 算法的实现.docx》由会员分享,可在线阅读,更多相关《THOMPSON 算法的实现.docx(13页珍藏版)》请在三一办公上搜索。
1、THOMPSON 算法的实现实验二:THOMPSON 算法的实现 一实验目的 掌握THOMPSON 算法原理和方法。 二实验要求、内容及步骤 1.输入字母表上的正规式r,输出一个接受L的NFA; 2.采用C+语言,实现该算法; 3.编制测试程序 4.调试程序; 三实验设备 计算机、Windows 操作系统、Visual C+ 程序集成环境。 四实验原理 Thompson构造法:从正规表达式构造NFA 输入:字母表上的一个正规表达式r 输出:接受L(r)的NFA N 方法:将r分解成最基本的子表达式,使用下面的规则1和2为r的每个基本符号构造NFA。用规则3逐步组合前面构造的NFA,直到获得整个
2、正规表达式的NFA为止。 规则1. 对, 构造NFA 第 1 页 这里 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*): 第 2 页 对于括起来的正规表达式 (s), 使用N (s) 本身作为它的NFA。 在构造过程中,每
3、次构造的新状态都要赋予不同的名字。这样,任何NFA的两个状态都具有不同的名字。即使同一符号在r中出现多次,我们也要为该符号的每个实例创建一个独立的带有自己状态的NFA。 第 3 页 五.程序设计框架 第 4 页 六.程序流程图 七.实验代码 核心代码如下: #ifndef THOMPSON_H #define THIMPSON_H #include #include #include #include using namespace std; 第 5 页 #define MAX 100 /节点,定义成结构体,便于以后扩展 struct state string StateName; ; /边
4、空转换符永#表示 struct edge state StartState; state EndState; char TransSymbol; ; /单元 struct cell edge EdgeSetMAX; int EdgeCount; state StartState; state EndState; ; /全局变量声明 /int EDGE_NUM = 0; int STATE_NUM = 0; /int CELL_NUM = 0; /函数声明 void input(string&); int check_legal(string); int check_character(stri
5、ng); int check_parenthesis(string); int is_letter(char); string add_join_symbol(string); /中缀转后缀 string postfix(string); /优先级 in stack priority int isp(char); /优先级 in coming priority int scp(char); /表达式转NFA cell express_2_NFA(string); /处理 a|b cell do_Unite(cell,cell); /处理 ab cell do_Join(cell,cell);
6、/处理 a* cell do_Star(cell); 第 6 页 /处理 a cell do_Cell(char); /将一个单元的边的集合复制到另一个单元 void cell_EdgeSet_Copy(cell&,cell); /产生一个新的状态节点,便于管理 state new_StateNode; /显示 void Display(cell); #endif #include Thompson.h /主函数, void main string Regular_Expression = (a|b)*abb; cell NFA_Cell; Regular_Expression = (a|b)
7、*abb; /接受输入 input(Regular_Expression);/调试需要先屏蔽 /添加“+”,便于转后缀表达式 Regular_Expression = add_join_symbol(Regular_Expression); /中缀转后缀 Regular_Expression = postfix(Regular_Expression); /表达式转NFA NFA_Cell = express_2_NFA(Regular_Expression); /显示 Display(NFA_Cell); /*表达式转NFA处理函数,返回最终的NFA结合 */ cell express_2_N
8、FA(string expression) int length = expression.size; char element; cell Cell,Left,Right; stack STACK; for(int i=0;ilength;i+) element = expression.at(i); switch(element) case |: Right = STACK.top; STACK.pop; Left = STACK.top; STACK.pop; Cell = do_Unite(Left,Right); STACK.push(Cell); break; 第 7 页 case
9、 *: Left = STACK.top; STACK.pop; Cell = do_Star(Left); STACK.push(Cell); break; case +: Right = STACK.top; STACK.pop; Left = STACK.top; STACK.pop; Cell = do_Join(Left,Right); STACK.push(Cell); break; default: Cell = do_Cell(element); STACK.push(Cell); cout处理完毕!endl; Cell = STACK.top; STACK.pop; retu
10、rn Cell; /处理 a|b cell do_Unite(cell Left,cell Right) cell NewCell; NewCell.EdgeCount=0; edge Edge1,Edge2,Edge3,Edge4; /获得新的新状态节点 state StartState = new_StateNode; state EndState = new_StateNode; /构建边 Edge1.StartState = StartState; Edge1.EndState = Left.EdgeSet0.StartState; Edge1.TransSymbol = #; Edg
11、e2.StartState = StartState; Edge2.EndState = Right.EdgeSet0.StartState; Edge2.TransSymbol = #; Edge3.StartState = Left.EdgeSetLeft.EdgeCount-1.EndState; Edge3.EndState = EndState; Edge3.TransSymbol = #; Edge4.StartState = Right.EdgeSetRight.EdgeCount-1.EndState; Edge4.EndState = EndState; Edge4.Tran
12、sSymbol = #; /构建单元 /先将Left和Right的EdgeSet复制到NewCell 第 8 页 cell_EdgeSet_Copy(NewCell,Left); cell_EdgeSet_Copy(NewCell,Right); /将新构建的四条边加入EdgeSet NewCell.EdgeSetNewCell.EdgeCount+ = Edge1; NewCell.EdgeSetNewCell.EdgeCount+ = Edge2; NewCell.EdgeSetNewCell.EdgeCount+ = Edge3; NewCell.EdgeSetNewCell.EdgeC
13、ount+ = Edge4; /构建NewCell的启示状态和结束状态 NewCell.StartState = StartState; NewCell.EndState = EndState; return NewCell; /处理 ab cell do_Join(cell Left,cell Right) /将Left的结束状态和Right的开始状态合并,将Right的边复制给Left,将Left返回 /将Right中所有以StartState开头的边全部修改, for(int i=0;iRight.EdgeCount;i+) if(Right.EdgeSeti.StartState.St
14、ateNpare(Right.StartState.StateName)=0) Right.EdgeSeti.StartState = Left.EndState; STATE_NUM-; else if(Right.EdgeSeti.EndState.StateNpare(Right.StartState.StateName)=0) Right.EdgeSeti.EndState = Left.EndState; STATE_NUM-; Right.StartState = Left.EndState; cell_EdgeSet_Copy(Left,Right); /将Left的结束状态更新
15、为Right的结束状态 Left.EndState = Right.EndState; return Left; /处理 a* cell do_Star(cell Cell) cell NewCell; NewCell.EdgeCount=0; edge Edge1,Edge2,Edge3,Edge4; /获得新的新状态节点 state StartState = new_StateNode; state EndState = new_StateNode; /构建边 Edge1.StartState = StartState; Edge1.EndState = EndState; 第 9 页 E
16、dge1.TransSymbol = #; Edge2.StartState = Cell.EndState; Edge2.EndState = Cell.StartState; Edge2.TransSymbol = #; Edge3.StartState = StartState; Edge3.EndState = Cell.StartState; Edge3.TransSymbol = #; Edge4.StartState = Cell.EndState; Edge4.EndState = EndState; Edge4.TransSymbol = #; /构建单元 /先将Cell的E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- THOMPSON 算法的实现 算法 实现
链接地址:https://www.31ppt.com/p-3166994.html