本文参考了https://blog.csdn.net/tankloverainbow/article/details/86653044
1.下载地址
https://jaist.dl.sourceforge.net/project/winflexbison/win_flex_bison-latest.zip
然后解压
2.在vs中新建一个控制台项目
3.向工程中添加win-flex_bison软件中的targets文件,具体步骤为
a. 右键单击工程 -> 在弹出的菜单中选择“生成依赖项” -> “生成自定义”
b. 在弹出的窗口下侧选择“查找现有的(F)...”,
然后进入刚才已经下好的win flex-bison文件夹下,
并依次进入\win_flex_bison-latest\custom_build_rules\文件夹中,
选择“win_flex_bison_custom_build.targets”文件。
c. 在当前对话框中出现了“in_flex_bison_custom_build.targets”文件选项,
选中该文件并点“确定”
4: 向工程中添加win_bison.exe和win_flex.exe文件所在的路径
具体步骤为:
(a)右键单击工程-> 在弹出的菜单中选择“属性” -> VC++目录->可执行文件目录
(b)左键单击“可执行文件目录”后面的白色区域,会出现下拉菜单的提示符,
选择该提示符后出现下拉菜单,选中“<编辑...>”后便会出现步骤3的对话框
(c)左键双击白色区域就能添加win_bison.exe和win_flex.exe文件所在的路径了,
这两个文件保存在win_flex_bison-latest软件的第一级目录下。
5.编译和运行lex文件
向工程中添加demo.l文件(貌似文件扩展名必须为.l)
内容如下:
%%
.|\n ECHO;
%%
int yywrap(void)
{
return 1; //如果返回0则表示要处理下一个输入流,返回1表示结束.
}
int main(int argc, char** argv)
{
freopen("1.txt","r",stdin);
yylex();
return 0;
}
按ctrl+alt+f7 重新完整编译,
此时项目目录下会自动多一个demo.flex.cpp文件,
把它也添加到项目中.
6.
项目右键->属性->C/C++->预处理器->
预定义宏,添加
;_CRT_SECURE_NO_WARNINGS (分号和前面的项分开).
然后项目右键->属性->连接器->系统->子系统->控制台.
然后再按ctrl+alt+f7重新编译
7.在项目目录下准备一个1.txt文件
内容随意,然后ctrl+f5编译和运行,
会发现屏幕输出1.txt的内容
.说明配置和运行成功.
7.如果想实验flex+bison配合使用,可以试试下面的例子.
目的是求出每行两个数字的和.
则可以编写如下两个文件,
demo.l内容为:
%{
#include<stdlib.h>
#include "demo.tab.h"
%}
%%
[1-9][0-9]* {
yylval.ival=atoi(yytext);
return NUM;
}
"+" {return '+';}
.|\n ;
%%
int yyerror(const char * format,...){
printf("some error\n");
return 1;
}
int yywrap(void)
{
return 1;
}
demo.y的内容为
%{
#include<stdio.h>
extern int yylex();
extern int yyerror(const char * format,...);
%}
%union{
int ival;
}
%token<ival> NUM
%%
terms: term
|terms term
;
term: NUM NUM{
printf("%d+%d=%d\n",$1,$2,$1+$2);
};
%%
int main(int argc, char* argv[])
{
freopen("1.txt","r",stdin);
yyparse();
return 0;
}
重新编译之后,项目目录下会多出3个文件
demo.flex.cpp
demo.tab.cpp
demo.tab.h
加入到项目中,
然后重新编译和运行.
把1.txt的内容修改为
10 12
20 22
会发现输出
10+12=22
20+22=42
运行通过