Tengo un proyecto para la escuela donde tenemos que usar flex y bison. Quiero usar C++ para tener acceso a STL y mis propias clases que escribí. Nos dieron con el siguiente Makefile:¿Cómo uso C++ en flex y 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 y parse.y tienen cierta flexibilidad material inicial/bisontes para generar el escáner y el analizador. Necesito agregar mis propias cosas a esos archivos. symtab. {h, c} se supone que es una implementación de una tabla de símbolos. attr. {h, c} son para algunos atributos mágicos. Quiero hacer que symtab.c sea un archivo .cc para poder usar STL. También tengo otras razones para querer usar C++.
Intenté utilizar un archivo parse.ypp, para que se generara un archivo .cpp. Pero el problema es que no estoy obteniendo el archivo .h correcto. He cambiado el Makefile para tener este aspecto:
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
Puede alguien decirme lo que tengo que añadir o hacer para conseguir C++ de trabajo? Cabe señalar que agregué algunas cosas en el archivo .y (o .ypp) para tratar de pasar de C a C++. En particular, tuve que declarar algunas cosas como externas. Mi problema principal es que cuando ejecuto make, scan.l tiene un montón de errores de sintaxis, y parecen ser porque no puede incluir parse.tab.h (porque nunca se genera).
Para el registro, flex tiene los indicadores de línea de comandos - + o --C++ para generar un lector de C++ en lugar de uno de C. Considera investigar eso, aunque no creo que ese sea tu problema en este caso. –