版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验2 词法分析程序的设计一、实验目的掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1、根据以下的正规式,编制正规文法,画出状态图;标识符 (|)*十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和界符+ - * /
2、= ( ) ;关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能:1) 从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2) 以二元式形式输出单词其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。四、实验环境pc微机dos操作系统或 windows 操作系统turbo c 程序
3、集成环境或 visual c+ 程序集成环境五、实验步骤1、 根据正规式,画出状态转换图;01字母空白字母或数字非字母与数字3194092非数字5061707非0778x909或af非09与af1011+ 或或* 或/ 或 或= 或 (或 ) 或 ;12if then else while do*非17与x09或af2、 根据状态图,设计词法分析算法;观察状态图,其中状态2、4、7、10(右上角打了星号)需要回调一个字符。声明一些变量和函数:ch:字符变量,存放最新读进的源程序字符。strtoken:字符串变量,存放构成单词符号的字符串。getchar():子函数,将下一输入字符读到ch中,搜
4、索指示器前移一字符位置。getbc():子函数,检查ch中的字符是否为空白。若是,则调用getchar()直至ch中进入一个非空白字符。concat():子函数,将ch中的字符连接到strtoken之后。isletter():布尔函数,判断ch中的字符是否为字母。isdigit():布尔函数,判断ch中的字符是否为数字。reserve():整型函数,对strtoken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0。searchop():整型函数,对ch查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0。retract():子函数,将搜索指示器回调一个字符位
5、置,将ch置为空白字符。proerror():错误处理函数。关键字保存在字符数组中,定义编码为相对数组首地址的位置 + 1。保留子表顺序如下: if ,then,else,while,do ,则相应编码为:1,2,3,4,5。运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下: + ,- , * , / , , , = , ( , ) , ;,编码为:110。二元表单词单词种类属性标识符0单词自身十进制整数1单词自身八进制整数2单词自身十六进制整数3单词自身运算符和界符单词自身-关键字单词自身-算法如下:ch= ;strtoken=” ”;getbc();if(isletter()
6、while(isletter() | isdigit() concat();getchar(); retract();if(reserve()printf(, strtoken); else printf(, strtoken);else if(1 =ch & ch =9) while(isdigit() concat();getchar(); retract();printf(, strtoken) ; else if(ch=0) getchar();if(ch = 1 & ch = 0 & ch = 7) concat();getchar(); retract();printf(, str
7、token) ;else if(ch=x) getchar();while(isdigit() | ch= a & ch=f) concat();getchar(); retract();printf(, strtoken);else retract();printf(“ “) ;else if(searchop() printf(, ch);else proerror();3、 采用c或c+语言,设计函数scan( ),实现该算法;char getchar(file* fp) /读取文件中的一个字符char ch;ch = fgetc(fp);return ch;char getbc(fil
8、e* fp) /读取文件的字符直至ch不是空白char ch;do ch = getchar(fp); while (ch = | ch = t | ch = n);return ch;void concat(char ch ,char strtoken) /将ch中的字符连接到strtoken之后char str2;str0 = ch;str1 = 0;strcat(strtoken,str);int isletter(char ch) /布尔函数,判断ch中的字符是否为字母,是返回1,否则返回0int flag = 0;if (ch = a & ch = 0 & ch = 9)flag =
9、 1;return flag;int reserve(char strtoken) /整型函数,对strtoken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0int code = 0,i;char keyword66 = if, then, else, while, do ;for (i = 0; i 5; i+) if (strcmp(strtoken, keywordi) = 0) code = i + 1;break;return code;int searchop(char ch) /整型函数,对strtoken中的字符串查找运算符和界符,若它是一个运算符或界符,
10、则返回它的编码,否则返回0int code = 0, i;char op11 = +, -, *, /, , =, (, ), ; ;for (i = 0; i 10; i+) if (ch = opi) code = i + 1;break;return code;char retract(file* fp,char ch) /子函数,将搜索指示器回调一个字符位置,将ch置为空白字符ch = ;fseek(fp, -1l, 1);return ch;void proerror( ) /错误处理函数printf(输入错误!n);return;file* scan(file* fp) /输出单个
11、二元式char ch;char strtoken10;strtoken0 = 0;/置strtoken为空串ch = getbc(fp); /先读取一个非空白的字符if (feof(fp) return fp;/判断文件尾,是则返回调用程序if (isletter(ch) /判断标识符while (isletter(ch) | isdigit(ch) concat(ch, strtoken);ch = getchar(fp);ch = retract(fp,ch);if (reserve(strtoken) /判断关键字printf(n, strtoken);elseprintf(n, str
12、token);else if (ch = 1 & ch = 9) /判断十进制整数while (isdigit(ch) concat(ch, strtoken);ch = getchar(fp);ch = retract(fp, ch);printf(n, strtoken);else if (ch = 0) ch = getchar(fp);if (ch = 1 & ch = 0 & ch = 7) concat(ch, strtoken);ch = getchar(fp);ch = retract(fp, ch);printf(n, strtoken);else if (ch = x) /
13、判断十六进制整数ch = getchar(fp);while (isdigit(ch) | ch = a & ch = f) concat(ch, strtoken);ch = getchar(fp);ch = retract(fp, ch);printf(n, strtoken);else /判断十进制的0ch = retract(fp, ch);printf(n);else if (searchop(ch) /判断运算符和界符printf(n, ch);else /出错proerror();return fp;4、 编制测试程序(主函数main);#includeusing namespa
14、ce std;#define null 0int main( ) file* fp; if (fp = fopen(c:usersadministratordesktopcode.txt, r) = null) /以只读方式打开文件,失败则退出程序printf(file can not open!);exit(0);printf(词法分析结果如下:n);while (!feof(fp) /若不是文件尾则执行循环fp = scan(fp);/输出单词种类、属性的二元式fclose(fp); /关闭文件fp = null;/避免指向非法内存5、调试程序:读入文本文件,检查输出结果。 六、测试数据 输入数据: , -编辑一个文本文件program.txt,在文件中输入如下内容:if data+920x3f thendata=data+01;elsedata=data-01; 正确结果:七、实验报告要求 实验报告应包括以下几个部分:1、词法的正规式描述;2、变换后的 状态图;3、词法分析程序的数据结构与算法。八、思考题1、 词法分析能否采用空格来区分单词?答:不能,因为程序的语法里有包括:;, ,(,)等界符或连接符号存在,这些符号符与单词的连接无空格,用空格区分单词将无法保证程序语法的正确。2、 程序设计中哪些环节影响词法分析的效率?如何提高效率?答:本程序在判断关键字时,是在完成对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五金劳保采购制度
- 交通局政府采购内控制度
- 计量管理采购验收制度
- 器材采购制度
- 易制毒采购制度
- 供应商采购审计制度
- 政府计算机采购制度
- 日本政府采购救济制度
- 采购流程管理制度细则范本大全
- 代购采购日常管理制度
- GB/T 3917.3-2025纺织品织物撕破性能第3部分:梯形试样撕破强力的测定
- DB37-T 4401-2021 养老机构分级护理服务规范
- 2025-2030年中国土砂石开采行业市场竞争格局规划分析报告
- 人机配合安全
- 导数中的同构问题【八大题型】解析版-2025年新高考数学一轮复习
- ANCA相关性小血管炎肾损伤病因介绍
- 旅游行业兼职业务员聘用合同
- (合同范本)中介佣金协议书
- 2024年法律职业资格考试(试卷一)客观题试卷与参考答案
- 厂家冰柜投放协议书模板
- 燃气涡轮发动机全册配套完整课件
评论
0/150
提交评论