ruby0.49 regex.c源码分析
今天发现自己的C语言学得还是不够好。上回说静态变量,其实是我没有理解。
void test()
{
static int done=0;
done+=1;
printf("%d\n",done);
}
int main()
{
int i;
for(i=0;i<3;i++)
test();
return 0;
}
写了一段程序,来测试静态变量,发现只有第一次会设置,以后变量值就会保存下来。
今天分析regex.c中测试程序,struct re_pattern_buffer这个结构体相当重要,我想查看其详细定义,结果跑到coreutils-4.5.1中去了,因为我原来在.vimrc中只加了coreutils的tags,于是又把ruby的加进去。
再分析这个结构体的定义,发现就是几个整数和几个字符串指针,其中字串指针是可以动态增加的。这几个字符针指所指向内容的含义我没有理解。这要分析用正则表达式匹配字串时的自动机算法了。
另外,fastmap[]数组也很有意思,这个fastmap到底是如何用于正则表达式的呢?头痛。因为对程序没有一个宏观的理解。就象在地球上看星星一样,这个星星到底多大,我完全不知晓。
因为win10下,用ubuntu,只能用命令行,不能用图形界面。所以就装了分屏软件tmux,可自己忘记了如何分屏,于是百度。
ctrl+b %
ctrl+b 箭头
自己用工具还是不熟练呀。
今天算是把正则表达式的测试方法学会了。可本质上最困难的,问题的核心是究竟如何匹配,匹配的原理,我带没摸到。
上次读一个人写的grep的正则匹配程序,是利用了递归。也是先对正则表达式进行翻译,把正则表达式变成一种中间语言,在匹配时,再利用这种中间语言进行匹配。我看regex.c中的好象更细。也许,regex.c中用的是确定型自动机算法DFA,而那个grep的可能用的是NFA.
对编译原理没学好,那个自动机算法没学好,把NFA转为DFA的算法没看懂。
我总喜欢对事物有了个基本的概念后,再由大的框架进入细节。这个regex.c让我有种失控的感觉。很是让人纠结。也许还是先读那个论文吧。