linux下flex构造词法生成器(从安装到实现——傻瓜教程)

安装Flex和Bison

首先我们进入linux环境(小编是Ubuntu版本),键入命令

sudo apt-get install flex bison

之后就进入安装过程,可能会有无法生成锁的问题,请参考小编的博文apt-get无法获得锁问题解决

Flex自动生成工具

接下来我们测试一下flex。首先我们要创建一个.l文件作为Flex工具的编译文本,键入命令

vim test.l

打开test.l文件后我们输入以下代码

%{
#include <stdlib.h>
#include <stdio.h>
#define NUM 201612345
int num_chars = 0;
int num_ids=0;
int num_lines=1;
%}
delim [ ]
letter [A-Za-z]
digit [0-9]
number {digit}+
id {letter}+

%%
\n {num_lines++;printf("\n");}
{number} {int r=atoi(yytext);
	  if(r==NUM)   printf("夏天的鼻涕怪 "); 
  	  else         printf("%s ",yytext);
  	   num_ids++;
  	  }
{delim} {printf(" ");}
{id} {printf("%s ",yytext);num_chars+=yyleng;num_ids++;}

%%
main()
{
	yylex();
	printf("\n# of ids = %d ,# of chars = %d ,# of lines = %d ",num_ids , num_chars,num_lines);
}

关于flex语法结构的说明我们后文在做阐述。之后Esc——>:——>wq
在终端键入以下命令

flex -o lexdemo.yy.c test.l
gcc -o lexdemo lexdemo.yy.c -lfl

如果都通过了的话,说明已生成flex的可执行文件了。如果第一步报错可能flex安装有问题,重装即可;如果第二步报错,说明我们的test.l文件有语法错误,需要修改。接下来就是执行文件

./lexdemo

如果我们的测试代码存到文件(txt)中了,那么直接键入命令

./lexdemo<a.txt

其中a.txt就是我们的测试代码
在这里插入图片描述
这个test.l的功能就是重复你键入的字符串。我们随便键入字符,他会返回相同的结果。至此Flex配置完毕!

Flex语法规则

以test.l文件的代码为例

%{
#include <stdlib.h>
#include <stdio.h>
#define NUM 201612345
int num_chars = 0;
int num_ids=0;
int num_lines=1;
%}

第一部分是全局声明,Flex语法其实和C差不多。这一部分可以把头文件,全局变量,函数声明写在里面。切记全局声明一定要写在%{ -------%}内。

delim [ ]
letter [A-Za-z]
digit [0-9]
number {digit}+
id {letter}+

第二部分是正则表达式的声明。就是一些产生式的规则之类的,可以直接通过flex的语法规则来书写。比方说letter [A-Za-z]的意思是,遇到自符A-Z或者a-z其中的任一个,就将之存入变量letter。正则表达式规则可参考Flex正则表达式的书写

%%
\n {num_lines++;printf("\n");}
{number} {int r=atoi(yytext);
 	if(r==NUM)   printf("夏天的鼻涕怪 "); 
     	else         printf("%s ",yytext);
      	num_ids++;
     	}
{delim} {printf(" ");}
{id} {printf("%s ",yytext);num_chars+=yyleng;num_ids++;}

之后每一部分需要用%%隔开。这一部分是操作。左边大括号里的标识符就是我们在正则表达式部分所定义的,而右边便是与之对应的操作(用C实现)。yytext就是获取的字符。举个栗子:对int a= 3进行词法分析。程序走到3这个位置,正则表达式将之重命名为number,而操作部分识别到number就会执行number后面大括号里的内容,yytext里储存的就是3(不过是字符数组型)。

%%
main()
{
 yylex();
 printf("\n# of ids = %d ,# of chars = %d ,# of lines = %d ",num_ids , num_chars,num_lines);
}

最后一部分呢就是main函数和其他自定义函数的实现,yylex()就是启动flex词法分析过程,main函数里的东西一般只加个yylex()就OK啦!

词法分析器的实现

词法分析器的demo1.l文件,已上传至github。词法分析器代码
部分代码的解读我标有注释。
大家按照我的操作流程,就能轻松运行啦!!!
——by dudu

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值