- //fsminit.cpp - fsminit
- #include <stdio.h>
- #include <winsock.h>
- #include "tnfsm.h"
- #define TINVALID 0xff //一个无效的跃变索引
- //fsminit - 有限状态机的初始化
- void
- fsminit(u_char fsm[][NCHRS], struct fsm_trans ttab[], int nstates)
- //参数fsm指定一个必须被初始化的转移矩阵
- //参数ttab给出一个紧凑FSM表示的地址
- //参数nstates指定了最终的FSM状态数
- {
- struct fsm_trans *pt;
- int sn, ti, cn;
- //把整个转移矩阵初始化为TINVALID
- for (cn=0; cn<NCHRS; ++cn)
- for (ti=0; ti<nstates; ++ti)
- fsm[ti][cn] = TINVALID;
- //循环扫描紧凑表示中的每个元素,并把该元素指定的状态转换添加到
- //转移矩阵中去
- for (ti=0; ttab[ti].ft_state != FSINVALID; ++ti) {
- pt = &ttab[ti];
- sn = pt->ft_state;
- //再一次循环扫描整个转移矩阵,修改未被填充的转移项,
- //使它们指向紧凑表示末尾的无效状态转移
- if (pt->ft_char == TCANY) {
- for (cn=0; cn<NCHRS; ++cn)
- if (fsm[sn][cn] == TINVALID)
- fsm[sn][cn] = ti;
- } else
- fsm[sn][pt->ft_char] = ti;
- }
- //把所有未初始化的索引设置未一个有效的转移
- for (cn=0; cn<NCHRS; ++cn)
- for (ti=0; ti<nstates; ++ti)
- if (fsm[ti][cn] == TINVALID)
- fsm[ti][cn] = ti;
- }
fsminit.cpp
最新推荐文章于 2022-01-23 17:16:40 发布