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 [