免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2408 | 回复: 6
打印 上一主题 下一主题

多个LEX和YACC配合的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-05 21:04 |只看该作者 |倒序浏览
我正在编一个程序流程是这样的

先用LEX和YACC编写预处理程序处理C代码
再运用LEX和YACC一遍分析处理完的C代码以创建语法树

也就是说要运用两遍LEX和YACC,但现在不能简单的将两次得到的.c放在一起因为两次生成的文件很多变量是重复的
有什么办法吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-07-05 22:06 |只看该作者
把变量改名字就行了

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2008-07-06 20:51 |只看该作者
打个比方:
1.l 1.y为一组
2.l 2.y为一组
生成C文件和H文件的Makefile可以这样写

  1. .PHONY:all clean
  2. all : y.tab.1.c y.tab.2.c y.tab.1.h y.tab.2.h  lex.yy.1.c lex.yy.2.c

  3. y.tab.%.c y.tab.%.h : %.y
  4.         $(YACC) -d $<
  5.         sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $(patsubst,%.y,y.tab.%.c,$<)
  6.         sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.h > $(patsubst,%.y,y.tab.%.h,$<)
  7.         $(RM) lex.yy.c lex.yy.h
  8. lex.yy.%.c : %.l
  9.         $(LEX) $<
  10.         sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $@
  11.         $(RM) lex.yy.c
  12. clean:
  13.         $(RM)  lex.yy.* y.tab.*

复制代码

里面引用变量
比如extern char yytext[];
依然这样写,
不用写成extern char yy1text[];
因为编译的时候会被改掉的

[ 本帖最后由 cjaizss 于 2008-7-6 23:55 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2008-07-06 22:34 |只看该作者
Makefile可以再做点改动:
假设一个目录里,xxx.l和xxx.y是一组
有很多组,都是除去后缀就是相同名字的才会相互引用

  1. YACC_SRC:=$(wildcard *.y)
  2. LEX_DRC:=$(wildcard *.l)
  3. CFLAGS=
  4. .PHONY:all clean
  5. all:$(YACC_SRC:%.y=y.tab.%.o) $(LEX_SRC:%.y=lex.yy.%.o)
  6. lex.yy.%.o:lex.yy.%.c
  7. y.tab.%.o:y.tab.%.c y.tab.%.h

  8. y.tab.%.c y.tab.%.h : %.y
  9.         $(YACC) -d $<
  10.         sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $(patsubst,%.y,y.tab.%.c,$<)
  11.         sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.h > $(patsubst,%.y,y.tab.%.h,$<)
  12.         $(RM) lex.yy.c lex.yy.h
  13. lex.yy.%.c : %.l
  14.         $(LEX) $<
  15.         sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $@
  16.         $(RM) lex.yy.c
  17. clean:
  18.         $(RM)  lex.yy.* y.tab.*
复制代码

[ 本帖最后由 cjaizss 于 2008-7-6 23:55 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-07-09 22:25 |只看该作者
我用的是parse generator这个软件,没有markfile这个文件,还有别的办法吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2008-07-10 09:23 |只看该作者

回复 #5 a02123230 的帖子

一个IDE?
我最讨厌IDE了,不到万不得已绝不用它。

论坛徽章:
0
7 [报告]
发表于 2008-07-10 19:14 |只看该作者

回复 #6 cjaizss 的帖子



[ 本帖最后由 a02123230 于 2008-7-10 19:29 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP