在Windows上使用Flex和Bison进行C语言项目开发

在现代软件开发中,C语言依然扮演着重要的角色,尽管它可能不如C++那样灵活和强大。在某些情况下,开发者可能需要使用Flex和Bison这样的工具来处理词法分析和解析数据流的任务。本文将介绍如何在Windows环境下,使用Visual Studio2012创建一个C语言项目,并集成Flex和Bison工具。

Flex和Bison是两个历史悠久的工具,最初起源于UNIX世界。Flex是一个词法分析器,它读取文件或数据流,并将其分解成称为token的组成部分,这些token可以是数字、关键字、字符串、标点等。而Bison则接收这些token流,根据规则对它们进行结构化,然后寻找匹配的模式。如果找到匹配项,则执行某些操作。这两个工具的结合使得解析输入流并对其采取行动变得更加清晰和有效,比编写数百行传统的C代码要高效得多。

如今,Flex和Bison的GNU等价物被称为WinFlexBison。尽管它们仍然是Unix平台工具,但SourceForge上的一些开发者创建了一个名为WinFlexBison的包,这是一个现代Flex和Bison的紧凑、全面的Win32移植版本,并且定期维护。将使用这个包。

创建Win32 "C"项目

要在Visual Studio2012中创建一个Win32 "C"项目,请按照以下步骤操作:

  1. 创建一个新项目,选择Win32 C++控制台。给它一个描述性的名称,然后点击下一步。
  2. 取消勾选"使用预编译头文件"的复选框,并勾选"创建空项目"的复选框。点击完成。
  3. 右键单击解决方案资源管理器中的"源文件",点击"添加"然后"新建项"。将其命名为main.c。点击它并将以下文本复制进去:
#include <stdio.h> int main(void) { printf("Press ENTER to close.\n"); getchar(); return 0; }
  1. 在解决方案资源管理器中,右键单击主项目,选择属性,C/C++,所有选项,并将"编译为"设置为"C代码"。
  2. 按F5编译并调试。现在就有了一个"C"项目!

在Windows中使用Flex和Bison

要在Windows中使用Flex和Bison,请按照以下步骤操作:

  1. 从下载WinFlexBison,将其解压到某个有意义的位置,然后将该路径添加到系统路径。如果需要关于系统路径的帮助,请参见和。关闭任何命令提示符。
  2. 在项目中创建这些新文件:Expression.c/.h, Lexer.l/.c/.h, Parser.y/.c/.h
  3. 从复制文件数据到这些文件中(有些文件将保持为空)。将之前的暂停代码整合到真正的main()的末尾。确保在输入数据时保存所有这些文件,将需要它们进行下一步。
  4. 打开命令提示符,导航到.Y和.L文件,并运行以下命令:

如果Flex或Bison没有错误消息,很好。也可以通过这种方式测试其他设置。这个示例喜欢将--wincompat选项打开。

  1. 尝试构建项目。它可能会显示一些警告。将需要在一分钟内解决这些问题。

自动化构建.l和.y文件

要自动化构建.l和.y文件,请按照以下步骤操作:

  1. 右键单击Parser.y -> 属性 -> "项目类型"设置为"自定义构建工具"。
  2. 在左侧点击"自定义构建工具",并将命令设置为"c:\your-path-to-winflexbison\win_bison parser.y",替换为实际路径。
  3. 将描述更改为"BISON自定义构建工具"。
  4. 将"输出"设置为"parser.h,parser.c"

对于Lexer.l,重复上述步骤,但将命令设置为"yourpath\win_flex --wincompat lexer.l"等。

按F5... 瞧!现在去抓那些虫子吧。:) 应该最终得到这个:

注意事项

如果严格按照这个指南操作(并且Wikipedia上的示例没有变化),应该会出现两个"错误"。首先,"yyerror"会被定义两次。这是因为这个函数出现在Lexer.l和Parser.y中。解决方案是将其中一个更改为:

int yyerror(SExpression **expression, yyscan_t scanner, const char *msg);

另一个问题是main.c(24): warning C4090: 'function' : different 'const' qualifiers。这相当模糊,但查看该行代码,这个简单的更改可以修复它:

SExpression *getAST(char *expr) // was const char, removed const.

下载FBtest.zip - 34.2 KB

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485