不能在Qt上同时使用Flex和Bison

时间:2015-02-24 13:09:33

标签: c++ qt bison flex-lexer

我正在开发一个项目,除了主项目之外,我必须开发一个编译器(实际上是一个解析器)。我正在使用Qt 5.3和Windows(但结果在Ubuntu 14.04上几乎相同) 我在使用flex和bison方面经验丰富,但是这一次,我开发了一个Scanner,然后是Parser。我仔细测试了扫描仪并确保它没有错误。但是当我将解析器添加到项目时发生了很多错误。(例如对yylex()的未定义引用,但我声明extern int yylex()并且我不能使用库,因为我会提到)然后我消除了解析器,以前工作的一些功能现在不能正常工作!例如,现在我无法使用#include <QDebug>
当我使用这个头文件时,Compiler说这个库里有很多错误(77错误)!我感到很困惑,已经有两天我正在研究这个问题并且没有任何进展 我使用了#34;自定义构建步骤&#34;我将路径设置为${sourceDir}。另外,我在lex.yy.c中添加了y.tab.cSOURCES,在y.tab.h文件的HEADERS中添加了.pro。 我第一次通过here学会了如何使用flex和bison。对于那些错误,我读了以下内容:
Undefined Reference to yylex()
How to Integrate Flex and Bison
和其他一些链接...

2 个答案:

答案 0 :(得分:1)

Qt程序是用C ++编写的,而不是C语言。

如果你没有太古老的flex和bison版本,你可以使用C ++编译生成的代码没有问题,但你需要告诉编译器它们是用C ++编译的。 (当然可以使用C和C ++的组合,但需要一些小心。)

使用gcc,应该足以确保bison和flex生成的文件的名称具有.cc扩展名而不是.c,您可以使用-o执行此操作命令行选项。 (在任何情况下都非常值得推荐,因为它允许您选择更有意义的文件名,然后y.tab.clex.yy.c。)这需要对Makefile进行一些调整。 (您也可以使用%output "filename"中的bison指令和%option outfile="filename"中的flex,但您仍然需要调整Makefile中的依赖项。)

另一个不太推荐的选项是使用gcc的-x c++命令行选项。

如果没有关于您在Windows上使用的工具集的更多详细信息,提供更多建议并不容易,特别是对我而言(因为我在Windows工具集中有0经验)。但关键是确保两个文件都编译为C ++。

从您尝试#include Qt标题的事实来看,似乎编译扫描程序和解析器,因为C程序不实用。但如果我误解了你的项目,扫描仪和解析器都不需要C ++,那么你可以这样做;您需要在调用extern "C" int yylex();的C ++翻译单元中声明yylex。 (不要将此声明放在scanner.l文件中;如果您正在使用C进行编译,它将无法工作。)

答案 1 :(得分:0)

flex / bison的C ++设置很棘手。看看这个示例项目:

https://github.com/ezaquarii/bison-flex-cpp-example

它是一个完整的,有效的C ++ Flex和Bison“解释器”,封装在一个类中。事实上我用Qt 4.8几次使用它。