如何在flex和bison中使用C++?

Tom*_*Tom 6 c c++ bison flex-lexer

我有一个学校项目,我们需要使用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
Run Code Online (Sandbox Code Playgroud)

scan.l和parse.y有一些初始的flex/bison东西来生成扫描器和解析器.我需要将自己的东西添加到这些文件中.symtab.{h,c}应该是符号表的实现.attr.{h,c}用于某些属性魔法.我想制作symtab.ca .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
Run Code Online (Sandbox Code Playgroud)

有人能告诉我我需要添加或做些什么来让C++工作吗?应该注意我在.y(或.ypp)文件中添加了一些东西来处理从C到C++的转换.特别是,我不得不声明一些东西是外部的.我的主要问题是,当我运行make时,scan.l有一堆语法错误,它们似乎是因为它不能包含parse.tab.h(因为它永远不会生成).

Zif*_*fre 6

使用C++你不需要使用flex或bison做任何事情,我已经多次完成了.你只需要确保你使用g ++,而不是gcc.

你的问题是Makefile,而不是代码.


pio*_*otr 5

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()
Run Code Online (Sandbox Code Playgroud)