Как мне использовать C ++ в flex и bison? - PullRequest
6 голосов
/ 22 апреля 2009

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

Ответы [ 5 ]

5 голосов
/ 22 апреля 2009

Вам не нужно ничего делать с flex или bison, чтобы использовать C ++, я делал это много раз. Вам просто нужно убедиться, что вы используете g ++, а не gcc.

Ваши проблемы с Makefile, а не с кодом.

4 голосов
/ 23 апреля 2009
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 голос
/ 23 апреля 2009

Есть некоторые отличия, которые вы можете проверить подробно здесь .

0 голосов
/ 22 апреля 2009

Если вы делаете парсеры на C ++, я бы порекомендовал посмотреть на Boost Spirit . С ним гораздо приятнее, чем с бизоном / яком.

С здесь :

Spirit - это объектно-ориентированная среда генератора синтаксического анализатора с рекурсивным спуском, реализованная с использованием методов метапрограммирования шаблонов. Шаблоны выражений позволяют полностью аппроксимировать синтаксис расширенной формы Backus-Normal (EBNF) в C ++.

0 голосов
/ 22 апреля 2009

Используйте либо компилятор C, либо компилятор C ++, но не оба (пока вы не знаете, что вы делаете). В противном случае вы наверняка много раз выстрелите себе в обе ноги. Смешивать gcc и g ++ нехорошо.

Эта строка подозрительна:

lex.yy.o: scan.l parse.tab.h attr.h      # added this ...
gcc -c -o lex.yy.o lex.yy.c

Кроме того, вы, кажется, нигде не используете CC, используя это, что сделало бы жизнь проще.

Предполагая, что вы не измените ни одной строки кода C, вы, возможно, столкнетесь с некоторыми ошибками и довольно большим количеством предупреждений (например, устаревшими заголовками и т. Д.). Тебе тоже придется их починить.

...