最近从事一个系统仿真软件的开发,里面定义了自己的描述性语言MSL, MSL语言经FlexBison转换成C语言,然后用C编译器来编译并计算仿真。
现在领域驱动开发比较热门,有机会定义自己的语言对程序员来说是比较有成就感的,免不了要去学习编译原理和flex, bison, antlr等工具的使用,
在控制仿真语言,数控编程,还有股票程序化交易系统,游戏脚本中都可以看到领域驱动开发的影子。
借此机会,重新阅读了编译原理的教程,并学习一下自动控制原理(用于控制仿真),以前一直觉得大学里学的东西没有用,但是后来证明都用上了,
比如说微积分,线性代数,数值分析,甚至大学物理,还有那个以前不知所云数学物理方法,我努力回忆这些老师的面容,但已渐渐模糊。
有关Flex和Bison的资料可以在http://ishare.iask.sina.com.cn里面找到很多,也可以从其他博客找到例子,
这里我从 http://sourceforge.net/projects/winflexbison/ 下载了 win_flex , win_bison 版本。
然后解压到某个目录下,注意里面有个data目录也要一起解压。
网上找了个博客参考一下:http://blog.csdn.net/pikaxuji/article/details/7678135
hello.l
%{
#include <stdlib.h>
#include "y.tab.h"
%}
%%
("hi"|"oi")"
" { return HI; }
("tchau"|"bye")"
" { return BYE; }
. { yyerror(); }
%%
int main(void)
{
yyparse();
return 0;
}
int yywrap(void)
{
return 0;
}
int yyerror(void)
{
printf("Error
");
exit(1);
}
hello.y
%token HI BYE
%%
program:
hi bye
;
hi:
HI { printf("Hello World
"); }
;
bye:
BYE { printf("Bye World
"); exit(0); }
;
经过尝试,我使用了以下命令生成代码:
win_flex --nounistd hello.l
win_bison -d -o y.tab.c hello.y
执行后会生成lex.yy.c 和 y.tab.h y.tab.c
用 visual studio 2008 创建一个新的Visual c++ empty project, 比如叫hello.vcproj, 然后把上面三个文件添加进去,直接编译成功。
运行时候在控制台运行,
d:FlexBisonhello>hello.exe
hi
Hello World
bye
Bye World
很简单吧。flex bison 工具后面有很多选项,满足不同需要,可以自己测试。