基于flex的词法分析器的设计和实现12页

上传人:文库****9 文档编号:173996850 上传时间:2021-03-15 格式:DOCX 页数:12 大小:562.20KB
返回 下载 相关 举报
基于flex的词法分析器的设计和实现12页_第1页
第1页 / 共12页
基于flex的词法分析器的设计和实现12页_第2页
第2页 / 共12页
基于flex的词法分析器的设计和实现12页_第3页
第3页 / 共12页
基于flex的词法分析器的设计和实现12页_第4页
第4页 / 共12页
基于flex的词法分析器的设计和实现12页_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《基于flex的词法分析器的设计和实现12页》由会员分享,可在线阅读,更多相关《基于flex的词法分析器的设计和实现12页(12页珍藏版)》请在金锄头文库上搜索。

1、课程设计1 基于Flex的词法分析器设计及实现1.1 需求分析1.1.1 问题定义1、 通过对 flex 基本知识的阅读,了解其工作原理和过程以及其匹配模式和规则,掌握简单的 lex 语法和规则; 2、 在上述基础上能够自主编写出简单且可以运行的词法分析器,实现简单的词法分析功能;3、 通过实验,设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。1.1.2 功能描述本次编制调试的词法分析器基本可以实现如下简单功能: 1、 可以匹配识别关键字:else if switch for int float retu

2、rn void while(所有的关键字都是保留字,并且必须是小写) ;2、 可以匹配识别专用符号: + - * / = = != = ; ,( ) /* */; 3、 标识符(ID) 和数字(NU )通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|9;4、可以匹配识别空格(空格由空白、换行符和制表符组成,空格通常被忽略,除了它必须分开 ID、NUM 关键字); 5、可以识别简单的注释(/* 注释内容*/) ;1.1.3 开发环境及工具介绍1、Window环境下载Visua

3、l Studio之后,利用其命令提示窗口进行操作。下载并安装Flex。 2、vs2010的编译器cl.exe。3、flex:词法分析器Flex是用来生成程序的工具,他们所生成的程序能够处理结构化输入,最初的Flex是用来生成编译器的,但是后来他们被证明在其他领域也非常有效。Flex是一个SourceForge项目。其依赖于GNU m4宏处理器。Linux和BSD都应该有m4,对于Windos用户来说,Flex被包含在Cygein Linux模拟环境中。什么是FLEX?它是一个自动化工具,可以按照定义好的规则自动生成一个C函数yylex(),也成为扫描器(Scanner)。这个C函数把文本串作为

4、输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作(Action)。例如在规则中可以这样定义:如果遇到一个换行字符n,那么就把行计数器的值加一。Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。1.2 系统概要设计1.2.1 系统体系结构 图1-1 体系结构图 图1-2 词法分析流程图1.2.2 系统模块划分Lex 工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序, 由该程序识别出输入文本中的各个单词。 一般可以分为。其中规则部分是必须的,定义和用户子程序部分是任选的。 (1) 定义部分:定义部分起始于

5、% 符号,终止于 % 符号,其间可以是包括 include 语句、声明语句在内的 C 语句。这部分跟普通 C 程序开头没什么区别。 (2) 规则部分:规则部分起始于%符号,终止于%符号,其间则是词法规则。词 法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由 C 语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex 将识 别出来的单词存放在 yytext字符数据中, 因此该数组的内容就代表了所识别出来的单词 的内容。类似 yytext 这些预定义的变量函数会随着后面内容展开一一介绍。动作部分如 果有多行执行语句,也可以用括起来。 (3) 用户子

6、程序部分:最后一个%后面的内容是用户子程序部分,可以包含用 C 语言 编写的子程序,而这些子程序可以用在前面的动作中,这样就可以达到简化编程的目的。这里需要注意的是,当编译时不带-ll 选项时,是必须加入 main 函数和 yywrap(yywrap 将 下后面说明)。 Lex 其实就是词法分析器, 通过配置文件*.l,依据正则表达式逐字符去顺序解析文件, 并动态更新内存的数据解析状态。Lex 善长于模式匹配。词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。词法分析阶段是编译过程的第一个阶段,是编译的

7、基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单 词符号或符号)。词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程序的常用途径:自动生成, 手工生成。1.3 详细设计与实现1.3.1 Lex代码的设计与实现lex 源代码编写 通过对 flex 的语法学习,掌握了编写的基本原则和步骤,因为实验要求编写一个简 单地词法分析器,根据实验所要求实现检查分析的功能,实验代码较为简单,以下是自己 编写的实验代码:letter a-zA-Z_ 定义字母letter dight 0-9 定义数字di

