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

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

不到1000行的正則表示式原始碼分析02
開始睡覺總是睡不著,過了好一會,睡著了。昨天好象做了一個夢,夢中,說西方不亮東方亮。而為什麼東方亮呢,大意是中國人喜歡以天下事為已任。忽然夢醒來了。
於是開了暖氣,接著讀程式碼。
今天的收穫很大。首先,把程式碼編譯成功。先讀下makefile,再進行編譯。
開啟grep.c檔案,這個檔案是入口。
先執行程式碼,如:
echo "fooooo" | ./ogrep "fo"
看著顯示的結果,再
把主要流程走一遍。
再修改列印語句,再編譯,再執行,看修改的結果是否生效。
總之,比我在kindle上看程式碼,效果好多了。當然不能說紙上讀程式碼沒有收穫。但程式碼本質是調出來的。通過除錯,能有直觀印象。而且,對程式碼修改,編譯,再執行後,看到修改的結果,就相當於自己在重寫程式。這個效果就高多了。
grep.c流程是:
先判斷引數個數
再把輸入的查詢串,當成正則表示式進行編譯
再調symbolic進行列印編譯結果
再判斷,如果有傳入檔案,
    先開啟檔案
    再調load一行行的讀檔案
        用編譯後的結果,判斷該行是否與正則表示式匹配
---------
主要流程走完了,就跳到symbolic中,分析其列印結果是如何出來的?
其實regex.c開頭,提供了一些測試例子。不過,當我想執行這些例子時,只有
foo\\+
結果是:
CHR f 
CHR o
CHR o
CHR +
當時以為是程式的bug,後來想是否+也要轉義,於是改為:
foo\\\+
就出現了CCL。事非經過不知難呀。
而且那個部落格中的帥哥的英語很好,他參考了很多英語文件中的內容。
我呢,就把這些例子一個個的測試。象
echo "foooooo" | ./ogrep "foo*.*"
再分析列印結果,再對照著讀程式碼。
不得不說,作者寫得真是漂亮,在這些牛人面前,我越加自卑了。我真寫不出這樣漂亮的程式碼。象
nfadump(CHAR *ap)
{
    while (*ap !=END)
        switch(*ap++) {
            case CLO:
                printf("CLOSURE");
                nfadump(ap);
…………
    這段程式碼沒法從vim中拷出來,是手擊出來的,看到那個遞迴沒有。我對遞迴一直用得不好。此時,對著
echo "foooooo" | ./ogrep "foo[1-9]"
我想象不出程式碼的執行過程,該死的遞迴。
想了半天,估計可以是分析foo[進入下層遞迴,下層讀完1-9,再返回。
另外,為了表示字符集,作者用到了位操作,對位操作也不熟悉,但感覺作者寫得真漂亮。
我真是由衷的佩服。
高山仰止,景行行止,雖不能至,然嚮往之!
這些高人,太厲害了。