我有一个学校项目,我们需要使用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(因为它永远不会生成)。
答案 0 :(得分:5)
使用C ++你不需要使用flex或bison做任何事情,我已经多次完成了。你只需要确保使用g ++,而不是gcc。
你的问题在于Makefile,而不是代码。
答案 1 :(得分:4)
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()
答案 2 :(得分:1)
您可以详细了解一些差异 here
答案 3 :(得分:0)
使用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代码的单行,您可能会遇到一些错误和一些警告(例如已弃用的标题等)。你也必须修理它们。
答案 4 :(得分:-2)
如果您在C ++中使用解析器,我建议您查看Boost Spirit。它比bison / yacc好得多。
来自here:
Spirit是一个面向对象的递归下降解析器生成器框架,使用模板元编程技术实现。表达式模板允许我们在C ++中完全接近扩展Backus-Normal Form(EBNF)的语法。