编译的学习和实践日志五[考试归来话正则]

 当下定决心去做一件事情的时候,就没有什么可以阻挡我!譬如去睡觉–! from 《觉主语录》

令我忐忑不安的高数学位证考试过去了,结果还是满意的。虽然花了3周的时间去准备复习数学,但是我却发现,真正去学习的时候只有最后那两天,以往的时间全是浪费掉了。遂明
白,为什么同一种环境下的人,有的成了天才,有的沦为平庸。
终于可以比较放心的继续编译了。《编译原理》看到了第三章,词法分析,目前需要值得注意的应该是正则表达式(这个版本的书上翻译为正规表达式,难道别的表达式都不正规么?)有几个分析出来的要点:
1、文法和正则表达式合起来可以表示一段语言的规则,其中文法用来表示的语法,而正则表示的词法。也就是说文法的最小单位是词,正则的最小单位是字。这样可以有效地把词法和语法分别开来。
2、正则和文法也不是万能的。书中说正则不能处理嵌套或均衡的结构,举得例子是配对的括号。我想的具体例子例是html的标签例如斜体<i>something</i>这个标签如果定义为标识tag的话,里面的something也可能是tag,这样就同级嵌套,正则是不能表达的(正则只能嵌套以前定义的标识)。而文法就没有这个要求,故文法可以表示。还有一个很疑惑的是书中说重复的符号串不能用正则,例如集合A{wcw|w是a和b组成的串},这个也不能用文法。但是我想如果这样定义:

  w -> (a|b)*
     A -> wcw

也应该没问题啊。不过A表示的是wcw而不是集合{wcw},这样有什么问题呢?暂时还没想明白,待高人指点。
这块内容书上写的真像离散数学。。(还好我欠缺的是解数学题的技巧,而各种定义和其意义还是比较明白的)
还有需要注意的是记号的二元组表示方法<记号名,记号属性>这个在编译器记录词的时候用到。双缓冲区,就是编译器读入源文件的时候每次读入N个字符,放到数组的前半部分,处理完之后再读入N各放入后半,处理完后半再读入放到前半。这样做的用途是在处理到第N个字符时,这个词还没结束,必须要读入后续的部分,但是如果仅有一个缓冲的话,会把串覆盖掉,于是需要双缓冲。
上篇日志写得机制和策略的分离(语言规则和处理语言规则的过程分离)后来想了下yacc和lex不就是做的这些事情么。好的工具果然蕴含着深厚的哲理阿。。
还有一本《C语言标准与实现》也看了不少,主要是讲操作系统和C程序的交互过程,属于比较硬的东西,以后软的和硬的轮流写日志吧。
ps:明天就要选择毕业设计课题了,我知道,编译器,一定是我的!

davelv

2009-10-30日


相关博文

This entry was posted in 程序设计, 编译与语言 and tagged , . Bookmark the permalink.

22 Responses to 编译的学习和实践日志五[考试归来话正则]

  1. xy_hhl says:

    学习很认真啊。你是大四学生吗?

  2. davelv says:

    <div class="quote"><span class="q"><b>西安邮电学院 胡海浪(C/C++学生)</b>: 学习很认真啊。你是大四学生吗?</span></div>谢谢夸奖,认真么?还可以吧。呵呵

    我是大四的,你呢?

  3. yujixi123 says:

    <div class="quote"><span class="q"><b>davelv(C/C++学生)</b>: 谢谢夸奖,认真么?还可以吧。呵呵

    我是大四的,你呢?</span></div>大四现在就开始琢磨毕业设计了吗   不找工作啦?

  4. xy_hhl says:

    <div class="quote"><span class="q"><b>davelv(C/C++学生)</b>: 谢谢夸奖,认真么?还可以吧。呵呵

    我是大四的,你呢?</span></div>我是大三的,

    那你们开始找工作了吧!

  5. davelv says:

    <div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 大四现在就开始琢磨毕业设计了吗   不找工作啦?</span></div>也在找阿,简历也投了几份了.两手准备嘛..

  6. yujixi123 says:

    <div class="quote"><span class="q"><b>davelv(C/C++学生)</b>: 也在找阿,简历也投了几份了.两手准备嘛..</span></div>边学习编译原理  边准备毕业设计  边找工作?

  7. davelv says:

    <div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 边学习编译原理  边准备毕业设计  边找工作?</span></div>呵呵,是这样子的…^^

  8. yujixi123 says:

    <div class="quote"><span class="q"><b>CAS davelv(C/C++学生)</b>: 呵呵,是这样子的…^^</span></div>那可忙得够呛啊  不过 我纳闷儿  你们编译原理怎么大四才上呢  我数学系的 大三  正上着呢

  9. davelv says:

    <div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 那可忙得够呛啊  不过 我纳闷儿  你们编译原理怎么大四才上呢  我数学系的 大三  正上着呢</span></div>学校没开这门课,自己学的…其实也不忙,摆好心态,就好了..

  10. RPNP_HUA says:

    不好意思,一不小心把你的博客看完咯。
    编译器离我好遥远,还是先学好数据结构咯。
    向你学习,加油。

  11. davelv says:

    谢谢您的访问,一起努力吧

  12. 自学。。哈哈

  13. kshaoye says:

    27篇……花了多久看完?

  14. yujixi123 says:

    w -> (a|b)*

    A -> wcw

    怎么理解这个呢?说它是文法?说它是正则表达式?

  15. davelv says:

    <div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: w -> (a|b)*

    A -> wcw

    怎么理解这个呢?说它是文法?说它是正则表达式?</span></div>可以当成正则来看,为什么不可以呢?

  16. yujixi123 says:

    <div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 可以当成正则来看,为什么不可以呢?</span></div>(a|b)*固然是正则   A -> wcw这个呢

  17. davelv says:

    <div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: (a|b)*固然是正则   A -> wcw这个呢</span></div>这个不可以是正则么?请指教

  18. yujixi123 says:

    <div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 这个不可以是正则么?请指教</span></div>指教不敢当  我觉得不是正则表达式  根据正则表达式的递归定义   怎么着也不会有—>这种在

    文法中表达推导关系的符号啊   我也不知道理解的对不对啊

  19. davelv says:

    那不用递推关系

    (a|b)*c(a|b)*是不是可以表示那个式子呢。

    我把这里的*当成+来使用了。不过没有关系

  20. yujixi123 says:

    <div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 可以当成正则来看,为什么不可以呢?</span></div>这玩意儿一两句还真说不清楚   正则表达式作为一种数学工具被用来(是不是只能用来  我不知道)

    描述单词的  引入包含推导关系的符号  何必呢?你能解释一下为什么(或者说)怎么把它看成正则吗

  21. davelv says:

    <div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 这玩意儿一两句还真说不清楚   正则表达式作为一种数学工具被用来(是不是只能用来  我不知道)

    描述单词的  引入包含推导关系的符号  何必呢?你能解释一下为什么(或者</span></div>推导是分步定义,而我们常用的正则都是经过别人定义好的,直接拿来用的。

  22. yujixi123 says:

    <div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 推导是分步定义,而我们常用的正则都是经过别人定义好的,直接拿来用的。</span></div>看来  我的理解还很浅薄  呵呵

发表评论

电子邮件地址不会被公开。 必填项已用*标注