不到1000行的正則表示式原始碼分析03
不到1000行的正則表示式原始碼分析03
https://www.cnblogs.com/plodsoft/p/5853945.html
plodsoft的文章寫得好,作者分析程式碼也很到位。可惜就是太少了。開始看到佩服得真不行。後到讀了原始碼,發現作者真是花了心思的。可以作者寫得太精彩,就沒有照顧到初學者那種在原始碼面前的糾結,那種掙扎和無奈。而我呢,就當是出醜吧,感覺分析原始碼,就是從不會到會,從無到有,因此這個分析的過程比結果更重要。
因此,本人寫得不好,沒關係,只要堅持下去,就會越來越好。而且記錄自己這種掙扎過程,很有意思。而且我的英語很差,很多時候都是直接分析原始碼,對原始碼有了理解後,再看註釋。發現作者的註釋寫得精闢。
我以為,原始碼分析,一定要讓讀者先從巨集觀上理解整體的處理流程,再慢慢由粗到細。
今天接著分析re_comp函式,這個函式完成正則表示式的翻譯工作,把源串,變成中間碼。開始通過讀grep.c的執行結果,對中間碼有了深刻的理解後,再看作者是如何把
fo[1-3]變為
chr f
chr o
clo bitset
之類。
作者分析過程基本瞭解,但其中有許多細節不理解。
象[]的處理是較難的。
象[0-9]變為0123456789
其中,為何:
c1=*(p-2)+1;
c2=*p++;
其中為何c1要加1,一直沒想明白,看plodsoft的解釋,也沒有想清楚。
對*+等量記的處理,尤其是處理+時,如
fm+
變為
fmm*
就是,把+變為*,但前面要重複一下,重複的這個過程,也沒看懂。
如果說,re_comp沒有用到遞迴,基本還能理解。但re_exec就有些不理解了。因為其中用到了遞迴。
pmatch也是遞迴函式,看來,要想學計算機有所成就,必須把遞迴搞懂。也許正是在這種角度上講,《計算機程式的構造和解釋》這本書才有其成為經典的價值。
這篇文章就是湊數了。我總覺得,要多產,然後求精品。《萬萬沒想到》中,作者講到,作家要多產,發明家要多產,因為產得多,其中出精品的機率就大。不是先高手再出精品,而是先大量生產,再其中有些成了精品。
而網際網路也一樣,先是象野草一樣自然成長,其中的精品自然出現了。如果我們只想到精品,大概網際網路也不會有今天的規模。
總之一句話,寫部落格,就是先要多寫,寫多了,自然水平也就上來了。