gawk1.01 regex.c 源码分析2

107 篇文章 1 订阅
32 篇文章 0 订阅
先分析regex.c这个文件,因为我想弄明白,到底谁负责资源的释放。
re_compile_pattern
负责把正则表达式翻译为内部格式。
p指向正则表达式,p_end指向正则表达式的末尾。有一个大循环
while (p 《》p_end)
 获致p 当前所指字符到c
 如果c='$'
  把'endline'推进去。
 如果c='^'
  把'begline'推进去。
 如果c='*','+','?'
  设置两个变量zero_times_ok,many_times_ok
  给它们赋值。
  好象若遇到*后,再接着向下读,如果下一个不是*,就吐出来一个。
  很搞的两个函数store_jump,store_jump不知是什么意思?
 如果c='.'
  把'anychar'推进去
 如果c='['
  给laststart赋值。为不明白这个变量的用途。
  然后 如果下一字符为^,就推 'charset_not,
   否则,推'charset'
  再推一个字节。
  在字节中,把相关字符的标志位打开。这个没看懂。
  下面一个b[-1]的用途,更不明白。
 如果c='('
  推'start_memory'
  推regnum
  但后面把stackp当栈来使用,没看懂。
 如果c=')'
  推'stop_memory'
  推stackp[-1]
  为何stackp -=2就可以了呢?推了4个值进去呀?
不写了,就这么一个玩意儿,不太好看。
我想,我还要复习一下ascii码。因为作者喜欢操作它。而且我把翻译后的正则表达式打印出来,我也看不懂,你看?
my_regex
[0-9]+
\010\003\000\005\015\000\012\010\000\000\000\000\000\000\377\003\007\360\377
40 allocated, 19 used.
Allowed by fastmap: 0123456789
ykl test:
buf is :
----------------
\010\003\000\005\015\000\012\010\000\000\000\000\000\000\377\003\007\360\377
40 allocated, 19 used.
Allowed by fastmap: 0123456789
Allowed by translate: \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
fastmap is accurate
can  be null
----------1234567888 hello
Match value 10.
对打印出来的结果看不明白,因为
printchar (c)
     char c;
{
  if (c < 041 || c >= 0177) /*这是什么意思呀?? */
    {
      putchar ('\\');
      putchar (((c >> 6) & 3) + '0');
      putchar (((c >> 3) & 7) + '0');
      putchar ((c & 7) + '0');
    }
  else
    putchar (c);
}
又是二进制操作,感觉还是要理解ascii码,不然真看不懂。
基础差呀,读代码就发现自己不懂的地方太多。



  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值