【原创】让VS2015与Win Flex Bison共舞

时光荏苒,岁月如梭!很久很久没有更新博客了,很多要写的东西都只是开了个头,或者只写了一小部分因不完整而无法发布,实在遗憾。无奈时间实在是太紧张,大量时间都用在了看书、学习和工作上,不能快意自在的笔耕以饲读者,深感愧疚。

前一久加入了一个立志开发编译器的网友团队,哪不知还没开始就又结束了(干嘛说个“又”字,原因你懂的),但是这次经历居然又勾起了我10多年对编译原理的那份迷恋,从书架上翻出那些10多年前够买的相关专辑,又是一顿狂啃,突然感觉年近不惑的我,现在居然能一口气读通读懂,那种酣畅淋漓的感觉,如饮佳酿,想来是因为我前一久花了大量时间复习了数学,并坐了人类进步电梯的“古今数学思想”之缘故吧。

10多年前为了实现编译器,搜集了很多Lex和Yacc的工具,其中感觉让我眼前一亮的是叫做Parser Generator的一款美国大黄蜂公司出品的Lex和Yacc的IDE工具,无奈该公司自2003年之后就再没有更新过了,这个工具只能与当时的VC6和VS2003很好的集成,且只能支持Win32和老旧的Win16。此次复习编译原理,只能先又祭出这款老刀,开砍正则表达式和EBNF。在反复与VS2015集成编译的过程中,感觉山穷水尽,实在是无法将二者简单融合,老旧的工具与年轻的后生VS2015格格不入,各种警告,编译错误,在折磨了我半天之后我只好先放弃了。

继而我在近乎绝望的时候,突然想起要不直接下载Flex和Bison的最新版源码然后再搜索下它们在Win平台和VS工具下的编译方法,自己搞定吧,实在不行不是还有个CygWin可以用来救场,于是说干就干。打开百度一顿狂搜,有个关键词“Win Bison”让我眼前一亮,然后就直奔主题全英文开搜,于是就让我找到了Win Flex Bison Tools,幸运的是居然还让我搜到了一篇文章介绍如何将这个工具集成到VS2010中的文章,此时我的心情就是柳暗花明了。

于是二话不说就开练,当然是用2015,碍于我蹩脚的英文,在耗费了我大约2个左右脑细胞和近2个小时的时间后,居然就成功了,于是我干的第一件事情就是把这个过程写成这篇博文。

当然要完成这个过程,第一步就是要下载到WinFlexBison工具,在这里:

https://sourceforge.net/projects/winflexbison/

下载后解压就OK了;

第二步就是启动VS2015并新建一个空的C++项目,如下图:

该项目命名为SampleCALC。建好后的解决方案资源管理器如下图所示:

 

接下来就是新建一个SampleCALC.y的语法文件,将下面这段Yacc代码复制粘贴进去:

----------------------------------------------------割------------------------------------------------------------------

%{
#include <stdio.h>
#include <ctype.h>
#include <math.h>

#define YYSTYPE  double
void yyerror(char *text);
int yylex(void);
%}
/
// declarations section
// place any declarations here
%token NUMBER
%left '+' '-'
%left '*' '/'
%right '^'
%%
/
// rules section
// place your YACC rules here (there must be at least one)
command : exp {printf("%lf\n",$1);}
   ;
exp       : NUMBER          {$$ = $1;}
       | exp '+' exp     {$$ = $1 + $3;}
       | exp '-' exp     {$$ = $1 - $3;}
       | exp '*' exp     {$$ = $1 * $3;}
       | exp '/' exp     {
                            if(0 != $3)
                            {
                               $$ = $1 / $3;
                            }
                            else
                            {
                               $$=0;
                            }
                        }
       | exp '^' exp     {$$ = pow($1,$3);}
       | '(' exp ')'     {$$ = $2;}
       ;
