现在的位置: 首页 > 综合 > 正文

老赵趣味编程之状态机解析url参数

2013年06月18日 ⁄ 综合 ⁄ 共 1312字 ⁄ 字号 评论关闭

原链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/10/12/code-for-fun-tokenizer.html

 

今天偶然翻起,又细读了一遍,包括后面的2篇答案解析:

http://www.cnblogs.com/jeffreyzhao/archive/2009/10/21/code-for-fun-tokenizer-answer-1.html

"http://www.cnblogs.com/JeffreyZhao/archive/2009/10/22/code-for-fun-tokenizer-answer-2-fsharp.html">

也想自己亲手实现以下。花了几个小时,发现和原文的答案也颇有些出入,可能有些地方想法还不太一样。

同样,我也把url规则解析为5个状态:

1.普通状态

2.单引号状态

3.普通状态遇到单引号

4.单引号状态遇到单引号

5.普通状态遇到分隔符

//普通状态
var StateParser_1 =function(ch){
log(ch
+"普通状态");

if(ch=="-"){
return StateParser_5;
}
if(ch=="'"){
return StateParser_3;
}
else{
token.push(ch);
return StateParser_1;
}
};

//单引号状态
var StateParser_2 =function(ch){
log(ch
+"单引号状态");

if(ch=="'"){
return StateParser_4;
}
else{
token.push(ch);
return StateParser_2;
}
};

//普通状态遇到单引号
var StateParser_3 =function(ch){
log(ch
+"普通状态遇到单引号");

token.push(ch);
if(ch=="'"){
return StateParser_1;
}
return StateParser_2;
};

//单引号状态遇到单引号
var StateParser_4 =function(ch){
log(ch
+"单引号状态遇到单引号");

if(ch=="'"){
token.push(ch);
return StateParser_2;
}
if(ch=="-"){
return StateParser_5;
}
};

//普通状态遇到分隔符
var StateParser_5 =function(ch){
log(ch
+"普通状态分隔符状态");

tokenG.push(token);
token
= [];
if(ch=="-"){
text.push(tokenG);
tokenG
= [];
return StateParser_1;
}
elseif(ch=="'"){
return StateParser_3;
}
else{
token.push(ch);
return StateParser_1;
}

}

 其中,StateParser_1和StateParser_2可以理解为长状态,一般用来记录节点值。而其他3个则为短状态,也可称为变化点,经过这些变化点以决定token及tokenGroup的开启和闭合。

抱歉!评论已关闭.