gnu gawk1.01原始碼分析 編譯
我不停的在網上找gawk的分析文章,可惜硬是找不到了。前幾天,就把gawk的使用進行系統的複習。基本上對gawk的使用算是入門了。
但原理呢?還是看**,讀《flex 與bison》後,對awk.y這個檔案基本有了了解,更可喜的是,在一台神舟的筆記本上,把程式編譯通過了,那個本子上裝的是win7 64位,但c編譯器裝的好象是另乙個gcc,我也迷糊,反正就折騰。
當時遇到bison編譯不通過時,就把bison重新安裝,發現就能使用了。真是奇怪。於是開始通讀原始碼。其中regex.c這個檔案使用的是dfa,我在網上找相關資料,可以沒有。這個匹配沒有使用遞迴演算法,真是看不懂,碰到對*的解析時,我在想,前面的字元如何處理的呢?看不懂。於是進行除錯,但結果也看不懂。還有什麼快速模式,真是麻煩。
在regex.h這個檔案中,定義了乙個結構體,儲存編譯後的正規表示式。
struct re_pattern_buffer ;
struct re_pattern_buffer 中,關鍵是對fastmap不理解,真心不理解,好象是若出現
[0-9]就翻譯成0123456789之類,再用到幾個關鍵的過程,先是
extern char *re_compile_pattern ();
編譯完後,再使用。
extern int re_search (), re_search_2 ();
那編譯後的正規表示式是什麼樣的,定義了乙個列舉型別的東西,如下所示:
enum regexpcode ;
關鍵是這個東西我理解不了,真不理解,原來介紹nfa時,那個網上介紹得真好,我可以讀文件理解**,而且較直觀,這個東西,真不知他為何這樣定義。搞了半天,看不懂,於是就跳過去。
心想,反正正規表示式的結果我知道,於是就跳過,開始讀awk.h
這個文件可真有難,其中有意思的是:
typedef enum nodetype ;
這個enum定義了乙個列舉型別,用來把程式中的一些運算子之類東西進行儲存,然後定義了乙個奇怪的結構體,我硬是沒看懂:
typedef struct exp_node r;
} nodep;
struct ar;
struct str;
awknum fltnum;
} sub;
} node;
這個結構體很奇怪。於是接著往下看,知道大概是把程式編譯後,儲存到裡面了。但如何構成乙個鍊錶呢?真是奇怪。
作者又定義了一系統的巨集,來簡化操作。如下:
#define lnode sub.nodep.lptr
#define rnode sub.nodep.r.rptr
#define subnode lnode
#define proc sub.nodep.r.pptr
而且再配套一系統的函式,進行結果的操作,如:
node *
newnode(ty)
nodetype ty;
反正,作者就是以這個node作為核心資料結構。
在awk1.c 中,慢慢看**,但我不知程式如何解釋,不知程式的大致走向。其中有乙個debug.c的檔案,再找到,在其中倒有意思。
print_a_node(ptr)
node *ptr; {
node *p1;
char *str,*str2;
int n;
hashnode *buc;
if(!ptr) return; /* don't print null ptrs */
switch(ptr->type) {
case node_number:
printf("%g",ptr->numbr);
return;
case node_string:
printf("\"%.*s\"",ptr->stlen,ptr->stptr);
return;
case node_times:
str="*";
goto pr_twoop;
看到沒,作者根據結點型別,分別進行列印。我想還是慢慢除錯時,再理解。讀程式,真要除錯才能讀懂。
今天唯一有成就感的,在windows下,vim看c **,注釋沒有變色,於是網上搜尋了很久,找到一句,
highlight comment ctermfg=green guifg=green
但加到vimrc中沒有效果,於是再到linux下折騰,發現linux下變色了,於是在linux下讀**。但linux下vim的**,不容易拷出來,複製到windows下,於是又在windows下找到awk相關**。讀**,真象在黑暗中瞎撞。想找人交流,在網上一搜,只看到我寫的幾篇爛文章,心想,我還是慢慢讀吧。
gnu gawk1 01原始碼分析
gnu gawk1.01原始碼分析 前段時間為了分析dfa實現正規表示式的原始碼,費盡心思。於是又轉而讀gawk的原始碼,這次發現竟然順暢很多了,現在有乙個關鍵的函式看不懂 interpret 程式把 awk f mm.awk file1 file2 file3 中mm.awk檔案中的原始碼讀入,進...
gawk1 01原始碼分析awk y衝突了
gawk1.01原始碼分析awk.y衝突了 yang desktop v9hs3b6 gawk101 gawk echo hello ok gawk begin hello ok 看到沒,單獨是可以執行的。但把awk指令寫到檔案中,再測試一下,其中t.awk內容如下 yang desktop v9h...
gawk1 01原始碼安裝 續
gawk1.01原始碼安裝 續 今天是個好天氣,我昨天發現有衝突,看了會書,還是不得要領,今天把衝突進行研究,發現 option 1,statements statements option 2,statements statement 選項1和選2只有乙個差異,就是分析語句 時,究竟是選擇 seg...