%%
/
// programs section
int yylex(void)
{
   // place your token retrieving code here
   int c = 0;
   while( (c = getchar()) == ' ');
   if( isdigit(c) )
   {
       ungetc(c,stdin);
       scanf_s("%lf",&yylval);
       return (NUMBER);
   }
   if( '\n' == c )
   {
       return 0;
   }
   return c;
}
int main(void)
{
   yyparse();
   system("PAUSE");
   return 0;
}
void yyerror(char *text)
{
   fprintf(stderr,"%s\n",text);
}

----------------------------------------------------割------------------------------------------------------------------

Ok,至此基本的准备工作就结束了,接下来的第四步就需要WinFlexBison登场了。在VS2015解决方案资源管理器的项目节点上右键单击然后按下图所示顺序选中生成自定义菜单:

之后会弹出如下的对话框:

按图示点击其上的查找现有的按钮,然后找到你下载的WinFlexBison工具的解压目录中的custom_build_rules目录下的win_flex_bison_custom_build.targets文件点击打开后VS2015会提示:

点击是之后上面这个对话框变成下面的样子:

 

注意多出来的Win_flex_bison_custom_build选项,点击之前的方框使他成为选中状态,然后点击确定按钮关闭。

第五步需要做的就是将WinBison的exe文件所在的目录添加到项目的可执行文件路径中,如下图操作:

 

打开属性对话框后在选项树中找到VC++目录选项的可执行文件目录选项,如下图:

点击右侧箭头选择编辑后在弹出的对话框中添加解压的WinFlexBison目录如下:

然后点击确定按钮关闭两个对话框,准备开始下一步;

第六步直接生成项目,这时输出窗口中会显示下面的信息:

当然这只是说生成刚才新建的SampleCALC.y文件成功了,这会生成两个文件:SampleCALC.tab.h和SampleCALC.tab.cpp,然后将这两个文件添加现有项到当前项目中如下:

 

至此算大功告成了,当然最后一步就是生成并执行程序了,本文给的例子是个简单的命令行计算器,实现了+、-、*、/、^(乘方)运算。生成成功后,点击调试运行按钮就可以输入你想要的的表达式计算下看看了。下面给几个我调试运行的例子大家过过眼瘾:

 

至此所有的工作都做完了,以后要开发编译器使用WinFlexBison工具都照此执行即可,当然我没有介绍Lex文件怎么弄,其实和Yacc的文件一个道理,我想剩下的东西聪明的你应该不需要我教了。最后提醒一下,在添加WinFlexBison工具的EXE文件目录那一步,主要我们选择了默认配置,通常你需要选择所有配置添加一下,这样无论是Win32、Win64还是Debug或Release都可以使用WinFlexBison工具进行编译了。

    其他的深入的关于工具的使用内容,我将继续结合复习编译原理的过程进行摸索,如果有什么重大的发现,我将考虑继续写成文章发布出来,供大家参考。

最后平心而论,现代化的Bison工具比当年的那个Parser Generator先进了不止一点半点,而且也方便了很多,不需要额外的include、lib引用,直接编译就可以生成想要的编译器工具,先进、方便集于一身。常言道:工欲善其事必先利其器,有了WinFlexBison工具在手,各位观众实现自己的编译器再不是一件极度复杂的事情了,你可以直接无视那些还在写嵌套下降递归调用实现编译器的入门者了,真正是居家旅行装13必备之神器!

最后提醒各位一下,因为*.y文件的显示和编辑在VS2015中都是当作普通的文本文件处理的,所以是一个黑白的世界,如果你想要带语法高亮的显示,那么还是先得下载Parser Generator工具并安装,然后在这个工具中编辑*.l和*.y文件,然后在VS2015中按照本文提示的方法编译执行。最蛋疼的莫过于这个Parser Generator工具居然不支持鼠标滚轮,只能祈祷你的Lex和Yacc文件不要太大,不然想要浏览的时候你就知道这个工具该是有多老旧。当然如果你找到了能够集成到VS2015中的Lex和Yacc语法高亮插件的话,请你不要忘记把下载链接回复给我,万分感谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GamebabyRockSun_QQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值