У меня есть проект для школы, где нам нужно использовать 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 (потому что он никогда не генерируется).