编译原理课程设计编译器实现

上传人:xins****2008 文档编号:115433212 上传时间:2019-11-13 格式:DOC 页数:13 大小:675KB
返回 下载 相关 举报
编译原理课程设计编译器实现_第1页
第1页 / 共13页
编译原理课程设计编译器实现_第2页
第2页 / 共13页
编译原理课程设计编译器实现_第3页
第3页 / 共13页
编译原理课程设计编译器实现_第4页
第4页 / 共13页
编译原理课程设计编译器实现_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《编译原理课程设计编译器实现》由会员分享,可在线阅读,更多相关《编译原理课程设计编译器实现(13页珍藏版)》请在金锄头文库上搜索。

1、题 目利用LEX自动生成词法分析程序学 院计算机科学与技术学院专 业班 级姓 名指导教师2014年1月2日目录1.引言42.需求分析分析52.1 LEX编译系统的重要性53.总体设计及开发工具的选择63.1开发工具6 3.2总体设计64.设计原则6 4.1LEX编译程序产生词法分析程序的过程6 4.1.1LEX编译程序产生DFA的过程6 4.1.2产生控制程序的过程65.数据结构76.详细设计87.调试与结果108.收获与体会129.结束语1210.参考文献13利用LEX自动生成词法分析程序1. 引言 Lex是LEXical compiler的缩写,是Unix环境下非常著名的工具。主要功能是生

2、成一个词法分析器的C源码,描述规则采用正则表达式。描述词法分析器的文件*.l,经过lex编译后,生成一个lex.yy.c 的文件,然后由C编译器编译生成一个词法分析器。词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的标识符,转化后的标识符 很容易被后续阶段处理。 我们知道,正规式用于说明(描述)单词的结构十分清晰。而把一个正规式编译(或称转换)为一个NFA进而转换为相应的DFA,这个NFA货DFA正是识别该正规式所表示的语言的句子的识别器,LEX正是基于这种方法来构造词法分析程序的工具。LEX被设计用来对输入字符流进行词法处理。它接受一种高级的、面向问题的说明书,并用它匹配字符串

3、中的字符、生成能够识别正则表达式的程序。正则表达式通过用户输入的代码说明书给入。Lex识别这些表达式,并且将输入流分成一些匹配这些表达式的字符串。在这些字符串的分界处,用户提供的程序片段被执行。Lex代码文件将正则表达式和程序片断关联。对每一条输入到由Lex生成程序的表达式,相应的代码片段被执行。为了完成任务,除了需要提供匹配的表达式以外,用户还需要提供其它代码,甚至是由其他生成器产生的代码。用户提供一般程序设计语言的代码片断完成程序识别表达式。因此,用户自由编写动作时,并不影响其编写高层的表达式语言来匹配字符串表达式。这就避免迫使用户使用字符串语言来进行输入分析时,也必须使用同样的方法来编写

4、字符处理程序,而这样做有时是不合适的。Lex不是完整的语言,但是是一个新语言的生成器,它可以插入到各种不同的被叫做“宿主语言”的程序设计语言中。就像大多数目的语言可以生成在不同计算机硬件上运行的代码,Lex可以生成不同的宿主语言。宿主语言用于Lex生成输出代码,也用于用户插入程序片断。这使得Lex适用于不同的环境和不同的使用者。每一个应用程序可以是硬件、适用于该任务的宿主语言、用户背景和局部接口属性的直接结合。现在,Lex唯一支持的宿主语言是C,尽管Fortran在过去也被支持。Lex自身存在于UNIX、GCOS和OS/370上;但是Lex生成的代码可以在任何适当的编译器上使用。2.需求分析2

5、.1LEX编译系统的重要性词法分析程序手工编写极为繁琐,依赖于LEX编译系统可以实现词法分析程序的自动产生,LEX编译系统的作用如图1所示,LEX编译系统读入LEX语言源程序(该程序是用正规式描述的某语言的词法),产生LEX语言目标程序(该程序即为某语言的词法分析程序)。在UNIX环境中LEX.l为LEX的源程序,LEX.yy.c为LEX的目标程序,LEX.yy.c是个C程序,它包括从正规式构造的有穷自动机DFA,以及使用该DFA识别单词的控制程序。LEX.yy.c经过C编译程序生成目标文件a.out,这便是词法分析程序,它可以将输入字符流变换成单词流,使用LEX生成词法分析程序的过程如图2所

