a02123230 发表于 2008-07-05 21:04

多个LEX和YACC配合的问题

我正在编一个程序流程是这样的

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

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

cjaizss 发表于 2008-07-05 22:06

把变量改名字就行了

cjaizss 发表于 2008-07-06 20:51

打个比方:
1.l 1.y为一组
2.l 2.y为一组
生成C文件和H文件的Makefile可以这样写

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

y.tab.%.c y.tab.%.h : %.y
      $(YACC) -d $<
      sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $(patsubst,%.y,y.tab.%.c,$<)
      sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.h > $(patsubst,%.y,y.tab.%.h,$<)
      $(RM) lex.yy.c lex.yy.h
lex.yy.%.c : %.l
      $(LEX) $<
      sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $@
      $(RM) lex.yy.c
clean:
      $(RM)lex.yy.* y.tab.*


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

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

cjaizss 发表于 2008-07-06 22:34

Makefile可以再做点改动:
假设一个目录里,xxx.l和xxx.y是一组
有很多组,都是除去后缀就是相同名字的才会相互引用

YACC_SRC:=$(wildcard *.y)
LEX_DRC:=$(wildcard *.l)
CFLAGS=
.PHONY:all clean
all:$(YACC_SRC:%.y=y.tab.%.o) $(LEX_SRC:%.y=lex.yy.%.o)
lex.yy.%.o:lex.yy.%.c
y.tab.%.o:y.tab.%.c y.tab.%.h

y.tab.%.c y.tab.%.h : %.y
      $(YACC) -d $<
      sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $(patsubst,%.y,y.tab.%.c,$<)
      sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.h > $(patsubst,%.y,y.tab.%.h,$<)
      $(RM) lex.yy.c lex.yy.h
lex.yy.%.c : %.l
      $(LEX) $<
      sed 's/YY/YY'$(<:.l=)'/g;s/yy/yy'$(<:.l=)'/g' lex.yy.c > $@
      $(RM) lex.yy.c
clean:
      $(RM)lex.yy.* y.tab.*


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

a02123230 发表于 2008-07-09 22:25

我用的是parse generator这个软件,没有markfile这个文件,还有别的办法吗?

cjaizss 发表于 2008-07-10 09:23

回复 #5 a02123230 的帖子

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

a02123230 发表于 2008-07-10 19:14

回复 #6 cjaizss 的帖子

:em21: :em21:

[ 本帖最后由 a02123230 于 2008-7-10 19:29 编辑 ]
页: [1]
查看完整版本: 多个LEX和YACC配合的问题