【编译原理】利用Flex工具生成C语言词法分析器

本文介绍如何利用Flex工具创建一个能识别C语言关键字、标识符、注释、整数和浮点数的词法分析器。Flex允许在lex文件中定义状态,例如通过BEGIN COMMENT进入<COMMENT>状态来处理多行注释。
摘要由CSDN通过智能技术生成

Flex构造C语言词法分析器
可以识别大部分的C语言关键字和标识符,可以去除注释(多行单行都可以),可以识别整数和浮点数,可以识别错误的浮点数。

lex文件结构:

  [第一部分:定义段]
 /*
  *按照C语言语法,声明文件包含,宏定义,常数定义,全局变量及外部变量定义,函数声明等
  */
  %%
  第二部分:词法规则段
   /*
  *核心部分,正则定义和状态定义(解释见后)
  */
  %%
  第三部分:辅助函数段]
   /*
  * 辅助函数段用C语言语法来写,辅助函数一般是在词法规则段中用到的函数。这一部分一般会被直接拷贝到lex.yy.c中。
  */

状态定义:

"//".* {
   }
"/*" {
   BEGIN COMMENT;}
<COMMENT>"*/" {
   BEGIN INITIAL;}
<COMMENT>. {
   }

这一部分是根据不同的状态使用不同的规则,比如要识别多行注释,则添加BEGIN COMMENT即可转移到< COMMENT >状态。

代码如下:

在这里插入代码片/*
 *t2.lex 词法分析器
 *班级:计科1604
 *学号:1030416414
 *姓名:wyc(ORION233)
 *时间:2018-11-4
 */
%option pointer
%option noyywrap
%x COMMENT
%{
   
	#include <stdio.h>
	#include <string.h>
	#define MAXLEN 100
	#define MAXTYPE 10
	#define MAXSTR 15

	char *a[MAXTYPE] = {
   "type","for","integer","decimal","identify","bracket","QUOTE","OPT","float"};
	struct {
   
		int line;	//store line numbers
		int id;		// store tag
		char text[MAXSTR];	//store yytext
	}tag[MAXLEN];	//store tags
	int flag = 0;	//error flag
	int cnt = 0;	//array notation counter
    int line=1;		//line counter
%}
DIGIT [0-9]
OINTEGER [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值