У меня есть проект для школы, где нам нужно использовать flex и bison. Я хочу использовать C++, чтобы иметь доступ к STL и своим собственным классам, которые я написал. Нам был предоставлен следующий 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 и parse.y есть начальный материал flex/bison для генерации сканера и синтаксического анализатора. Мне нужно добавить свои собственные вещи в эти файлы. 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 (поскольку он никогда не генерируется).