初始化一个状态机

作者在 2008-10-24 21:45:12 发布以下内容
char fsm[8][128];

void initfsm()
{
    const int line_len=sizeof(char)*128;
    memset(fsm[0],0,line_len);
    memset(fsm[1],0,line_len);
    memset(fsm[2],2,line_len);
    memset(fsm[3],3,line_len);
    memset(fsm[4],3,line_len);
    memset(fsm[5],5,line_len);
    memset(fsm[6],5,line_len);
    memset(fsm[7],0,line_len);
    fsm[0]['/']=1;
    fsm[0]['"']=5;
    fsm[1]['/']=2;
    fsm[1]['*']=3;
    fsm[1]['"']=5;
    fsm[2]['\n']=7;
    fsm[3]['*']=4;
    fsm[4]['/']=7;
    fsm[4]['*']=4;
    fsm[5]['"']=0;
    fsm[5]['\\']=6;
    fsm[7]['/']=1;
    fsm[7]['"']=5;
}
为什么说上面的代码已经把所有的转化关系填满了呢?因为对于字符状态机fsm[][128],ASCII标准中一个字符char的低7位有效,最高位在更低层做校验,因此你看到的都是0,0-127就是全集。也就是对于每一个状态,更新状态采用state=fsm[state][c];其中字符C是新输入的字符,而这个字符C必定在0-127之间,因此fsm[state][c]必定对应一个新的状态。
比如: fsm[0]['#']的状态是什么呢?'#'对应的ASCII值是35,因此相当于问fsm[0][35]的状态是什么?
由上面的代码 memset(fsm[0],0,line_len);且之后的初始化部分没有对 fsm[0]['#'](fsm[0][35])进行重新赋值,因此fsm[0]['#'](fsm[0][35])的值就是 0
在比如: fsm[4]['/'] 状态是什么呢?'/'对应的ASCII值是47,由 memset(fsm[4],3,line_len);本来fsm[4][47] 状态是3,但是其后由fsm[4]['/']=7;对这个位做了特殊的处理,因此经过初始化后,这个fsm[4]['/'](fsm[4][47] )的状态是 7 而非 3

技术 | 阅读 4190 次
文章评论,共0条
游客请输入验证码
浏览1941043次