使用flex进行词法分析
2019-06-17 本文已影响0人
哆啦A梦没有毛
第一步:
安装flex程序,命令如下:
sudo apt-get install flex
第二步:
编辑exp1.l文件并保持,文件内容如下:
%{
#include <stdio.h>
int lineno = 1;
%}
KEYWORD (else)|(if)|(int)|(return)|(void)|(while)
OPT [+]|[-]|[*]|[/]
RELOP [<]|[<][=]|[>]|[>][=]|[=][=]|[!][=]|[=]
LP \(
RP \)
LB \[
RB \]
LC \{
RC \}
COM ,
END ;
ID [a-zA-Z]*
NUM [0-9]*
SPACE [\n\t]
STR \"(.*)\"
OTHER [#\._]
%%
{KEYWORD} {
printf("\tget keyword:%10s\n",yytext);
}
{OPT} {
printf("\tget opt:%10s\n",yytext);
}
{RELOP} {
printf("\tget relop:%10s\n",yytext);
}
{LP} {
printf("\tget lp:%10s\n",yytext);
}
{RP} {
printf("\tget rp:%10s\n",yytext);
}
{LC} {
printf("\tget lc:%10s\n",yytext);
}
{RC} {
printf("\tget rc:%10s\n",yytext);
}
{LB} {
printf("\tget lb:%10s\n",yytext);
}
{RB} {
printf("\tget rb:%10s\n",yytext);
}
{COM} {
printf("\tget com:%10s\n",yytext);
}
{END} {
printf("\tget end:%10s\n",yytext);
}
{ID} {
printf("\tget id:%10s\n",yytext);
}
{NUM} {
printf("\tget NUM:%10s\n",yytext);
}
{SPACE} {
printf("\tget space\n");
}
{STR} {
printf("\tget string:%10s\n",yytext);
}
{OTHER} {
printf("\tget other:%10s\n",yytext);
}
%%
int main()
{
yylex();
return 0;
}
第三步:
使用flex将对应的exp1.l文件翻译为exp1.yy.c文件,命令如下:
flex -o exp1.yy.c exp1.l
第四步:
使用gcc将exp1.yy.c编译为可执行文件exp1.out,命令如下:
gcc exp1.yy.c -o exp1.out -lfl
第五步:
运行exp1.out程序进行词法分析:
- 直接输入语句运行(./exp1.out):
- 通过管道将使用flex生成的exp1.yy.c文件作为该词法分析程序的输入(./exp1.out < exp1.yy.c | more):