1. 程式人生 > >不到1000行的正則表示式程式碼分析07

不到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仍舊不懂。先在網上找找資料。