编译原理实验.docx

上传人:工**** 文档编号:558387834 上传时间:2023-05-11 格式:DOCX 页数:44 大小:934.30KB
返回 下载 相关 举报
编译原理实验.docx_第1页
第1页 / 共44页
编译原理实验.docx_第2页
第2页 / 共44页
编译原理实验.docx_第3页
第3页 / 共44页
编译原理实验.docx_第4页
第4页 / 共44页
编译原理实验.docx_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《编译原理实验.docx》由会员分享,可在线阅读,更多相关《编译原理实验.docx(44页珍藏版)》请在金锄头文库上搜索。

1、实验1:源程序预处理一、 实验目的:对源程序进行预处理(函数实现,该函数以后还要用到;输入是源程序,输出是预处理过的程序)二、 实验内容:对源程序进行预处理,去掉空格,跳格,回车,换行,注释等;三、 实验要求:从文本文件中读入源代码文本字符串,预处理结束后写入另外一个文本文件中;实验2:构造词法分析器-自然分词一、 实验目的:从源程序中分离出单词并归类(自然分词构造词法分析程序)二、 实验内容:设计一个词法分析器,用 C 语言或者其他的高级语言实现;从预处理过的源代码文本文件(实验一的输出文件)中读取源代码字符串,词法分析输出的二元式写入另外一个文本文件中;三、 实验要求:1、需要识别出的关键

2、字序号关键字单词种别码属性值备注序号关键字单词种别码属性值备注1Auto17Int2Break18long3Char19return4Case20register5Const21short6continue22signed7Default23sizeof8Do24static9Double25struct10Else26switch11Enum27typedef12Extern28union13Float29unsigned14For30void15Goto31volatile16If32while2、需要识别出的运算符序号运算符运算符种别码运算符属性备注序号运算符运算符种别码运算符属性备注1

3、, 202(21423=524=6-25!=7.26&8!27|9+28=10-29+=11&30-=1231*=13*32/=14/33;15%3416+3517-36183、需要识别出常数常数类型(无符号)常数种别码常数属性备注整型常数(10进制)实型常数(10进制)4、根据文法绘制状态转化图(本图为示例图,实际的状态转化图要自己绘制完成)自定义函数或者使用到变量的意义 char buffer 字符数组,存放源代码的文本; char CHAR 字符变量,存放最新读进的源程序字符; char TOKEN 字符数组,存放构成单词的字符串; char GETCHAR(char buffer,in

4、t* searchIndex) 将下一输入字符读入CHAR,搜索指示器searchIndex前移一个字符; void GETBC(char buffer) 检查CHAR中的字符是否为空白。若是则调用GETCHAR直至CHAR中进入一个非空白字符。 void CONCAT(char TOKEN,char CHAR ) 把CHAR中的字符连接到TOKEN之后。 int LETTER(char CHAR) 判断CHAR中的字符是不是字母,从而给出真假值TRUE、FALSE。 int DIGIT(char CHAR) 判断CHAR中的字符是不是数字,从而给出真假值TRUE、FALSE。 void RE

5、SERVE(char RESERVE_TABLE,char TOKEN) 在保留字表RESERVE_TABLE中查找TOKEN void RETRACT(char buffer,int* searchIndex) 把搜索指示器回调一个字节,把CHAR中的字符置为空白。5、把状态转换图转化成程序,每个状态要建立一段程序,做的工作如下:第一步:从输入缓冲区中取一个字符。使用函数GETCHAR,每次调用,推进先行指针,送回一个字符。第二步:确定在本状态下,哪一条箭弧是用刚刚来的输入字符标识的。如果找到,控制就转到该弧所指向的状态;若找不到,那么寻找该单词的企图就失败了。失败:先行指针必须重新回到开始

6、指针处,并用另一状态图来搜索另一单词。如果所有的状态转换图都试过之后,还没有匹配的,就表明这是一个词法错误,此时,调用错误校正程序。典型状态转换图处理流程如下如上的状态转换图,处理代码如下所示: switch(state) case i: CHAR = GETCHAR(buffer ,searchIndex); if(LETTER( CHAR ) = TRUE ) CONCAT(TOKEN,CHAR); state = j ; else if( DIGIT(CHAR) = TRUE ) CONCAT(TOKEN,CHAR); state = k ; else if (CHAR=/) CONCA

7、T(TOKEN,CHAR); state = l; else FAIL(); break; 如上的状态转换图,处理代码如下所示: switch(state) case 0: CHAR = GETCHAR(buffer,searchIndex) ; if ( LETTER(CHAR)=TRUE ) CONCAT(TOKEN,CHAR); state = 1 ; else FAIL(); break; case 1: CHAR = GETCHAR(buffer,searchIndex); if ( LETTER(CHAR)=TRUE | DIGIT(CHAR) =TRUE ) CONCAT(TOKEN,CHAR); state = 1 ; else state = 2 ; break; case 2: /构造TOKEN对应的二元式 RETRACT( buffer, searchIndex) ; /返回多读去的一个字符 return TOKEN对应的二元式 ; 如上的状态转换图,处理代码如下所示: switch (state) case 3 : CHAR = GETCHAR(buffer,searchIndex); if ( DIGIT(CHAR)=TRUE ) CONCAT(TOKEN,CHAR); state = 3 ; else state = 4 ; break;

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

当前位置:首页 > 生活休闲 > 社会民生

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