Flex&Bison:在单独的文件中定义主函数

Posted

技术标签:

【中文标题】Flex&Bison:在单独的文件中定义主函数【英文标题】:Flex&Bison: define main function in a separate file 【发布时间】:2011-10-03 01:28:56 【问题描述】:

我正在尝试使用 Flex 和 Bison 制作一个小型解释器。

现在我有两个文件:parser.lparser.y。通常,主函数放在parser.y 文件中。我想要做的是将 main 函数放在另一个文件 main.cpp 中,这使我的包看起来很整洁。

#include "y.tab.h"

int main()

   yyparse();
   return 0;

但是我编译的时候报错:

undefined reference to `main'

所以我知道包含 y.tab.h 有问题。

你能告诉我怎么做吗?

解决方案

我刚刚想通了: 将以下内容添加到您的 main.c 文件中:

    extern FILE *yyin;
    extern FILE *yyout;
    extern int yyparse(void);

【问题讨论】:

我将它从 Adob​​e Flex 重新标记为 Gnu-Flex。 您实际上并不需要yyinyyout,因为您(尚未)从包含main() 的文件中引用它们。但是,如果您最终完成了诸如从命令行上指定的文件而不是标准输入读取之类的工作,则可能需要它们。如果 Bison 生成一个带有适当声明的标头,那就太好了。但是,y.tab.h 文件不是存放该信息的地方;它用于在解析器和词法分析器之间传递信息,而不是在应用程序和解析器之间传递信息。 【参考方案1】:

所以注意到:

我刚刚想通了:将以下内容添加到您的 main.c 文件中:

extern FILE *yyin; extern FILE *yyout; extern int yyparse(void);

@Jonathan Leffler 指出

您实际上并不需要 yyinyyout,因为您(还没有)参考 它们来自包含main() 的文件。但是,如果你最终做 工作,例如从命令行上指定的文件中读取 标准输入,您可能需要它们。如果野牛就好了 生成了一个包含适当声明的标题。这 但是,y.tab.h 文件不是存放该信息的地方;它是 用于在解析器和词法之间传递信息 分析器,而不是在应用程序和解析器之间。

【讨论】:

以上是关于Flex&Bison:在单独的文件中定义主函数的主要内容,如果未能解决你的问题,请参考以下文章

如何用flex+bison写语法分析器

BISON FLEX。提供输入文件时出现意外输出

将flex和bison编译成cpp

在 vc6 中使用 bison 和 flex

windows下bison的安装与入门

在 Windows、Visual C++ 2008 上安装 LEX/YACC 或 flex/bison