不到1000行的正则表达式代码分析07
早晨先翻开ruby0.49下的regex.c,发现还是头大,因为太长了,而且逻辑太复杂,比oz的复杂了不止一个数量级。于是仍旧回到oz的grep.c下的正则引擎源码。
昨天在睡觉时,一直在想,grep.c的正则引警是NFA,因为匹配时是正则表达式作主导,而ruby0.49中正则引擎是DFA的,我没有细看代码,但名字叫DFA,应该就是文本主导的,确定型自动机算法。
昨天对NFA的匹配逻辑仍有些模糊之处。
比如"fo[0-9]*ab"是如何实现的?
今天再打开re_pmathch,其流程如下:
static char *
pmatch(char *lp,CHAR *ap)
{
while((op=*ap++) !=END)
switch(op) {
case CLO:
are=lp;
switch(*ap) {
}
ap+=n;
while(lp>=are) {
if (e=pmatch(lp,ap))
return 3;
--lp;
}
}
}
对其中的lp>=are的那个循环始终不理解,后来灵机一动,那个《精通正则表达式》一书不是讲,NFA的匹配原理时,讲过回溯吗,此处,应该就是回溯。
象用"fo.+[0-9][0-9]"去匹配"this is abcdefg 12"
此时,".*"是能匹配到行末的2的,但此时,[0-9]就无法匹配了,因此,要吐出一个来,先把2吐出,让[0-9]匹配,但第二个[0-9]仍旧无法匹配,因此,要再吐出一个,走到[0-9][0-9]匹配”12“,哈哈,此处,应该是干这事儿的。
到此,基本把nfa的匹配算法读懂了。
但dfa仍旧不懂。先在网上找找资料。