/ / Jak używać C ++ w flex i bison? - c ++, c, bison, flex-lexer

Jak używać C ++ w flex i bison? - c ++, c, bison, flex-lexer

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 № 1

Nie 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 ++.