当下定决心去做一件事情的时候,就没有什么可以阻挡我!譬如去睡觉–! 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日
学习很认真啊。你是大四学生吗?
<div class="quote"><span class="q"><b>西安邮电学院 胡海浪(C/C++学生)</b>: 学习很认真啊。你是大四学生吗?</span></div>谢谢夸奖,认真么?还可以吧。呵呵
我是大四的,你呢?
<div class="quote"><span class="q"><b>davelv(C/C++学生)</b>: 谢谢夸奖,认真么?还可以吧。呵呵
我是大四的,你呢?</span></div>大四现在就开始琢磨毕业设计了吗 不找工作啦?
<div class="quote"><span class="q"><b>davelv(C/C++学生)</b>: 谢谢夸奖,认真么?还可以吧。呵呵
我是大四的,你呢?</span></div>我是大三的,
那你们开始找工作了吧!
<div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 大四现在就开始琢磨毕业设计了吗 不找工作啦?</span></div>也在找阿,简历也投了几份了.两手准备嘛..
<div class="quote"><span class="q"><b>davelv(C/C++学生)</b>: 也在找阿,简历也投了几份了.两手准备嘛..</span></div>边学习编译原理 边准备毕业设计 边找工作?
<div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 边学习编译原理 边准备毕业设计 边找工作?</span></div>呵呵,是这样子的…^^
<div class="quote"><span class="q"><b>CAS davelv(C/C++学生)</b>: 呵呵,是这样子的…^^</span></div>那可忙得够呛啊 不过 我纳闷儿 你们编译原理怎么大四才上呢 我数学系的 大三 正上着呢
<div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 那可忙得够呛啊 不过 我纳闷儿 你们编译原理怎么大四才上呢 我数学系的 大三 正上着呢</span></div>学校没开这门课,自己学的…其实也不忙,摆好心态,就好了..
不好意思,一不小心把你的博客看完咯。
编译器离我好遥远,还是先学好数据结构咯。
向你学习,加油。
谢谢您的访问,一起努力吧
自学。。哈哈
27篇……花了多久看完?
w -> (a|b)*
A -> wcw
怎么理解这个呢?说它是文法?说它是正则表达式?
<div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: w -> (a|b)*
A -> wcw
怎么理解这个呢?说它是文法?说它是正则表达式?</span></div>可以当成正则来看,为什么不可以呢?
<div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 可以当成正则来看,为什么不可以呢?</span></div>(a|b)*固然是正则 A -> wcw这个呢
<div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: (a|b)*固然是正则 A -> wcw这个呢</span></div>这个不可以是正则么?请指教
<div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 这个不可以是正则么?请指教</span></div>指教不敢当 我觉得不是正则表达式 根据正则表达式的递归定义 怎么着也不会有—>这种在
文法中表达推导关系的符号啊 我也不知道理解的对不对啊
那不用递推关系
(a|b)*c(a|b)*是不是可以表示那个式子呢。
我把这里的*当成+来使用了。不过没有关系
<div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 可以当成正则来看,为什么不可以呢?</span></div>这玩意儿一两句还真说不清楚 正则表达式作为一种数学工具被用来(是不是只能用来 我不知道)
描述单词的 引入包含推导关系的符号 何必呢?你能解释一下为什么(或者说)怎么把它看成正则吗
<div class="quote"><span class="q"><b>南航 喜际余(C/C++学生)</b>: 这玩意儿一两句还真说不清楚 正则表达式作为一种数学工具被用来(是不是只能用来 我不知道)
描述单词的 引入包含推导关系的符号 何必呢?你能解释一下为什么(或者</span></div>推导是分步定义,而我们常用的正则都是经过别人定义好的,直接拿来用的。
<div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 推导是分步定义,而我们常用的正则都是经过别人定义好的,直接拿来用的。</span></div>看来 我的理解还很浅薄 呵呵