如何在我的例程中组合两个或更多lex文件

时间:2013-07-11 03:24:56

标签: yacc lex redefinition

现在我要解析php文件,asp文件或jsp文件, lex_php.l yacc_php.y用于解析php文件, lex_asp.l yacc_asp.y用于解析asp文件,

然后我有main,main将按输入类型调用不同的解析

但是当编译并链接它们时,输出重新定义错误,我该怎么办? 像这样的Makefile

LEX=flex
YACC=bison
CC=g++
OBJECT=main         #the execute target

$(OBJECT): main.o lex_php.o  yacc_php.o lex_asp.o  yacc_asp.o
    $(CC) yacc_php.o yacc_asp.o -o $(OBJECT)

main.o: main.c  yacc_php.h  lex_yacc_php.h yacc_asp.h  lex_yacc_asp.h Token.h       WebShellFilter.h
    $(CC) -c main.c

lex_php.o: lex_php.c  yacc_php.h  lex_yacc_php.h
    $(CC) -c lex_php.c

lex_php.c: lex_php.l
$(LEX) -o lex_php.c lex_php.l

yacc_php.o: yacc_php.c  lex_yacc_php.h
$(CC) -c yacc_php.c

yacc_php.c  yacc_php.h: yacc_php.y
$(YACC) -d yacc_php.y -o yacc_php.c

############### ASP
lex_asp.o: lex_asp.c  yacc_asp.h  lex_yacc_asp.h
$(CC) -c lex_asp.c

lex_asp.c: lex_asp.l
$(LEX) -o lex_asp.c lex_asp.l 

yacc_asp.o: yacc_asp.c  lex_yacc_asp.h
$(CC) -c yacc_asp.c

yacc_asp.c  yacc_asp.h: yacc_asp.y
$(YACC) -d yacc_asp.y -o yacc_asp.c

clean:
    @rm -f $(OBJECT)  *.o

我认为,yacc_asp.o和yacc_php.o都包含yyparse,yytext和mamy其他相同的函数,因此输出可能会重新定义错误。

但如何解决这个问题,帮助我,非常感谢你

1 个答案:

答案 0 :(得分:1)

您可以使用flex选项--prefix=foo(或.l文件中的%option prefix="foo")来更改所有符号上的名称(这样您就可以获得foolex函数而不是yylex函数{1}}功能)。使用bison,您可以使用.y文件中的%name-prefix "foo"选项获得相同的效果。

为每个解析器/词法分析器对选择一个不同的前缀。