0

今、phpファイル、aspファイル、またはjspファイルを解析したい.lex_php.l yacc_php.yはphpファイルの解析に使用され、lex_asp.l yacc_asp.yはaspファイルの解析に使用されます

次に、メインがあり、メインは入力タイプごとに異なる解析を呼び出します

しかし、それらをコンパイルしてリンクすると、再定義エラーが出力されます。どうすればよいですか? このようなメイクファイル

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 、および他の多くの同じ関数が含まれていると思います。そのため、再定義エラーが出力される可能性があります。

しかし、どうすればこの問題を解決できますか、助けてください、どうもありがとう

4

1 に答える 1

2

flex オプション--prefix=foo(または%option prefix="foo".l ファイル内) を使用して、すべてのシンボルの名前を変更できます (foolex関数の代わりに関数を取得できyylexます)。bison では%name-prefix "foo"、.y ファイルのオプションを使用して同じ効果を得ることができます。

パーサーとレクサーのペアごとに 1 つの異なるプレフィックスを選択するだけです。

于 2013-07-11T07:04:48.503 に答える