gawk1.01源码分析——进行调试2
今天读代码时,发现我对awk2.c中如何生成解析树的过程还是很模糊。于是想上网搜索资料。发现没有。于是,心想,没人写,那我就再接着写吧。不指望有多少人看,就当成是把自己分析源码的心得、想法进行总结。就当写日记一样。
以前读源码,因为编译不了,总是纸上谈兵,但读着读着,发现不行。因为我无法验证我的理解对不对?而且也没有人和我交流,那不行。还是要把程序编译成功,进行调试。这样才能真正的读懂代码。
当你不调试时,可以能代码的整体结构有一个了解,但不能达到深刻的理解。
于是,又找到以前修改过的gawk源码,再进行调试。
昨天学学bison,因为gawk1.01源码中awk.y这个文件总是报归约/归约冲突。
今天接着调试gawk源码。把debug.c中的读懂了。接着看awk.y,前面一段是bnf相关,关键是后面的处理。如下:
yylex()
{
如果要处理正则表达式,
很长一段逻辑,我省略了。
switch(c=*lexptr++) {
case 0:
等等
}
}
那个主要的处理逻辑,好象是进行了词法分析。人工写了flex能处理的那一段。
而awk2.c中把返回的词,进行分析后,写进语法树中。
对awk2.c这个没看懂。为了看懂它,我需要把bison用户手册学一遍。
前段时间有些想放弃读gawk1.01版本,心想,这个调不通,还不如干脆读版本呢,我的电脑上安装的gawk4.1.0版本,我从网上下载这个版本的源码,居然有5万多行,心想,算了,还是读1.01版本吧。
把1.01看懂后,就学着读ruby0.49版本。我现在发觉,matz肯定是通读了gawk的源码,因为ruby0.49的结构和gawk差不多。你看ruby中也有BEGIN,END块,在ruby0.49中,也是用bison进行语法分析,matz也象gawk一样,手工进行词法分析,没有用flex。等等。
前段时间读ruby
的一些gem,如algorithms0.6的源码,涉及到fib堆的算法,红黑树算法没看懂,其它的倒还是很流畅的。但对ruby到底如何运行的,还是不懂。于是就接着读matz写的《编译语言的设计与实现》,发现,作者写ruby的思路和gawk一样,感觉还是要读gawk的源码。
我真希望matz能出一本,详细介绍如何设计出ruby的书。