URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 1 » 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
 
 
 
 
 
 
Subject: 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
Author: onlyflyer1    Posted: 2007-10-15 16:52    Length: 2,766 byte(s)
[Original] [Print] [Top]
出于对编译技术的兴趣,小弟在十一期间完成了一个cminus的编译器(Qcc)。没有太大的难度,但还算完成的非常认真,代码可读性较好。希望能与各位大侠一起交流进步。
您可以通过以下方式获取Qcc的源代码
svn checkout http://cminus-compiler.googlecode.com/svn/trunk/ cminus-compiler

下面是关于cminus的一点说明:

关于Qcc:
CMINUS是C语言的一个子集,该语言的语法在《编译原理与实践》第九章附录中有详细的介绍。
C MINUS的语法非常容易使用EBNF进行重写,所以很适合使用递归下降的方法来分析。

写Qcc的初衷:
对编译技术一直很有兴趣,看了不少编译理论方面的书,也看了lcc大部分的源代码,所以一直很想真正的写一个编译器,来巩固一下学过的东西。于是利用十一放假的期间完成了这样一个小编译器。

Qcc的特点:
1,Qcc使用nasm作为后端,也就是说Qcc不直接生成机器代码,它产生能够供nasm使用的汇编代码,然后由nasm生成elf格式的obj文件,再进一步的由ld与glibc连接生成最终的可执行文件。
2,nasm最大的特点是在语法分析的过程中不生成语法树以及任何的中间数据结构,而是直接生成汇编代码。这样做的原因有三个方面:
首先,能够简化cminus的设计,使cminus的源代码非常容易读懂,在c代码和汇编代码中间只隔了薄薄一层的语意处理。如果你有时间去看看cminus的源代码的话,你会发现它非常清晰易懂。
其次,我看过不少编译器,包括lcc都是生成了语法树或者dag(有向无环图),感觉似乎所有的编译器都要去生成这样的中间结构。我不想按部就班的也作同样的事情,于是就进行了一下新的尝试。
最后,生成中间数据结构,最大的作用是为了进行代码优化以及实现跨平台(就像lcc那样)。但是Qcc作为一个简单的演示目的小编译器,并不考虑代码优化的部分,也不考虑能够生成其他平台的汇编代码。所以也就不生成语法树或者dag.

Qcc的实现:
1,Qcc使用lex来生成词法分析程序,请见scanner.l
2,Qcc的语法和语义处理部分在parser.c中。
3,Qcc的符号表管理在symbol.c中
4,Qcc的寄存器分配算法在reg.c中
5,主程序入口在main.c中
6,另外Qcc还包含了计算语法的first和follow集合的两个使用perl完成的脚本:first.pl,follow.pl。
7,关于cminus的EBNF语法请见rules.txt。我们可以使用first.pl和follow.pl来对语法进行处理,生成这个语法对应的first和follow集合。譬如 ./first.pl rules.txt first.txt
8,一些测试例子在sample目录中.

Qcc的使用方法:
make;chmod +x Qcc
./Qcc sample/sort.c

Qcc是一个perl脚本,它将完成目标程序的编译,链接以及执行。

TODO:
语法和语义检查的部分还需要进一步的完善。

onlyflyer@gmail.com


[Original] [Print] [Top]
Subject: Re: 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
Author: yjx_super    Posted: 2007-10-16 23:12    Length: 117 byte(s)
[Original] [Print] [Top]
呵呵,好东东呀,LZ好有决心。用bison写虽然快,但是不容易进行
错误处理,使用递归下降就方便多了,好好研究下先。
----
Out of your Window!
[Original] [Print] [Top]
Subject: Re: 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
Author: steven_known    Posted: 2007-10-27 01:24    Length: 70 byte(s)
[Original] [Print] [Top]
continue, 你怎么又开始研究 compiler 了,不是已经转向 OS 了,不如回来吧
----
我很大众
[Original] [Print] [Top]
Subject: Re: 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
Author: onlyflyer1    Posted: 2007-10-27 21:12    Length: 96 byte(s)
[Original] [Print] [Top]
谈不上研究,只是业余爱好。
“又开始研究 compiler 了”,这句话啥意思,兄台认错人了吧。:)
[Original] [Print] [Top]
Subject: Re: 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
Author: jesuszhu    Posted: 2007-10-28 11:45    Length: 46 byte(s)
[Original] [Print] [Top]
呃,那个啥,他不是给你回复的啊,看清楚。。。。
----
愿我来世,得菩提时,身如琉璃,内外明澈,净无瑕秽。
[Original] [Print] [Top]
Subject: Re: 一个使用递归下降方法实现的cminus编译器,使用nasm作为后端
Author: 1help1    Posted: 2008-04-16 11:59    Length: 45 byte(s)
[Original] [Print] [Top]
不错不错。学习一把。 好好补补编译方面的知识了
----
[Original] [Print] [Top]
« Previous thread
GDB MIPS record target 0.1.0发布 (其可令GDB支持反向执行调试)
CPU 与 编译器
1
Next thread »
gcc的是怎么处理这种情况的?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:06, cost 0.04040789604187 ms.