免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: onlyflyer
打印 上一主题 下一主题

一个使用递归下降方法实现的cminus编译器,使用nasm作为后端 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-16 14:11 |只看该作者
原帖由 converse 于 2007-10-16 14:06 发表
刚想加精,迟了

先去掉思一克这个,再加成原创精华。

论坛徽章:
0
12 [报告]
发表于 2007-10-16 15:16 |只看该作者
支持楼主!
不过我co不出来

论坛徽章:
0
13 [报告]
发表于 2007-10-16 15:17 |只看该作者
楼主的工作做的很好,很强!支持一下!

这里向你反馈几个问题:
1、flex的版本问题:
我使用的linux版本是Fedro Core,gcc 版本是4.1.0,flex版本是2.5.4。使用svn下载你的程序源代码后,在未作任何修改的情况下,编译出错:

  1. $ make
  2. gcc -c -g -Wall main.c -o main.o
  3. gcc -c -g -Wall parser.c -o parser.o
  4. gcc -c -g -Wall reg.c -o reg.o
  5. gcc -c -g -Wall symbol.c -o symbol.o
  6. flex -o scanner.c scanner.l
  7. flex: can't open scanner.c
  8. make: *** [scanner.c] 错误 1
复制代码

经过检查,发现问题:

  1. flex -o scanner.c scanner.l
复制代码

2.5.4的flex中,-o和scanner.c中不能有空格,改为如下:

  1. flex -oscanner.c scanner.l
复制代码


2、链接的问题
我把Makefile中:

  1. %.c : %.l
  2.         $(LEX) -o $@ $<
复制代码

改为:

  1. %.c : %.l
  2.         $(LEX) -o$@ $<
复制代码

发现最后链接时,仍然有错误:

  1. gcc -o cminus-compiler main.o  parser.o  reg.o  scanner.o  symbol.o  scanner.o
  2. scanner.o: In function `yylex':/tmp/cminus-compiler/scanner.c:573: multiple definition of `yyin'
  3. lex.yy.o:/tmp/cminus-compiler/lex.yy.c:572:第一次在此定义
  4. scanner.o: In function `yylex':/tmp/cminus-compiler/scanner.c:573: multiple definition of `yyout'
  5. lex.yy.o:/tmp/cminus-compiler/lex.yy.c:572:第一次在此定义
  6. scanner.o: In function `yylex':/tmp/cminus-compiler/scanner.c:582: multiple definition of `line_no'
  7. ....
复制代码

原因是scanner.o被链接了两次:
gcc -o cminus-compiler main.o  parser.o  reg.o  scanner.o  symbol.o  scanner.o

我把你的Makefile稍稍改了一下,才编译成功,以下是修改后的版本:

  1. CC = gcc
  2. LEX = flex
  3. CFLAGS = -g -Wall
  4. LDFLAGS =
  5. SOURCES := $(wildcard *.c)
  6. ifneq (scanner.c, $(wildcard scanner.c))
  7. SOURCES := $(SOURCES) scanner.c
  8. endif
  9. OBJS = $(patsubst %.c, %.o, $(SOURCES))

  10. TARGET = cminus-compiler
  11. all : $(OBJS)
  12.         $(CC) -o $(TARGET) $(OBJS) $(LDFLAGS)
  13. %.o : %.c
  14.         $(CC) -c $(CFLAGS) $< -o $@
  15. %.c : %.l
  16.         $(LEX) -o$@ $<
  17. clean:
  18.         rm -rf scanner.c
  19.         rm -rf $(OBJS)
  20.         rm -rf $(TARGET)
  21.         rm -rf *~
  22.         rm -rf core*
复制代码


PS:楼主工作了吗?在哪高就啊?希望能够继续增加cminus的功能,我们支持你!

[ 本帖最后由 DennisRitchie 于 2007-10-16 15:25 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2007-10-16 15:46 |只看该作者

无法co的请下载附件,解压完毕后

原帖由 flw2 于 2007-10-16 15:16 发表
支持楼主!
不过我co不出来

楼主的编译器包含两个可执行文件:
1、cminus-compiler:把c语言源文件翻译成nasm格式的汇编文件
2、Qcc:是一个perl脚本,首先调用cminus-compiler生成asm文件,然后调用nasm生成obj文件,最后调用gcc把obj文件和c库链接生成最终的可执行文件。

无法co的请下载附件,解压完毕后
1、编译生成可执行文件cminus-compiler

  1. $ make
复制代码

2、测试Qcc

  1. $ ./Qcc sample/sort.c

  2. 输出为:
  3. 0
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. 6
  10. 7
  11. 8
  12. 9
复制代码

3、观看cminus-compiler汇编输出

  1. $ ./cminus-compiler -o sample/sort.asm -f sample/sort.c
  2. $ vi sample/sort.asm
复制代码

[ 本帖最后由 DennisRitchie 于 2007-10-16 15:56 编辑 ]

cminus-compiler.tar.gz

39.04 KB, 下载次数: 88

论坛徽章:
0
15 [报告]
发表于 2007-10-16 15:50 |只看该作者
只要目录就可以了。
不错,看了一下,果然是自己的代码

论坛徽章:
0
16 [报告]
发表于 2007-10-16 17:25 |只看该作者
非常感谢DennisRitchie的热心和细心,你提出的问题我会马上改正的。
我已经研三了,目前在北京一家公司实习,目前正在找正式工作。

论坛徽章:
0
17 [报告]
发表于 2007-10-16 17:40 |只看该作者
原帖由 onlyflyer 于 2007-10-16 17:25 发表
非常感谢DennisRitchie的热心和细心,你提出的问题我会马上改正的。
我已经研三了,目前在北京一家公司实习,目前正在找正式工作。


强人,崇拜一下!

论坛徽章:
0
18 [报告]
发表于 2007-10-16 17:45 |只看该作者
原帖由 onlyflyer 于 2007-10-16 17:25 发表
非常感谢DennisRitchie的热心和细心,你提出的问题我会马上改正的。
我已经研三了,目前在北京一家公司实习,目前正在找正式工作。


强人, 我也崇拜一下.
一直对底层都没有深入下去.
感觉研究生阶段在公司实习比在学校跟着老板做会学到更多实际的东西.

论坛徽章:
0
19 [报告]
发表于 2007-10-16 17:45 |只看该作者
强!支持!

论坛徽章:
0
20 [报告]
发表于 2007-10-16 17:46 |只看该作者

回复 #17 albcamus 的帖子

albcamus(leviathan),我是你的粉丝啊。
这次aka内核开发者大会我还问asmcos你怎么没来呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP