lex与yacc程序学习(2)——lex源程序的结构&实践 lex的上机过程

主要内容:lex源程序的结构+lex编译器的使用

一、lex源程序的结构

声明部分
%%
识别规则
%%
辅助函数

由三个部分构成,三个部分之间由两个%%进行分割。

识别规则是单词符号的识别规则,也是lex程序的主体部分。

在上一篇文章中有写(https://blog.csdn.net/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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值