1. 程式人生 > >ruby0.49 regex.c原始碼分析2

ruby0.49 regex.c原始碼分析2

ruby0.49 regex.c原始碼分析
今天發現自己的C語言學得還是不夠好。上回說靜態變數,其實是我沒有理解。
void test()
{
    static int done=0;
    done+=1;
    printf("%d\n",done);
}
int main()
{
    int i;
    for(i=0;i<3;i++)
        test();
    return 0;
}
寫了一段程式,來測試靜態變數,發現只有第一次會設定,以後變數值就會儲存下來。
今天分析regex.c中測試程式,struct re_pattern_buffer這個結構體相當重要,我想檢視其詳細定義,結果跑到coreutils-4.5.1中去了,因為我原來在.vimrc中只加了coreutils的tags,於是又把ruby的加進去。
再分析這個結構體的定義,發現就是幾個整數和幾個字串指標,其中字串指標是可以動態增加的。這幾個字元針指所指向內容的含義我沒有理解。這要分析用正則表示式匹配字串時的自動機演算法了。
另外,fastmap[]陣列也很有意思,這個fastmap到底是如何用於正則表示式的呢?頭痛。因為對程式沒有一個巨集觀的理解。就象在地球上看星星一樣,這個星星到底多大,我完全不知曉。
因為win10下,用ubuntu,只能用命令列,不能用圖形介面。所以就裝了分屏軟體tmux,可自己忘記了如何分屏,於是百度。
ctrl+b  % 
ctrl+b 箭頭
自己用工具還是不熟練呀。
今天算是把正則表示式的測試方法學會了。可本質上最困難的,問題的核心是究竟如何匹配,匹配的原理,我帶沒摸到。
上次讀一個人寫的grep的正則匹配程式,是利用了遞迴。也是先對正則表示式進行翻譯,把正則表示式變成一種中間語言,在匹配時,再利用這種中間語言進行匹配。我看regex.c中的好象更細。也許,regex.c中用的是確定型自動機演算法DFA,而那個grep的可能用的是NFA.
對編譯原理沒學好,那個自動機演算法沒學好,把NFA轉為DFA的演算法沒看懂。
我總喜歡對事物有了個基本的概念後,再由大的框架進入細節。這個regex.c讓我有種失控的感覺。很是讓人糾結。也許還是先讀那個論文吧。