ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:123.71KB ,
资源ID:4774612      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4774612.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(试验一手工编写简单词法分析程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

试验一手工编写简单词法分析程序.docx

1、试验一手工编写简单词法分析程序编译原理实 验 报 告日期: 班级: 题目 组员:1实验目的及要求1.通过设计、编写、调试一个具体的词法分析程序,加深对词法分析原理的理解。2.掌握在对程序设计语言源程序进行扫描的过程中 , 将其分解为各类单词的词法分析方法。2实验平台Windows + VC + Win32 Console3实验步骤1.查询资料,了解词法分析器的工作过程与原理。2.分析题目,整理出基本设计思路。3.实践编码,将设计思想转换用 c 语言编码实现,编译运行。4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。 通过最终的测试发现问

2、题, 逐渐完善代码中设置的分析对象与关 键字表,拓宽分析范围提高分析能力。4实验内容4.1实现下述功能,并将分析结果保存在文件中(既可以参考范例程序,也可以独立完成)程序输入/输出示例:输入一段C语言程序,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符。 (遇到错误时可显示“ Error ”,然后跳过错误部分继续显示)输入源程序示例:mai n ()int a , b =10;int c ;c = a + b * 20;保留字表2输出固定表格如下单词类别表单词类型单词种别标识符1保留字2常量3运算符4分界符5运算符表4算符地址指针+1一2*3/4=5保留字地址指针int

3、1float2main分界符表35printf界符4地址指针丿匕1 1 . J 11 V 1dj2(3)45输出动态表格如下标识符表1常量表3标识符地址指针a1b2c3常量地址指针101202符号表单词名称类别地址指针int21c13J52c13=45a11单词名称类别地址指针+41int21b12c13*43J522032c13J52=45a11+41b12*432032J52564.2 程序:#in clude#in clude#in clude#in clude/定义关键字char *Key10=mai n,void,i nt,char,pri ntf,sca nf,else,if,re

4、turn;char Word20,ch; / 存储识别出的单词流 int IsAlpha(char c) / 判断是否为字母if(c=a)|(c=A) return 1;else return 0;/ 判断是否为数字int IsNum(char c) if(c=0&c=9) return 1; else return 0;int IsKey(char *Word) / 识别关键字函数 int m,i;for(i=0;i9;i+)if(m=strcmp(Word,Keyi)=0)if(i=0)return 2;else return 1;return 0;void scanner(FILE *f

5、p)/ 扫描函数char Word20=0;char ch;int i,c;ch=fgetc(fp);/ 获取字符,指针 fp 并自动指向下一个字符if(IsAlpha(ch)/ 判断该字符是否是字母Word0=ch;ch=fgetc(fp);i=1;while(IsNum(ch)|IsAlpha(ch) / 判断该字符是否是字母或数字Wordi=ch;i+;ch=fgetc(fp);Wordi=0;/0 代表字符结束 (空格 )fseek(fp,-1,1);/ 回退一个字符c=IsKey(Word);/ 判断是否是关键字if(c=0) printf(tt1 1 1 nttK %stt 11t

6、 | 1tt|n,Word); 不是关键字else if(c=2)printf(tt | 1 1 nttd I %stt |2t | 3tt |n,Word);elseprintf(tt | 1 1 ttd | %stt | 3t | 1tt |n,Word); / 输出关键字else/ 开始判断的字符不是字母while(IsNum(ch)Wordi=ch;i+;ch=fgetc(fp);n,Word);else7tt9tt3tt5ttWordi=0;fseek(fp,-1,1);printf(tt/ 回退H %stt | 3t | 1tt/ 开始判断的字符不是字母也不是数字Word0=ch;

7、switch(ch)case:printf(ttn,Word); break;case:printf(ttn,Word); break;case(:printf(ttn,Word); break;case:printf(ttn,Word); break;AnttH%stt | 5tAnttH%stt | 5tAnttH%stt | 5tH%stt | 5tcase:printf(tt5t |6tt |n. Word); break;case+:ch=fgetc(fp);Word1=ch;if(ch=)printf(tt | 1 1 | %stt |4t | 6tt |n,Word); 运算符+

8、=else fseek(fp,-1,1);printf(tt | 1 1 td | %stt |4t 1tt n,Word); / 判断结果为 +break;case-:ch=fgetc(fp);Word1=ch;if(ch=)printf(tt4t |6tt |n,Word); else if(ch=-)AMtH I %stt |prin tf(tt (4t 16tt |n,Word); / 判断结果为-else fseek(fp,-1,1);printf(tt | 1 1 nMtd | %stt |4t 2tt n,Word); / 判断结果为 -break;tI %stt | 4tcas

9、e*:printf(tt3tt n,Word);break;case!:case=:ch=fgetc(fp);if(ch=)printf(tt | 1 1 1 ntt|%stt | 4t | 6tt |n. Word);else fseek(fp,-1,1);printf(tt | 1 1 nMtd | %stt |4t 5tt n,Word);break;case:ch=fgetc(fp);Word1=ch;if(ch=)printf(tt | 1 1 1 ntt%stt 4t 6tt n,Word); / 判断结果为运算符 =else if(ch=)fseek(fp,-1,1);4t 16

10、tt |n,Word); / 判断结果为:ch=fgetc(fp);Word1=ch;if(ch=) pri ntf(tt | 1 1 ntt | %stt | 4t | 6tt |n,Word);else fseek(fp,-1,1);printf(tt | 1 1 1 ntt%stt 4t 6tt n,Word);break;case%:ch=fgetc(fp);Word1=ch;if(ch=) prin tf(tt | 1 1 ntt %stt 4t 6tt n,Word);AnMt|无法识别字并返回文件指针,该指fseek(fp,-1,1);取余运算符t I tn,Word);brea

11、k;default:pri ntf(tt | 1 一符! tttt |n); break;main()char in_fn30; / 文件路径FILE *fp;printf(n 请输入源文件名(包括路径和后缀名) :);while(true)gets(in_fn);/scanf(%s,in_fn);if(fp=fopen(in_fn,r)!=NULL) break; / 读取文件内容,针指向文件的第一个字符else printf( 文件路径错误 !请重新输入 :);prin tf(tt | 1 ntT I标识符t 1t n,Word);prin tf(tt | 1 ntT丨保留子t 2t n,

12、Word);prin tf(tt | 1 ntT 常量t 3t n,Word);prin tf(tt | 1 ntT 运算符t 4t n,Word);prin tf(tt | 1 ntT 分界符t 5t n,Word);prin tf(tt 1 1 rd);prin tf(tt i 1 nt| 保留字t 地址指针 t n,Word);prin tf(tt | 1 ntT intt1tn,Word);prin tf(tt | 1 ntT floatt2tn,Word);prin tf(tt | 1 ntT main3t n,Word)prin tf(tt | 1 ntT printft4tn,W

13、ord);prin tf(tt 1 1 rd);*prin tf(tt i 1 ntb-1算符t |地址指针tn,Word);rrin+f/4-4-XnXMJ.1 I +t |1tn,Word);print” tt |n nttT I +rrin+f/4-4-XnXMJ.i |t |2tn,Word);print” tt |n nttT | prin tf(tt | 1 ntT*t | 3tn,Word);prin tf(tt | 1 H I /t 4tn,Word);rrin+f/4-4-n+ t 5tn,Word);printT( tt rn ntt n I =prin tf(tt | 1

14、 H I 其他t 6tn,Word);prin tf(tt 1 1 rd);printf(n*分界符表 *n);printf(tt i 1 1 nttb 单词名称 t I 类别t I 地址指针 tn,Word);doelsefseek(fp,-1,1); / 回退一个字节开始识别单词流 scanner(fp);while(ch!=#);prin tf(tt 1 1 1 );return(0);5实验结果5.1 解析源文件:main ( )int a , b =10;int c ;c = a + b * 20;5.2解析结果:I D:Vxiao binDebjg1 l.exe 1=1 亘_6实验

15、总结分析在本次实验,使我们再次浏览了有关 c语言的一些基本知识,特别是对文件,字符串进行基本操作的方法。C语言中没有string类型,因此本实验中的对字符串提取与识别均 借助#include 及字符型数组来实现。让我们练习对字符串函数应用的同时也提 高了自己的逻辑思维能力。在本次实验中,我纠正了一个一直以来的概念错误: main 不是关键字,它定义为程序 的入口,是主函数!在本实验中,虽然我把 main 初始化在关键字表(字符指针类型数组) *Key10 中,当与该数组中字符串进行比较时,若与 main 匹配成功,则返回 2 ,若为其他 关键字则返回 1 ,以此来把 main 从关键字中区别出来。在本实验中的关键字表只初始化了几个常用的关键字, 还可继续扩充 (只需扩大数组, 向其中补充要添加的关键字) 。如果要对本程序中未识别的 c 语言中的一些其他的字符进行扩充 (目前处理为不可识别 字符),可在程序代码中继续添加 case 选项,分别对相应要识别的特殊字符加以描述。程序中,我们利用特殊符号构造表格,使画面美观,易于观察。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1