今天羣裏討論grep正則時,用到了-P選項
查了下man
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression.
然後對grep的正則執行模式起了點興趣,繼續查看了grep的正則執行過程
還是從main函數開始,跟蹤grep的函數調用過程
1:函數調用路徑
在grep.c的main函數裏,開始時,對參數(相當多)進行了分析(略)
然後調用正則編譯函數
然後分別對每個文件,調用了grepfile函數,因此grep支持對多個文件進行操作(包括標準輸入)
grepfile對文件類型進行分析,然後調用grep函數
grep函數循環讀取(調用fillbuf)文件匹配(調用grepbuf)
grepbuf裏,有個match_offset指針,用於指針從左到右的偏移匹配
可以看出grepbuf調用了execute函數指針
execute即是執行正則的函數
2:正則模式設定
execute函數採用指針的形式,是因爲grep彩用了多種正則執行模式,用指針方便調用不同模式的正則匹配函數
execute函數指針在install_matcher函數裏賦值
這裏install_matcher就是在main裏分析不同參數是調用的,以指定採用哪種正則“matcher匹配器”?。
通過不同參數指定,並通過setmatcher函數指定matcher值
默認的matcher值是grep:
3:正則函數
正則在處理步驟上,大致可分成編譯和執行二個步驟:編譯正則表達式,執行正則表達式
上邊提到的函數指針
在install_matcher裏,設定了正則compile(編輯器?)與正則execute(執行器)
matchers數組,結構數組在search.c文件裏指定
默認爲Gcompile和EGexecute
相關函數定義:
這邊就是調用不同正則表達式編譯和解析函數了
以grep默認的Gcompilte和EGexecute爲例
Gcompilte事實上調用了dfa.c、dfa.h文件裏的正則編譯函數dfacomp
而EGexecute則是調用了正則查詢函數re_match,re_search
這二個函數在標準庫定義/usr/include/regex.h
而對於perl正則模式Pcompile,Pexecute則是調用了perl正則處理函數
這二個函數需要perl正則庫(pcre.h)支持
未了,對於正則具體的編譯和執行,待以後有空繼續研究