flex的简单使用
(1)将flex.exe和创建的text.lex放在同一文件夹下;
(2)在DOS命令提示符下执行编译 flex text.lex 得到目标文件 lex.yy.c;
(3)在VC或CB中运行lex,yy.c,产生可执行程序lex.yy.exe
(4)运行可执行文件,执行其功能。
注意:
flex将简单使用到命令符:
进入D盘: D:
进入文件夹Text : cd Text
Text文件夹如下图:
例题:
输入一个 C 源程序文件, 用 FLex 实现以下任务
a) 添加行号。
b) 将文件中每个非空的空白符号序列替换为单个空格。
c) 将文件中所有关键字转换为大写字母。
d) 将文件中所有标识符转换为小写字母,且以下划线开头。
(a)添加行号。
%{
#include <stdio.h>
int lineno=1;
%}
%%
[^\n] {yymore();}
\n {printf("%1d %s",lineno++,yytext);}
%%
int yywrap(void)
{
return 1;
}
main()
{
yylex();
}
运行结果:
(b)将文件中每个非空的空白符序列替换为单个空格。
%%
[\t]+ {printf(" ");}
%%
int yywrap(void)
{
return 1;
}
main()
{
yylex();
}
运行结果:
(c)将文件中所有关键字转换为大写字母。
%{
#include <stdio.h>
%}
id auto|double|int|struct|break|else|long|switch|case|enum|register|typedef|char|extern|return|union|const|float|short|unsigned|continue|for|signed|void|default|goto|sizeof|volatile|do|if|while|static
%%
{id} {
int i;
for(i=0;i<yyleng;i++)
{
if(yytext[i]>='a'&&yytext[i]<='z')
printf("%c",yytext[i]+'A'-'a');
else
printf("%c",yytext[i]);
}
}
%%
int yywrap(void)
{
return 1;
}
main()
{
yylex();
}
运行结果:
(d)将文件中所有标识符转换为小写字母,且以下划线开头。
%{
#include <stdio.h>
%}
id [A-Za-z_][A-Za-z0-9_]*
%%
{id} {
int i;
for(i=0;i<yyleng;i++)
{
if(yytext[i]>='A'&&yytext[i]<='Z')
yytext[i]=yytext[i]+'a'-'A';
}
printf("_%s",yytext);
}
%%
int yywrap(void)
{
return 1;
}
main()
{
yylex();
}
运行结果: