在现代软件开发中,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移植版本,并且定期维护。将使用这个包。
要在Visual Studio2012中创建一个Win32 "C"项目,请按照以下步骤操作:
#include <stdio.h>
int main(void) {
printf("Press ENTER to close.\n");
getchar();
return 0;
}
要在Windows中使用Flex和Bison,请按照以下步骤操作:
如果Flex或Bison没有错误消息,很好。也可以通过这种方式测试其他设置。这个示例喜欢将--wincompat选项打开。
要自动化构建.l和.y文件,请按照以下步骤操作:
对于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