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

不到1000行的正則表示式原始碼分析06

不到1000行的正則表示式原始碼分析06
今天想談NFA與DFA的區別,對程式碼來說。
我喜歡購書,只要是經典的書,就買了。但當時也許看不懂。記得,《設計模式》一出來時,就購買了。可總是看不懂。直到看了程傑寫的《大話設計模式》才基本看懂。
其實,學正則表示式,有本經典書《精通正則表示式》也是經典,買了後,第4章,講原理的那章,基本沒看懂。等學習演算法有一定理解後,再加上研讀原始碼,才基本把第4章理解,因為不管如何,書籍總是比原始碼要容易理解。
在《精通》一書中,講了NFA和DFA的區別。那oz的regex.c究竟是NFA還是DFA呢?
我們把re_pmatch子程式拿出來。
static char *
pmatch(char  *lp,CHAR *ap)
{
    while((op=*ap++) !=END) 
        switch(op) {
        case CHR:
            if (*lp++!=*ap++)
                return 0;
            break;
        …………
        }

}
ap指向的是編譯後的正則表示式中間程式碼,此時是讀中間程式碼,再與檔案進行匹配。因此時,正則表示式主導匹配過程的,是NFA,而ruby0.49中的正則表示式是DFA的,因為它的那個表的名字是DFA.哈哈哈!
其實,因為ruby0.49中的正則表示式我沒看懂,但應該是文字主導的。也許我要去讀ruby0.49中的原始碼的。但我覺得,這個oz的程式碼,真漂亮。