不到1000行的正则表达式代码分析07

不到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仍旧不懂。先在网上找找资料。


 

猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/86350021