主要内容:lex源程序的结构+lex编译器的使用
一、lex源程序的结构
声明部分
%%
识别规则
%%
辅助函数
由三个部分构成,三个部分之间由两个%%进行分割。
识别规则是单词符号的识别规则,也是lex程序的主体部分。
在上一篇文章中有写(https://blog.youkuaiyun.com/wang_yr/article/details/106004464)
在识别单词符号的过程中如果需要一些辅助功能,可以写成辅助函数,放到第三个部分中,并且辅助函数不许使用c语言,因为lex源程序经过编译后生成c语言程序。
最简单的lex源程序:
%%
%%
int main(void)
{
print("hello,world!\n");
return 0;
}
int yywrap()
{
return 1;
}
该程序不执行任何词法分析的功能,可以用此程序测试lex环境是否安装成功。
其中,yywrap函数用来处理程序源文件函数,是词法分析时一定会调用的函数,这里不做复杂处理。
1、声明部分
%{
/* 变量、符号常量等的声明,
直接复制到flex.yy.c中,
内容要符合c语言的语法规范。 */
%}
//正规定义式
digit->[0-9] //表示:0|1|2|3|4|5|6|7|8|9
letter->[A-Za-z] //表示大小写中的任意字母
id->letter(letter|digit)* //表示由字母开头的后面跟0个或多个字母或数字组成的符号串(标识符)
2、识别规则
P1 {A1}
P2 {A2}
... ...
Pm {Am}
pi:正规式,称为词形。
Ai:一小段c语言程序代码。在识别出词形为Pi的单词之后,词法分析器应采取的动作。
Ai的基本组成成分:返回Pi的种别编码和属性值。return(code,value)
%%
{digit} {printf("Saw an integer:%s\n",yytext); /*return(NUM);*/}
"if" {printf("Saw a key word:%s\n",yytext); /*return(IF);*/}
"while" {printf("Saw a key word:%s\n",yytext); /*return(WHILE);*/}
"<" {printf("Saw an operator:%s\n",yytext); /*return(LT);*/}
"<=" {printf("Saw an operator:%s\n",yytext); /*return(LE);*/}
\n {printf("Saw an Enter:%s\n",yytext); /*return(ENTER);*/}
%%
3、辅助函数
所有内容被直接复制到lex.yy.c中,内容要符合c语言的语法规范。
int main(void){
/*Call the lexer,then quit*/
yylex(); /*预定义的词法分析函数*/
return 0;
}
int yywrap(){
return 1;
}
二、实践过程
Idemo.l文件
%{
#include<stdio.h>
#define LT 0
#define WHILE 1
#define NUM 2
#define IF 3
#define LE 4
#define ENTER 5
%}
digit [0-9]+
%%
{digit} {printf("Saw an integer:%s\n",yytext); /*return(NUM);*/}
"if" {printf("Saw a key word:%s\n",yytext); /*return(IF);*/}
"while" {printf("Saw a key word:%s\n",yytext); /*return(WHILE);*/}
"<" {printf("Saw an operator:%s\n",yytext); /*return(LT);*/}
"<=" {printf("Saw an operator:%s\n",yytext); /*return(LE);*/}
\n {printf("Saw an Enter:%s\n",yytext); /*return(ENTER);*/}
%%
int main(void){
/*Call the lexer,then quit*/
yylex();
return 0;
}
int yywrap(){
return 1;
}
打开命令提示符cmd,
输入命令:
flex 文件名.l
编译命令
gcc lex.yy.c
出了一点小问题,突然发现电脑没装MinGW...???
……
安装好了,继续
这时候会发现UnxUtils文件下多出一个a.exe文件
执行a.exe
输入可识别符号 if while < <= 45 89