免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 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
2 [报告]
发表于 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
3 [报告]
发表于 2007-10-16 18:01 |显示全部楼层
原帖由 onlyflyer 于 2007-10-16 17:25 发表
非常感谢DennisRitchie的热心和细心,你提出的问题我会马上改正的。
我已经研三了,目前在北京一家公司实习,目前正在找正式工作。

那就有点可惜了,如果是研一的话,兄台肯下番功夫,可以做一个完整的ANSI C的编译器,就像TCC(Tiny C Compiler)一样。

感觉研究生阶段在公司实习比在学校跟着老板做会学到更多实际的东西.

以计算机专业来说,我感觉在研究生阶段:
自己做一个较为完整的程序后上涨的经验值 > 在公司实习的收获 > 在学校跟着老板做
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP