Ich habe ein Projekt für die Schule, wo wir Flex und Bison verwenden müssen. Ich möchte C++ verwenden, damit ich Zugriff auf STL und meine eigenen Klassen habe, die ich geschrieben habe. Wir waren mit dem folgenden Makefile zur Verfügung gestellt:Wie verwende ich C++ in Flex und Bison?
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 und parse.y haben einige anfängliche flex/Bison Sachen den Scanner und Parser zu erzeugen. Ich muss meinen Dateien eigene Dateien hinzufügen. symtab. {h, c} soll eine Implementierung einer Symboltabelle sein. attr. {h, c} sind für eine Attribut-Magie. Ich möchte symtab.c eine .cc-Datei machen, damit ich STL verwenden kann. Ich habe auch andere Gründe, C++ zu benutzen.
Ich habe versucht, eine parse.ypp-Datei zu verwenden, so dass eine CPP-Datei generiert werden würde. Aber das Problem ist, dass ich nicht die richtige .h-Datei bekomme. Ich änderte das Makefile wie folgt aussehen:
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
Kann mir jemand sagen, was ich brauche C hinzuzufügen oder zu tun zu bekommen ++ zu arbeiten? Es sollte angemerkt werden, dass ich einige Sachen in der .y (oder .ypp) Datei hinzugefügt habe, um mit dem Verschieben von C nach C++ umzugehen. Insbesondere musste ich einige Sachen als extern deklarieren. Mein Hauptproblem ist, dass, wenn ich make ausführen, scan.l eine Reihe von Syntaxfehlern hat, und sie scheinen zu sein, weil es parse.tab.h nicht enthalten kann (weil es nie generiert wird).
Für die Aufzeichnung flex das - + ++ oder Befehlszeilen-Flags --c eine C++ LEXER anstelle eines C eine zu erzeugen. Denken Sie darüber nach, obwohl ich nicht glaube, dass das Ihr Problem in diesem Fall ist. –