先分析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个值进去呀?
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码,不然真看不懂。
基础差呀,读代码就发现自己不懂的地方太多。
我想,我还要复习一下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码,不然真看不懂。
基础差呀,读代码就发现自己不懂的地方太多。