使用flex进行词法分析

第一步:

安装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):
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容