引言
编译原理的学习是一个痛苦并快乐的过程 。
经过前面的内容,我们知道了,语言,语法,文法,产生式,推导,语法分析树,语素,词法单元,中间表示,等等等等,这些概念以及他们之间的区别和联系,这一小节就展示一个完整的编译器的前端的代码实现。由简至繁,通过了解这个简单的编译器的前端实现,可以对编译器的工作原理有较好的理解。为下一步的优化技术打下很好的基础。
编译原理学起来很难,他涉及到很多领域的知识和内容。可是编译器就是这么多复杂事物的结合体。就像人一样,人,有很多面,只有把这些面连接起来看,才能真正地了解这个人。编译原理包含很多内容,可是,编译器就一个,他是一个整体。先看一下整体,有一个整体的印象,然后各个击破,可能会容易接受一些。
6.1源码
这个前端的源码来自“龙书”,我觉得,经过实际的阅读代码,可以搞清楚很多从书上看不到,或者看不懂的事情。
代码的内容,可通过下面的链接下载,我刚刚传上去的:
http://download.csdn.net/detail/rill_zhen/4464467
或者到官网下载:
http://dragonbook.stanford.edu/#source
使用方法:
编译:
tar xf dragon-front-source.tar
cd front
make
然后自己写个测试代码,
最后用这个编译器编译,生成中间代码。
6.2概念间关系
0》语言:从开始符号可以推导得到的所有串的集合。
1》语言的语法:语言的正确形式用语法来表示。
2》语法:语法通过文法来表示,对于程序语言,指上下文无关文法。
3》产生式:产生式是文法的具体形式。产生式由终结符和非终结符等组成,非终结符是由终结符组成的串。
4》编译:就是把源代码经过语法分析得到中间形式。
5》语法分析:根据文法,以源代码为输入,找出从文法开始符号推导出这个源代码的方法。
6》语法分析:还有一个定义,就是:根据文法,为源代码构建一颗语法分析树的过程,如果一个源代码可以从两棵树上获得,那么这个文法就有二义性,为了消除二义性,我们可以增加约束条件,比如设置结合性和优先级。
7》可以看到,上面的关系是一个圆,语言决定文法,文法定义语言。相生相克。语法分析就是你给我你写的c语言代码,我根据C语言的文法检查一下你写的是否符合规定。这里的‘我’,就是编译器。怎么检查呢,就是把你的代码构建一颗树,如果能构建成功,那么你写的就没有语法错误,然后我遍历这个树,就可以得到中间代码。
8》中间形式:有好多种,
抽象语法树(AST);
及其变体:有向无环图(DAG);
三地址码(TAC):四元式,三元式,间接三元式;
静态单赋值式(SSA)。
9》有了中间代码,就可以进行汇编了。当然还要考虑存储空间的管理,代码的优化等事情。代码优化真是无底洞啊。
6.3小结
仔细阅读这个代码,希望和大家交流阅读收获。这个是java写的,过一段时间我会弄一个相同功能的C语言版的。