《编译工程》
今天老师讲到了关于编译器工作的第一步:词法分析。
并介绍了用于词法分析的工具,其中提到了flex
flex全称——fast lexical analyzer generator,即快速词法分析器生成器
flex的输入要么是文件要么是标准输入(控制台等)
而其输入的文件由正则表达式和C代码的形式组成
flex的输入文件由三段组成,由两个%%这样的符号将文件划分为三部分
定义
%%
规则
%%
用户代码(C代码)
其中,定义分为两种:一种是变量声明,另一种是正则表达式声明
变量声明使用%{ 要声明的变量 %},声明格式与C语言相同
而正则表达式声明就不需要使用%{%}这个符号,直接定义即可,声明格式为:表达式名称:表达式
规则部分:一个规则一行,每行有两部分构成:
正则表达式 {动作函数}
代码部分:用户自定义过程,直接复制到lex.yy.c末尾
那么进入正题,windows下怎么安装flex呢?
下载网址:http://gnuwin32.sourceforge.net/packages/flex.htm
进入网址后,下载“Complete package,except sources”,点击“Setup”链接即可。
下载完成后,将得到一个exe文件,直接安装。
全都安装好以后还要设置一下环境变量Path,即需要将flex的安装目录添加到Path中
打开右键->我的电脑→属性→高级系统设置->环境变量->系统变量->Path->编辑->新建->输入flex的安装目录具体到bin目录下->确定
退出后,打开CMD,输入flex - V,记住这里的v要大写。若安装成功就会显示flex的版本号
准备flex的输入文件find.l,给文件的内容为:
%%
[+-]?[0-9]+ ?{ printf("%s\n", yytext); } ?/* Print integers /
\n ????{?}??/ newline /
. ????{?}??/ For others, do nothing */
%%
void main(){
????yylex();
}
int yywrap(){
????return 1;
}
很显然,这段代码是用来匹配数字的,打开CMD,切换工作目录到当前文件下,输入命令:
flex find.l
将会得到一个lex.yy.c文件,lex.yy.c文件的内容很丰富
而在windows中想要编译.c文件则需要安装MinGW编译器(当然,编译.c文件不是只有MinGW一种选择,只是这里使用MinGW编译器罢了)
该编译器可直接前往官网下载,同样下载后需要将编译器的安装目录(需要具体到bin目录下)添加到Path中
添加完毕后,打开CMD,并切换到lex.yy.c文件的目录下
gcc lex.yy.c
执行命令后,将会得到a.exe可执行文件
a.exe文件既可以接受标准输入,也可以接受文件输入
接受标准输入:
接受文件输入
可以看到编写的find.l文件确确实实起到了匹配数字的作用