6、示。图一 LEX编译系统的作用图二 使用LEX生成词法分析器3.总体设计及开发工具的选择3.1开发工具LEX编译器环境:flex builder 2.0编程语言:C3.2总体设计LEX语言是一种描述性语言,LEX源程序主要用来描述各类语言的词法,LWX源程序由三部分组成,说明部分、转换规则和辅助过程。用%作间隔符。a. 说明部分主要用正规式定义单词的构词原则。b. 转换规则是如下形式的语句:P1|action 1|P2|action 2|Pn|action n|其中,每个Pi是一个正规式,标示某类单词的词形,action i 是一段C程序代码,表示词法分析时识别出符合词形Pi的单词后应做的动作

7、,如将该单词转化为内部形式,登录符号表等。c.辅助过程容纳的是action部分需要的辅助过程,这些过程可分别编译并置于词法分析器中。4. 设计原则4.1LEX编译程序产生词法分析程序的过程要自动生成X语言的词法分析程序,需先编写LEX源程序来描述X语言的词法,之后LEX编译程序处理LEX源程序,构造一个DFA和一个控制程序,DFA和控制程序相互配合就可以作为X语言的词法分析程序。4.1.1LEX编译程序产生DFA的过程a. 将各类单词的正规式转化为DFAb. 将各类单词正规式对应的DFA按相同的初态0连接成一个完整的DFA M4.1.2产生控制程序的过程LEX编译程序产生控制程序是通用的,不同

8、的LEX源程序对应的控制程序的流程是相同的,控制程序流程如图三所示。图三中的限制条件是控制程序已读入的符号串长度是否大于正在识别的单词的最大长度。图三中识别出i个单词后的后续处理是LEX源程序中的转换规则部分的动作代码。DFA M和图三的控制程序配合即为词法分析程序。图三 控制程序5. 数据结构 lex提供的外部数据结构(1)yytext :外部字符数组,其内容是当前被匹配的字符串。每识别出一个字符串,yytext中的内容即被替换。(2)ECHO :宏,Printf(“s”,yytext);将yytext的内容打印出来。(3)yyleng :外部变量,当前yytext中字符的个数。即当前匹配的

9、字符串的长度。例:输入串中 单词的个数 和 字符的个数 记数azAZ+words;chars yyleng;注意:被匹配字符串的第一个和最后一个字符分别为yytext0,和yytextyyleng-16. 详细设计综合运用LEX编程。a. 将输入文件中的小写字母转换成大写字母,并输出到屏幕上b. 识别出文件中的标识符,然后将识别出的标识符输出到屏幕上。c. 将输入串中所有能被7整除的整数加上3,将结果输出到屏幕上.其余部分照原样输出.d. 构造一个识别C语言的单词的词法分析程序。源程序:A.%#include#include#include%a-zprintf(%c,yytext0+A-a);

10、%main()yylex();return0;intyywrap()return1;B.%#include#include%a-zA-Za-zA-Z0-9*printf(%sn,yytext);%main()yylex();return0;intyywrap()return1;C.#include#includeinta;%0-90-9*a=atoi(yytext);if(a%7=0)printf(%d,a+3);elseprintf(%d,a);%main()yylex();return0;intyywrap()return1;D.%#include%DIGIT0-9IDa-za-z0-9*

11、%DIGIT+|-DIGIT+printf(整数:%s(%d)n,yytext,atoi(yytext);DIGIT+.DIGIT*printf(浮点数:%s(%g)n,yytext,atof(yytext);if|case|char|continue|default|do|double|else|float|for|int|return|switch|while|voidprintf(关键字:%sn,yytext);+|-|*|/|+|-|+=|-=|*=|/=|=|=|0)yyin=fopen(argv0,r);elseyyin=stdin;*/yyin=fopen(test.c,r);/*从源文件中读取*/yylex();intyywrap()return1;7. 调试与结果8.收获与体会 通过此次对于利用LEX自动生成词法分析程序的学习,我初识了LEX编程语言和环境。在整个课设的过程中我遇到了很多困难,从对于词法分析的小错误导致的无法编写代码,到对LEX编译系统了解的缺乏,让我不知道无从下手,不过在查阅一些资料及在网上找资料及教程后,有了一些提高。最后Flex使我遇到了难题,最终无法做出完美的词法分析程序。不过在整个课程设计的过

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

当前位置:首页 > 大杂烩/其它

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