fsminit.cpp

来源:互联网 发布:java聚类分析 编辑:程序博客网 时间:2024/06/02 01:56
  1. //fsminit.cpp - fsminit   
  2.   
  3. #include <stdio.h>  
  4. #include <winsock.h>  
  5.   
  6. #include "tnfsm.h"  
  7.   
  8. #define TINVALID    0xff    //一个无效的跃变索引  
  9.   
  10. //fsminit - 有限状态机的初始化  
  11.   
  12. void  
  13. fsminit(u_char fsm[][NCHRS], struct fsm_trans ttab[], int nstates)   
  14. //参数fsm指定一个必须被初始化的转移矩阵   
  15. //参数ttab给出一个紧凑FSM表示的地址   
  16. //参数nstates指定了最终的FSM状态数  
  17. {  
  18.     struct fsm_trans    *pt;  
  19.     int         sn, ti, cn;  
  20.    
  21.    //把整个转移矩阵初始化为TINVALID  
  22.     for (cn=0; cn<NCHRS; ++cn)  
  23.         for (ti=0; ti<nstates; ++ti)  
  24.             fsm[ti][cn] = TINVALID;  
  25.    
  26.     //循环扫描紧凑表示中的每个元素,并把该元素指定的状态转换添加到   
  27.     //转移矩阵中去  
  28.     for (ti=0; ttab[ti].ft_state != FSINVALID; ++ti) {  
  29.         pt = &ttab[ti];  
  30.         sn = pt->ft_state;   
  31.     //再一次循环扫描整个转移矩阵,修改未被填充的转移项,   
  32.     //使它们指向紧凑表示末尾的无效状态转移  
  33.         if (pt->ft_char == TCANY) {  
  34.             for (cn=0; cn<NCHRS; ++cn)  
  35.                 if (fsm[sn][cn] == TINVALID)  
  36.                     fsm[sn][cn] = ti;  
  37.         } else  
  38.             fsm[sn][pt->ft_char] = ti;  
  39.     }  
  40.     //把所有未初始化的索引设置未一个有效的转移  
  41.     for (cn=0; cn<NCHRS; ++cn)  
  42.         for (ti=0; ti<nstates; ++ti)  
  43.             if (fsm[ti][cn] == TINVALID)  
  44.                 fsm[ti][cn] = ti;  
  45. }  
0 0
原创粉丝点击