当下定决心去做一件事情的时候,就没有什么可以阻挡我!譬如去睡觉--! 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日