linux下flex构造词法生成器(从安装到实现——傻瓜教程)
安装Flex和Bison首先我们进入linux环境(小编是Ubuntu版本),键入命令sudo apt-get install flex bison之后就进入安装过程,可能会有无法生成锁的问题,请参考小编的博文apt-get无法获得锁问题解决Flex自动生成工具接下来我们测试一下flex。首先我们要创建一个.l文件作为Flex工具的编译文本,键入命令vim test.l打开test....
安装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
更多推荐
所有评论(0)