[C] 编译的学习和实践日志五[考试归来话正则]
2009-10-30 19:25
204 查看
当下定决心去做一件事情的时候,就没有什么可以阻挡我!譬如去睡觉--! from 《觉主语录》
令我忐忑不安的高数学位证考试过去了,结果还是满意的。虽然花了3周的时间去准备复习数学,但是我却发现,真正去学习的时候只有最后那两天,以往的时间全是浪费掉了。遂明
白,为什么同一种环境下的人,有的成了天才,有的沦为平庸。
终于可以比较放心的继续编译了。《编译原理》看到了第三章,词法分析,目前需要值得注意的应该是正则表达式(这个版本的书上翻译为正规表达式,难道别的表达式都不正规么?)有几个分析出来的要点:
1、文法和正则表达式合起来可以表示一段语言的规则,其中文法用来表示的语法,而正则表示的词法。也就是说文法的最小单位是词,正则的最小单位是字。这样可以有效地把词法和语法分别开来。
2、正则和文法也不是万能的。书中说正则不能处理嵌套或均衡的结构,举得例子是配对的括号。我想的具体例子例是html的标签例如斜体<i>something</i>这个标签如果定义为标识tag的话,里面的something也可能是tag,这样就同级嵌套,正则是不能表达的(正则只能嵌套以前定义的标识)。而文法就没有这个要求,故文法可以表示。还有一个很疑惑的是书中说重复的符号串不能用正则,例如集合A{wcw|w是a和b组成的串},这个也不能用文法。但是我想如果这样定义:
也应该没问题啊。不过A表示的是wcw而不是集合{wcw},这样有什么问题呢?暂时还没想明白,待高人指点。
这块内容书上写的真像离散数学。。(还好我欠缺的是解数学题的技巧,而各种定义和其意义还是比较明白的)
还有需要注意的是记号的二元组表示方法<记号名,记号属性>这个在编译器记录词的时候用到。双缓冲区,就是编译器读入源文件的时候每次读入N个字符,放到数组的前半部分,处理完之后再读入N各放入后半,处理完后半再读入放到前半。这样做的用途是在处理到第N个字符时,这个词还没结束,必须要读入后续的部分,但是如果仅有一个缓冲的话,会把串覆盖掉,于是需要双缓冲。
上篇日志写得机制和策略的分离(语言规则和处理语言规则的过程分离)后来想了下yacc和lex不就是做的这些事情么。好的工具果然蕴含着深厚的哲理阿。。
还有一本《C语言标准与实现》也看了不少,主要是讲操作系统和C程序的交互过程,属于比较硬的东西,以后软的和硬的轮流写日志吧。
ps:明天就要选择毕业设计课题了,我知道,编译器,一定是我的!
davelv
2009-10-30日
令我忐忑不安的高数学位证考试过去了,结果还是满意的。虽然花了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日
相关文章推荐
- 编译的学习和实践日志五[考试归来话正则]
- 编译的学习和实践日志四[道路是曲折的]
- 编译的学习和实践日志一[Final Mission Start]
- 编译的学习和实践日志七[有穷自动机]
- 编译的学习和实践日志六[链接和库]
- 编译的学习和实践日志三[国庆节中的左递归]
- 编译的学习和实践日志七[有穷自动机]
- 编译的学习和实践日志六[链接和库]
- 编译的学习和实践日志二[我的目标是]
- 编译的学习和实践日志一[Final Mission Start]
- 编译的学习和实践日志四[道路是曲折的]
- 编译的学习和实践日志二[我的目标是]
- 编译的学习和实践日志三[国庆节中的左递归]
- hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse
- CentOS6.4下编译caffe深度学习框架实践!!!
- C++后台开发核心技术实践学习日志2017/5/11
- ClamAV学习【8】——64位Windows7下编译运行实践
- Linux学习日志(15)- 常用GCC编译控制选项
- Linux学习日志(8)- Linux 编译内核[scripts/kconfig/dochecklxdialog] 错误
- Linux学习日志(9)- Linux 编译内核配置(001-键盘操作)