Mam projekt dla szkoły, w którym musimy używać flex i żubra. Chcę używać C ++, aby mieć dostęp do STL i własnych klas, które napisałem. Dostarczono nam następujący plik Makefile:
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 i parsowanie.Mam kilka początkowych rzeczy typu flex / bison, aby wygenerować skaner i analizator składni. Muszę dodać własne pliki do tych plików. symtab. {h, c} ma być implementacją tabeli symboli. attr. {h, c} są dla jakiejś magii atrybutów. Chcę zrobić plik .cc symtab.c, aby móc używać STL. Mam również inne powody, dla których chcę używać C ++.
Próbowałem użyć pliku parse.ypp, aby wygenerować plik .cpp. Ale problem polega na tym, że nie otrzymuję odpowiedniego pliku .h. Zmieniono plik Makefile tak, aby wyglądał tak:
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
Czy ktoś może mi powiedzieć, co muszę dodać lub zrobićuzyskać C ++? Należy zauważyć, że dodałem kilka rzeczy w pliku .y (lub .ypp), aby poradzić sobie z przejściem z C na C ++. W szczególności musiałem zadeklarować pewne rzeczy jako zewnętrzne. Moim głównym problemem jest to, że kiedy uruchamiam make, scan.l ma masę błędów składniowych i wydaje się, że nie może zawierać parse.tab.h (ponieważ nigdy nie jest generowany).
Odpowiedzi:
3 dla odpowiedzi № 1Nie musisz nic robić z Flex lub Bison, aby używać C ++, zrobiłem to wiele razy. Musisz tylko upewnić się, że używasz g ++, a nie gcc.
Twoje problemy są z Makefile, a nie z kodem.
4 dla odpowiedzi nr 2
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()
1 dla odpowiedzi nr 3
Istnieją pewne różnice, które możesz szczegółowo sprawdzić tutaj.
0 dla odpowiedzi nr 4
Użyj kompilatora C lub kompilatora C ++, ale nie obydwu (dopóki nie wiesz, co masz na myśli). Na pewno będziesz strzelał do siebie wiele razy na obu nogach. Mieszanie gcc i g ++ nie jest dobre.
Ta linia jest podejrzana:
lex.yy.o: scan.l parse.tab.h attr.h # added this ...
gcc -c -o lex.yy.o lex.yy.c
Poza tym wydaje się, że nie używasz CC
w dowolnym miejscu, używając tego, co ułatwiło życie.
Zakładając, że nie zmienisz pojedynczej linii kodu C, prawdopodobnie wykonasz kilka błędów i kilka ostrzeżeń (takich jak przestarzałe nagłówki itp.). Musisz je również naprawić.
-2 dla odpowiedzi № 5
Jeśli robisz parsery w C ++, poleciłbym je przejrzeć Zwiększenie Ducha. To jest o wiele przyjemniejsze w obsłudze niż bison / yacc.
Od tutaj:
Duch jest zorientowanym obiektowo rekursywnym zejściemstruktura generatora parsera zaimplementowana przy użyciu technik meta-programowania szablonów. Szablony ekspresji pozwalają nam w przybliżeniu zbliżyć składnię Extended Back-Normal Form (EBNF) do C ++.