gawk1.01源码大体结构分析

gawk1.01源码大体结构分析
昨天找gawk的选项,因为我想分析其调试过程。我想根据其debug的过程,来分析程序。发现在awk1.c中有-D选项,试一下,结果出现一大堆:
yang@DESKTOP-V9HS3B6:~/gawk101/gawk$ echo "ok" |./gawk '{print $0}'
ok
yang@DESKTOP-V9HS3B6:~/gawk101/gawk$ echo "ok" |./gawk -D '{print $0}'
Starting parse
Entering state 0
Reducing stack 0 by rule 51 (line 264):
-> $$ = nterm optional_newlines ()
Entering state 2
Reading a token: Next token is token '{' ()
Reducing stack 0 by rule 5 (line 124):
-> $$ = nterm pattern ()
Entering state 20
Next token is token '{' ()
Shifting token '{' ()
Entering state 44
Reading a token: Next token is token LEX_PRINT ()
Reducing stack 0 by rule 26 (line 194):
-> $$ = nterm whitespace ()
Entering state 76
Next token is token LEX_PRINT ()
Shifting token LEX_PRINT ()
Entering state 103
Reducing stack 0 by rule 39 (line 220):
-> $$ = nterm $@3 ()
Entering state 123
Reading a token: Next token is token '$' ()
Shifting token '$' ()
Entering state 17
Reading a token: Next token is token NUMBER ()
Shifting token NUMBER ()
Entering state 35
Reducing stack 0 by rule 87 (line 357):
   $1 = token NUMBER ()
-> $$ = nterm v_exp ()
Entering state 41
Reducing stack 0 by rule 97 (line 383):
   $1 = token '$' ()
   $2 = nterm v_exp ()
-> $$ = nterm variable ()
Entering state 23
Reading a token: Next token is token NEWLINE ()
Reducing stack 0 by rule 68 (line 314):
   $1 = nterm variable ()
-> $$ = nterm exp ()
Entering state 62
Next token is token NEWLINE ()
Reducing stack 0 by rule 58 (line 290):
   $1 = nterm exp ()
-> $$ = nterm expression_list ()
Entering state 141
Next token is token NEWLINE ()
Reducing stack 0 by rule 53 (line 272):
-> $$ = nterm redirection ()
Entering state 152
Next token is token NEWLINE ()
Shifting token NEWLINE ()
Entering state 119
Reducing stack 0 by rule 51 (line 264):
-> $$ = nterm optional_newlines ()
Entering state 139
Reading a token: Next token is token '}' ()
Reducing stack 0 by rule 24 (line 186):
   $1 = token NEWLINE ()
   $2 = nterm optional_newlines ()
-> $$ = nterm statement_term ()
Entering state 163
Reducing stack 0 by rule 40 (line 219):
   $1 = token LEX_PRINT ()
   $2 = nterm $@3 ()
   $3 = nterm expression_list ()
   $4 = nterm redirection ()
   $5 = nterm statement_term ()
-> $$ = nterm statement ()
Entering state 109
Reducing stack 0 by rule 22 (line 179):
   $1 = nterm statement ()
-> $$ = nterm statements ()
Entering state 108
Next token is token '}' ()
Shifting token '}' ()
Entering state 130
Reducing stack 0 by rule 21 (line 174):
   $1 = token '{' ()
   $2 = nterm whitespace ()
   $3 = nterm statements ()
   $4 = token '}' ()
-> $$ = nterm action ()
Entering state 45
Reading a token: Next token is token NEWLINE ()
Shifting token NEWLINE ()
Entering state 77
Reducing stack 0 by rule 51 (line 264):
-> $$ = nterm optional_newlines ()
Entering state 112
Reading a token: Now at end of input.
Reducing stack 0 by rule 4 (line 118):
   $1 = nterm pattern ()
   $2 = nterm action ()
   $3 = token NEWLINE ()
   $4 = nterm optional_newlines ()
-> $$ = nterm rule ()
Entering state 19
Reducing stack 0 by rule 2 (line 111):
   $1 = nterm rule ()
-> $$ = nterm program ()
Entering state 18
Now at end of input.
Reducing stack 0 by rule 1 (line 106):
   $1 = nterm optional_newlines ()
   $2 = nterm program ()
-> $$ = nterm start ()
Entering state 1
Now at end of input.
Shifting token $end ()
Entering state 3
Cleanup: popping token $end ()
Cleanup: popping nterm start ()
Found a rule:22492340
Statements:22492316
PRINT:22492316
var_type ref:22492268
DATA:22504512
ok
yang@DESKTOP-V9HS3B6:~/gawk101/gawk$
这么多内容,我的博客都可以不用写了。有凑字数之嫌。
我原来开发时,觉得根据作者的日志是可以很快的理解程序的。但这个日志太长了。
于是,还是读源码吧。我的想法是,如果能把NODE结果的内容打印出来,就好了。
       可是这个要求达不到呀。
昨天做了一个梦,大意是深圳修了一段高铁,因为技术发展太快,以至于当时一流的技术居然落伍了。此时,大家就开始批评了,此时,有人就讲,这也是一流的设计。等等。
        也许正切合了我此时,读代码的心情。
        gawk1.01的文件很少。
        awk1.c是程序的主循环。实现把文件打开,分成$0,$1等字段变量,并调bison其它函数进行程序分析。
        awk2.c主要是按编译的程序,对每行文件进行处理。
        awk3.c主要是一些内部函数的代码。
        awk.y是语法文件。
        debug.c是用于进行调试的。我想打印一个NODE在这里。
        obstack.c是用于分配内存的。
        regex.c是正则表达式包。
        awk.h是分析树结点的定义。
早上一醒来,就在床上想,代码的整体结构,因为我现在把软件编译通过了,我可以对之修改,反映我的理解。太爽了。
        x=3
        x++
        print x
       我想,每次增加10,可以呀,修改程序awk2.c中354行:
     assign_number(lhs,force_number(*lhs) + (tree->type==Node_preincrement ?
           10.0 : -1.0));
     想增加多少就改为多少。真是太爽了。
     我以为,象读小说一样读源码,先把主要情节想清楚,慢慢由粗到细,看不懂的,就大胆的跳过去。等后面理解了,再读前面的。我又把awk1.c
     awk2.c通读了一次,感觉真爽。我写不出来,但可以理解,发现高人,是如何写作的。我甚至想,我要建立一个git账号,把代码上传到服务器,这样每个本子上的代码就一致了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章