编译原理课程设计报告--实现C-C++语言的词法分析器

编译原理课程设计报告--实现C-C++语言的词法分析器

ID:35617897

大小:481.50 KB

页数:17页

时间:2019-04-02

编译原理课程设计报告--实现C-C++语言的词法分析器_第1页
编译原理课程设计报告--实现C-C++语言的词法分析器_第2页
编译原理课程设计报告--实现C-C++语言的词法分析器_第3页
编译原理课程设计报告--实现C-C++语言的词法分析器_第4页
编译原理课程设计报告--实现C-C++语言的词法分析器_第5页
资源描述:

《编译原理课程设计报告--实现C-C++语言的词法分析器》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、编译原理课程设计报告题目名称实现C/C++语言的词法分析器班级计算机二班学号2402090206姓名蒋阳斌指导教师宁航编写时间2011.12.26—2011.12.3017一、课程设计题目名称实现C/C++语言词法分析器二、课程设计目的与任务(1)输入:C/C++源代码文件,即后缀为c/cpp的文件。(2)输出:后缀为tok的文本性文件。(3)实现功能:完成C/C++语言的词法分析器(C语言词法记号及其含义详见附件一)词法记号含义LB“{”LP“(”RB“}”RP“)”PLUS“+”……三、设计思想和实现方法(一)、Lex是一种生成扫描器的工具,(我是在Lunix 操作系统

2、下安装flex,进行编程的)Lex程序编程分为以下四步:1.Lunix下用vi命令编写lex程序,我的文件是lex.l,编写好后,保存并退出。2.使用命令flexlex.l,编译系统自动生成了lex.yy.c的C文件。3.使用命令gcclex.yy.c-ll,生成可执行的扫描器a.out文件。4.使用命令a.outfile1.c,其中file1.c为要进行此法扫描的C文件。我要做的就是编写C语言词法的正则表达式,以及需要识别的各种词法记号和匹配后需要执行的动作即可,其他的操作都可以交给Lex来执行。(二)、词法分析器的作用如下:1.词法分析器的主要任务是读入源程序的输入字符

3、2.17过滤掉源程序中的注释、空白(空格、换行符、制表符以及输入中用于分割词法单元的其他字符)1.对源程序进行预处理,如对源程序的宏展开2.将编译器生成的错误消息与与源程序的位置对应起来;(三)、对于此题,我使用Lex编程来自动生成词法分析器。使用Lex编程的重点与难点是正则式的定义,对于容易产生二义性的正则表达式,我们要借助与辅助函数来解决。以下为一个二义性的解决;plus({Int}

4、{Float}

5、{id}){blank}?+//加号的正则定义{plus}{install(yytext,PLUS);}//转换规则里的模式{动作}需要说明的是:当‘+’左边为一个标示符

6、(id)或数字(num)时,我们才认为它是加号;否则为正号。但匹配到plus正则式时,我们调用intinstall()辅助函数,intinstall()函数再把“+”前面的标示符(id)或数字(num)与“+”分离开来,其余三个容易产生歧义的符号,也采用同种处理方法,install()辅助函数的定义,将在本报告的第四部分<程序说明>中给出。四、程序说明Lex是一种生成扫描器的工具,我们可以通过编写Lex文件来实现识别文本中的词汇模式的程序。一个Lex程序可具有如下形式:声明、定义部分%%转换规则%%辅助函数1、声明部分包括变量和明示常量(被声明的表示一个常数标示符,如一个此

7、法单元的名字)的声明,本程序声明部分包括:C语言的头文件,及为每个关键字定义一个宏常量,为避免与ASCII冲突,数值从257开始。定义部分同时给出了正则表达式。第一段的部分如下,详细见附件二声明部分%{#include#include#includeintyywrap();#defineLB257#defineLP258….….#defineREAL_LITERAL367#defineSTRING368#defineCHARACTER36917#defineNUM370%}正则表达式blankdelim[t]

8、ws{delim}+FloatE?{digit}+(.{digit}+)+(e{E}?{digit}+)?[Ff]id{letter}({letter}

9、{digit})*incom(/*[^*]**+([^/*]**+)*/)

10、(//(.)*)mul({Int}

11、{Float}

12、{id}){blank}?*//乘号的正则定义Bit({Int}

13、{Float}

14、{id}){blank}?&//按位与的正则定义plus({Int}

15、{Float}

16、{id}){blank}?+//加号的正则定义sub({Int}

17、{Float}

18、{id}){blank}?

19、-//减号的正则定义2.LEX程序的每个转换规则具有如下形式:    模式{动作}其中,每个模式是一个正则表达式,我的程序的正则表达式的定义全部在声明部分给出。动作部分是代码片段。以下为转换规则部分{plus}{install(yytext,PLUS);}{sub}{install(yytext,MINUS);}{mul}{install(yytext,MULT);}"+="{printf("<%s,%d>",yytext,PLUSA);}"-="{printf("<%s,%d>",yytext,MINU

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。