深入浅出编译原理-6-一个完整的编译器前端的代码实现

引言

   编译原理的学习是一个痛苦并快乐的过程 。

经过前面的内容,我们知道了,语言,语法,文法,产生式,推导,语法分析树,语素,词法单元,中间表示,等等等等,这些概念以及他们之间的区别和联系,这一小节就展示一个完整的编译器的前端的代码实现。由简至繁,通过了解这个简单的编译器的前端实现,可以对编译器的工作原理有较好的理解。为下一步的优化技术打下很好的基础。

编译原理学起来很难,他涉及到很多领域的知识和内容。可是编译器就是这么多复杂事物的结合体。就像人一样,人,有很多面,只有把这些面连接起来看,才能真正地了解这个人。编译原理包含很多内容,可是,编译器就一个,他是一个整体。先看一下整体,有一个整体的印象,然后各个击破,可能会容易接受一些。


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语言版的。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值