Flex 词法分析实验实现(电子科技大学编译技术Icoding实验)

您所在的位置:网站首页 float属性值包括 Flex 词法分析实验实现(电子科技大学编译技术Icoding实验)

Flex 词法分析实验实现(电子科技大学编译技术Icoding实验)

2023-12-15 13:22| 来源: 网络整理| 查看: 265

Flex 词法分析

此为电子科技大学编译技术 实验1:词法分析

将具体实现中的三个文件和自己的实验报告一起上传才能通过

根据词法分析实验中给定的文法,利用 flex 设计一词法分析器,该分析器从标准输入读入源代码后,输出单词的类别编号及附加信息。 附加信息规定如下: 当类别为 Y_ID、num_INT 或 num_FLOAT 时,附加信息为该类别对应的属性,如 main, 100, 29.3等; 当类别为 关键字 时,附件信息为 KEYWORD; 当类别为 运算符 时,附件信息为 OPERATOR; 当类别为 其它符号时,附件信息为 SYMBOL

单词类别的定义:

enum yytokentype { num_INT = 258, num_FLOAT = 259, Y_ID = 260, Y_INT = 261, Y_VOID = 262, Y_CONST = 263, Y_IF = 264, Y_ELSE = 265, Y_WHILE = 266, Y_BREAK = 267, Y_CONTINUE = 268, Y_RETURN = 269, Y_ADD = 270, Y_SUB = 271, Y_MUL = 272, Y_DIV = 273, Y_MODULO = 274, Y_LESS = 275, Y_LESSEQ = 276, Y_GREAT = 277, Y_GREATEQ = 278, Y_NOTEQ = 279, Y_EQ = 280, Y_NOT = 281, Y_AND = 282, Y_OR = 283, Y_ASSIGN = 284, Y_LPAR = 285, Y_RPAR = 286, Y_LBRACKET = 287, Y_RBRACKET = 288, Y_LSQUARE = 289, Y_RSQUARE = 290, Y_COMMA = 291, Y_SEMICOLON = 292, Y_FLOAT = 293 };

例如对于源代码

int main(){ return 3; }

词法分析器的输出为:

1 具体实现

以下具体实现分为了三个文件 —— token.h,lexer.l,lexer_main.c

当然你也可以直接写成一个 .l 文件,具体看补充

1.1 头文件 token.h

创建一个头文件 token.h,定义了词法分析器中所需的标记类型和附加信息的数据结构;这个头文件中包含了枚举 yytokentype,定义了各种标记类型的类别编号,以及一个联合 _YYLVAL,用于存储附加信息,具体代码如下:

#ifndef TOKEN_H #define TOKEN_H enum yytokentype { num_INT = 258, num_FLOAT = 259, Y_ID = 260, Y_INT = 261, Y_VOID = 262, Y_CONST = 263, Y_IF = 264, Y_ELSE = 265, Y_WHILE = 266, Y_BREAK = 267, Y_CONTINUE = 268, Y_RETURN = 269, Y_ADD = 270, Y_SUB = 271, Y_MUL = 272, Y_DIV = 273, Y_MODULO = 274, Y_LESS = 275, Y_LESSEQ = 276, Y_GREAT = 277, Y_GREATEQ = 278, Y_NOTEQ = 279, Y_EQ = 280, Y_NOT = 281, Y_AND = 282, Y_OR = 283, Y_ASSIGN = 284, Y_LPAR = 285, Y_RPAR = 286, Y_LBRACKET = 287, Y_RBRACKET = 288, Y_LSQUARE = 289, Y_RSQUARE = 290, Y_COMMA = 291, Y_SEMICOLON = 292, Y_FLOAT = 293 }; typedef union _YYLVAL{ int token; int int_value; float float_value; char* id_name; }_YYLVAL; #endif //TOKEN_H 1.2 Flex文件 lexer.l

创建Flex规则文件 lexer.l,其中包含词法分析器的规则定义:

注释处理:规则中包括了处理注释的规则 (\/\/.*\n)|(\/\*.*\*\/),可以将注释从源代码中过滤掉

十六进制整数:规则可以成功地识别十六进制整数,例如 0x10

标识符:规则中有处理标识符的规则,注意,使用了 strdup(yytext) 来为标识符分配内存。这会为每个标识符创建一个新的动态分配的字符串,要确保在适当的时候释放这些字符串以避免内存泄漏

操作符:规则包括处理各种操作符的规则

浮点数:规则可以成功地识别浮点数,但需要注意浮点数的格式。当前规则要求小数点前面至少有一个数字,例如 0.1,而不支持 .1 这种形式

-? 匹配可能的负数或正数;它以可选的减号 “-” 开头,然后匹配一个或多个数字

数值的存储:规则中将整数存储为 yylval.int_value,浮点数存储为 yylval.float_value

具体代码:

%{ #include "token.h" %} _YYLVAL yylval; %% [ \t\n] ; (\/\/.*\n)|(\/\*.*\*\/) ; int { return Y_INT; } float { return Y_FLOAT; } void { return Y_VOID; } const { return Y_CONST; } if { return Y_IF; } else { return Y_ELSE; } while { return Y_WHILE; } break { return Y_BREAK; } continue { return Y_CONTINUE; } return { return Y_RETURN; } "+" { return Y_ADD; } "-" { return Y_SUB; } "*" { return Y_MUL; } "/" { return Y_DIV; } "%" { return Y_MODULO; } "


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3