2009-04-22 277 views
5

我有一個需要使用flex和野牛的學校項目。我想使用C++,以便可以訪問STL和我自己寫的類。我們提供了下面的Makefile:如何在flex和bison中使用C++?

CC = gcc 
CFLAGS = -g 

OBJs = parse.tab.o symtab.o attr.o lex.yy.o 

default: parser 

parser: ${OBJs} 
    ${CC} ${CFLAGS} ${OBJs} -o parser -lfl 

lex.yy.c: scan.l parse.tab.h attr.h 
    flex -i scan.l 

parse.tab.c: parse.y attr.h symtab.h 
    bison -dv parse.y 

parse.tab.h: parse.tab.c 

clean: 
    rm -f parser lex.yy.c *.o parse.tab.[ch] parse.output 

depend: 
    makedepend -I. *.c 

scan.l裏和parse.y有一些初步的Flex /野牛的東西產生了掃描器和分析器。我需要將我自己的東西添加到這些文件。 symtab。{h,c}應該是一個符號表的實現。 attr。{h,c}是一些屬性魔法。我想使symtab.c成爲一個.cc文件,所以我可以使用STL。我還有其他想要使用C++的原因。

我試圖使用parse.ypp文件,以便生成一個.cpp文件。但問題是我沒有得到正確的.h文件。我改變了的Makefile看起來像這樣:

CC = g++   # Change gcc to g++ 
CFLAGS = -g 

OBJs = lex.yy.o parse.tab.o symtab.o attr.o 

default: lex.yy.c parser # added lex.yy.c so I could just keep lex stuff in C since I don't really need C++ there 

parser: ${OBJs} 
    ${CC} ${CFLAGS} ${OBJs} -o parser -lfl 

lex.yy.o: scan.l parse.tab.h attr.h  # added this rule to use gcc instead of g++ 
    gcc -c -o lex.yy.o lex.yy.c 

lex.yy.c: scan.l parse.tab.h attr.h 
    flex -i scan.l 

parse.tab.cpp: parse.ypp attr.h symtab.h 
    bison -dv parse.ypp 

parse.tab.h: parse.tab.cpp  # I want a parse.tab.h but I get parse.tab.hpp 

clean: 
    rm -f parser lex.yy.c *.o parse.tab.cpp parse.tab.h parse.output 

depend: 
    makedepend -I. *.c 

有人能告訴我什麼,我需要添加或做的就是C++的工作?應該指出,我在.y(或.ypp)文件中添加了一些東西來處理從C到C++的轉換。特別是,我不得不聲明一些東西。我的主要問題是,當我運行make時,scan.l有一堆語法錯誤,它們似乎是因爲它不能包含parse.tab.h(因爲它永遠不會生成)。

+0

爲了記錄,flex使用 - +或--C++命令行標誌來生成C++詞法分析器,而不是C語言。考慮一下,雖然我不認爲這是你的問題在這種情況下。 – 2009-04-22 18:37:31

回答

3

你不需要對flex或bison做任何事情來使用C++,我已經做了很多次。你只需要確保你使用g ++而不是gcc。

您的問題與Makefile,而不是代碼。

+0

接受這很晚: - )...但我記得這是對的,我只需要玩我的makefile文件。謝謝。 – Tom 2009-12-26 02:47:10

0

使用C編譯器或C++編譯器,但不能同時使用(直到你知道你要做什麼)。否則,你一定要在自己的雙腳上多次射擊自己。混合gcc和g ++不好。

此行是犯罪嫌疑人:

lex.yy.o: scan.l parse.tab.h attr.h  # added this ... 
gcc -c -o lex.yy.o lex.yy.c 

而且,你似乎沒有使用任何地方CC,使用準會取得生活更輕鬆。

假設你不改變一行C代碼,你可能會遇到一些錯誤和不少警告(比如不贊成使用的頭文件等)。你也必須修復它們。

-1

如果你在C++中進行解析器,我會建議看看Boost Spirit。它比野牛/ YACC處理好得多。

here

精神是使用模板元編程技術來實現面向對象的遞歸下降解析器的生成框架。表達式模板允許我們用C++完全近似擴展Backus-Normal形式(EBNF)的語法。

+4

我不同意。我已經嘗試過兩種,我更喜歡野牛(儘管我更喜歡ANTLR)。將EBNF合併到C++中所需的奇怪語法使得讀取語法非常困難。 – Zifre 2009-04-22 19:08:17

+4

在這種情況下不是一個選項,因爲他需要爲他的項目使用bison/flex。除此之外,並非所有C++都需要使用Boost來完成。 – 2009-04-23 02:43:24

1

有一定的差異,你可以詳細 here退房。

4
For using flex with C++: 
1: read the flex docs: 
2: use flex -+ -o file.cc parser.ll 
3: In the .ll file: 

%option c++ 
%option yyclass="Your_class_name" 
%option batch 

4: In your .hh file, derive Your_class_name from public yyFlexLexer 
5: you can then use your_class_instance.yylex()