8、ght ID letter(letter)* 定义单词ID由若干个字母组成 NUM dight(dight)* 定义数字串NUM由若干个数字组成 B letter(dight|letter)* 定义标识符B 由数字戒字母组成 % int nchar, nword, nline; nchar 字符数 nword单词数 nline 行数int line=1; line 为当前行数 初始化为1 % % else|if|else if|switch|for|int|float|return|void|while nword+;nchar+=yyleng;printf(第 %d 行:t,line);pr

9、intf(关键字: %sn,yytext); 若匹配上 else int float 等上述的关键字:单词数+1;字符数增加相应的个数; 输出“第line 行 yytext n”; B nword+;nchar+=yyleng;printf(第 %d 行:t,line);printf(标识符: %sn,yytext); B nword+;nchar+=yyleng;printf(第 %d 行:t,line);printf(标识符: %sn,yytext); 若匹配上B 标识符:单词数+1;字符数增加相应的个数; 输出“第line 行 标识符:yytext n”; NUM nword+;ncha

10、r+=yyleng;printf(第 %d 行:t,line);printf(数字: %sn,yytext); 若匹配上NUM数字:单词数+1;字符数增加相应的个数; 输出“第line 行 数字:yytext n”;+|-|*|/|=|;|,|(|)| nchar+=yyleng;printf(第 %d 行:t,line);printf(与 %sn,yytext); 若匹配上+ - * / 等与:字符数增加相应的个数; 输出“第line 行 与 yytext n”; =|=|!=|/*|*/ nword+;nchar+=yyleng;printf(第 %d行:t,line);printf(与

11、%sn,yytext); 若匹配上 等与 :字符数增加相应的个数; 输出“第line 行 与 yytext n”; t+ nchar+; 若匹配上制表符:字符数+1;无输出; n nline+;line+;nchar+; 若匹配上回车n:字符数+1;行数+1;当前行数line+1;无输出; tn+ nword+;nchar+=yyleng;printf(第 %d 行:t,line);printf(其他符号: %sn,yytext); 若匹配上其他符号:字符数增加相应的个数;输出“第line 行 其他符号:yytext n”; % void main() yylex(); 调用 yylex 函数

12、 printf(字符数: %dt 单词数: %dt 行数: %dn, nchar, nword,nline); 最后输出字符数、单词数、行数 int yywrap() return 1; 最后将这些代码按照 flex 语法进行整合得到完整 flex 源码,得到源程序 lex1.l; 1.3.2 定义部分的设计与实现定义部份由C语言代码、模式的宏定义、条件模式的开始条件说明三部份组成。其中,C代码部份由顶行的%和%引入,LEX扫描源文件时将%和%之间的部分原封不动的拷贝到输出文件lex.yy.c中。上面的定义部分没有条件模式的开始条件说明部分,只有C语言代码、模式的宏定义。模式宏定义是一个正则表

13、达式的定义,如上面所示的INTEGER -+?1-90-9*。正则表达式的匹配如下:模式解 释x配置单个字母x.匹配除换行符n之外的任意字符xyz匹配x、y或zabj-oz匹配a、b、z及j至o之间的字母A-Z除大写字母A-Z之外的其它字符A-Zn除大写字母A-Z和换行符之外的其它字符r*匹配0个或多个rr+匹配1个或多个rr?匹配0个或1个r1.3.3 规则部分的设计与实现规则部份是LEX源文件的核心部份,它包括一组模式和在生成分析器识别相应模式后对相应模式进行处理的C语言动作(Action)。格式如下C语言代码模式1 动作1模式2|模式3 动作3同定义部分一样,C语言代码必须出现在第一个模

14、式之前,包括在%和%之中,且%必须顶行书写。%和%之间的代码部份可用来定义yylex()用到的局部变量。模式必须顶行书写。模式可为正规式或用括起且在定义部份定义过的宏名。动作为用括起的C代码。且开始括号与模式之间用白字符隔开,且须和模式在同一行上。注意,在模式后加一|表示模式2和3采用同一动作3.|和模式2以白字符隔开。1.3.4 模式匹配模块的设计与实现yylex()函数被调用之后,它首先检查全局文件指针变量yyin是否有定义,如有,则将之设置为将要扫描的文件指针。如无,则设置为标准输入文件stdin.同理,如全局文件指针变量yyout无定义,则将之设置为标准输出文件stdout。若有多个模式与被扫描文件中的字符串相匹配,则yylex()执行能匹配最长字符串的模式,称为“最长匹配原则”;若还有多个模式匹配长度相同的字符串,则yylex()选择在LEX

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号