原链接: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的开启和闭合。