1. 程式人生 > >gawk1.1原始碼分析01

gawk1.1原始碼分析01

gawk1.1原始碼分析01
因為ruby0.49的程式碼量較多,而且其正則表示式的演算法和gawk的很像。於是,覺得還是先看gawk吧。畢竟對gawk也較熟悉,語言也較少,程式碼也少。應該是先有awk,perl,ruby等語言,先從源頭來理解吧。
但昨天編譯gawk1.1總是不成功。甚至修改awk.y還是不行。加上stdlib.h等標頭檔案又與其自身的malloc等檔案衝突,於是看自己以前是如何編譯的。自己以前,也沒寫詳細
於是,重新開啟一個新的ubuntu16.04,因為我以前為了學rails,新下了幾個ubuntu,安裝bison,再編譯,居然只是提醒bcmp_trans函式的使用在定義之前,於是把其定義程式碼挪到前面,再編譯,就成功了。
這裡,我說一下,我是用的三星筆記本,裝的win10,再在應用商店裡安裝ubuntu16.04,
    安裝make,gcc,bison
再wget http://mirrors.nju.edu.cn/gnu/gawk/gawk-1.01.tar.gz
tar -zxvf gawk-1.01.tar.gz
編譯sudo make
修改bcmp_trans的定義
再sudo make
就在當前目錄下生成了gawk檔案,就可以折騰了。
先看awk.h,其中有一個超級難的結構體,反正沒看懂,有一個enum,這個基本看懂了。
再看debug.c其中有一個nnames[]與enum中的定義完全一致。
再分析awk1.c找到如何進行除錯。
echo "this is" |./gawk '{print $1}'
echo "this is" |./gawk '{print $1}'
test02
this
我對awk1.c進行了修改,增加列印test02,這樣,可以邊修改邊分析原始碼了。
正則表示式先不看,反正只要會用就行了。而obstack.c好象是進行記憶體分析,也不管,而awk.y好象進行了語法分析,要學習bison用法,其關鍵在於bison如何與awk1.c進行協調。
現在看來,基本對awk的整體程式碼入門了。
上午,對awk1.c進行了初步的瀏覽,發現是把awk的原始碼讀進lexptr指向的字串中。再呼叫 yyparse(); 進行解析,不明白,好象,再把結果寫到 expression_value中去,真是頭痛,因為我對bison不熟悉,我要趕緊去學bison了。