不到1000行的正则表达式源码分析02

不到1000行的正则表达式源码分析02
开始睡觉总是睡不着,过了好一会,睡着了。昨天好象做了一个梦,梦中,说西方不亮东方亮。而为什么东方亮呢,大意是中国人喜欢以天下事为已任。忽然梦醒来了。
于是开了暖气,接着读代码。
今天的收获很大。首先,把代码编译成功。先读下makefile,再进行编译。
打开grep.c文件,这个文件是入口。
先执行代码,如:
echo "fooooo" | ./ogrep "fo"
看着显示的结果,再
把主要流程走一遍。
再修改打印语句,再编译,再执行,看修改的结果是否生效。
总之,比我在kindle上看代码,效果好多了。当然不能说纸上读代码没有收获。但代码本质是调出来的。通过调试,能有直观印象。而且,对代码修改,编译,再执行后,看到修改的结果,就相当于自己在重写程序。这个效果就高多了。
grep.c流程是:
先判断参数个数
再把输入的查询串,当成正则表达式进行编译
再调symbolic进行打印编译结果
再判断,如果有传入文件,
    先打开文件
    再调load一行行的读文件
        用编译后的结果,判断该行是否与正则表达式匹配
---------
主要流程走完了,就跳到symbolic中,分析其打印结果是如何出来的?
其实regex.c开头,提供了一些测试例子。不过,当我想执行这些例子时,只有
foo\\+
结果是:
CHR f 
CHR o
CHR o
CHR +
当时以为是程序的bug,后来想是否+也要转义,于是改为:
foo\\\+
就出现了CCL。事非经过不知难呀。
而且那个博客中的帅哥的英语很好,他参考了很多英语文档中的内容。
我呢,就把这些例子一个个的测试。象
echo "foooooo" | ./ogrep "foo*.*"
再分析打印结果,再对照着读代码。
不得不说,作者写得真是漂亮,在这些牛人面前,我越加自卑了。我真写不出这样漂亮的代码。象
nfadump(CHAR *ap)
{
    while (*ap !=END)
        switch(*ap++) {
            case CLO:
                printf("CLOSURE");
                nfadump(ap);
…………
    这段代码没法从vim中拷出来,是手击出来的,看到那个递归没有。我对递归一直用得不好。此时,对着
echo "foooooo" | ./ogrep "foo[1-9]"
我想象不出代码的执行过程,该死的递归。
想了半天,估计可以是分析foo[进入下层递归,下层读完1-9,再返回。
另外,为了表示字符集,作者用到了位操作,对位操作也不熟悉,但感觉作者写得真漂亮。
我真是由衷的佩服。
高山仰止,景行行止,虽不能至,然向往之!
这些高人,太厉害了。
 

猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/86092156