




免费预览已结束,剩余3页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课程设计实验报告学生所在学院:燕山大学信息学院学生所在班级:学生姓名:学 号: 2012.12.28词法分析器的实现一 课程设计任务: 设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。词法分析是编译的第一个阶段,它的主要任务是从左至右逐个读入字符的对原程序进行扫描,产生一个个的单词序列用以进行语法分析。设计一个词法分析器,使其实现词法分析功能,要求读入源程序的字符使其形成符合词法规则的单词序列,并判断单词或符号的类型。单词的种类是语法分析需要的信息,而单词自身的值是编译其他的阶段需要的信息。单词的种类有五种:(1) 关键字,如begin,end,if,while等。(2) 标识符,用来表示各种名字,如常量名、变量名、过程名等。(3) 常数,各种类型的常数,如25,3.1415,TRUE,“ABC”等。(4) 运算符,如+,*,等。(5) 界符,如“,”、“;”等。二课程设计目的: 设计、编制和调试一个具体的词法分析程序,加深对词法分析的理解。 要求: 通过对PL/0词法分析程序(GETSYM)的分析,编制一个具有以下功能的词法分析程序: a.输入为待进行词法分析的源程序,输出为单词串,即由(单词,类别)所组成的二元组序列; b.有一定的错误检查能力,例如能发现2a这类不能作为单词的字符串。三设计思想: 否是判断文件是否为空初始化设置开始结束读取文件字符判断字符类型输出:无法识别字符字符处理程序输出相应字符是否有结束标志结束四程序结构:程序语言:C+#include #includeusing namespace std;#define MAX 22 /宏定义字符串的最大长度为22个字符 char ch = ; /起始字符赋值为空string key15=begin,end,if,then,else,while,write,read, do, call,const,char,until,procedure,repeat;/定义关键字int Iskey(string c) /关键字判断,将读入的字符串与定义的关键字数组进行比较int i;for(i=0;iMAX;i+) if(pare(c)=0) return 1; return 0;int IsLetter(char c) /判断是否为字母,若为字母类型则将大写字母转换为小写字母 if(c=a)|(c=A) return 1; else return 0;int IsDigit(char c) /判断是否为数字 if(c=0&c=9) return 1;else return 0;void analyse(FILE *fpin) string arr=; while(ch=fgetc(fpin)!=EOF) /调入EOF函数,作用是依次读入字符直至末尾 arr=; if(ch= |ch=t|ch=n) /若读入字符为空格,table或回车则不进行任何操 else if(IsLetter(ch) while(IsLetter(ch) if(ch=A) ch=ch+32; /若为字母类型则将大写字母转换为小写字母 arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)coutarr $属于关键字endl; else coutarr $属于普通标识符endl; else if(IsDigit(ch) while(IsDigit(ch)|ch=.&IsDigit(fgetc(fpin) arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); coutarr $属于无符号实数endl; else switch(ch) case+: case- : case* : case= : case/ :coutch $属于运算符endl;break; case( : case) : case : case : case; : case. : case, : case : case :coutch $属于界符endl;break; case: :ch=fgetc(fpin); if(ch=) cout:=$属于运算符endl; else cout:$无法识别字符 :ch=fgetc(fpin); if(ch=) cout=$属于运算符)cout$属于输入控制符endl; else cout$属于运算符endl; fseek(fpin,-1L,SEEK_CUR); break; case :ch=fgetc(fpin); if(ch=)cout=$属于运算符endl; else if(ch=)cout$属于输出控制符) cout$属于运算符endl; elsecout$属于运算符endl; fseek(fpin,-1L,SEEK_CUR); break; default : coutch$无法识别字符,请重新输入!endl; void main() char in_fn30; FILE * fpin; coutin_fn; if(fpin=fopen(in_fn,r)!=NULL) break; else cout提示:路径输入错误!请重新输入源文件名:; coutn*分析*endl; analyse(fpin); fclose(fpin);五算法描述:int Iskey(string c)判断所读入字符组成的单词是否属于关键字数组中所列关键字int IsLetter(char c)判断所读入的字符是否为字母类型int IsDigit(char c)判断读入的单个字符是否为数字void analyse(FILE *fpin)分析读入的字符,形成字符串,判断字符串的类型(是关键字,标识符还是数字),或判断读入的符号为界符或某一运算符void main()程序的主函数,判断所查找的为本是否存在,若存在则调用分析语句进行分析六功能描述:根据文件名查找到源程序文本,读入源程序的字符使其形成符合词法规则的单词序列,并判断单词或符号的类型。输出单词的值和类型。七运行结果: 首先建立一个文档,例如建立一个1.txt文本在当前文件夹,运行程序,出现提示,输入文本文档的名称,即可对文本文档中的内容进行分析,并把分析结果输出显示在屏幕上。源程序void main() int a,b,s; a=4;b=5; s=a+b; printf(“%d”,s); 八心得体会:通过本次课程设计的练习,熟悉了用C+语言编写词法分析器的过程,掌握了词法分析器的原理以及功能。词法分析是编译过程中的一个阶段,在语法分析前进行。也可以和语法分析结合在一起,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。词法分析程序的主要任务:读源程序,产生单词符号。 词法分析工作从语法分析工作独立出来的原因:简化设计,改进编译效率,增加编译系统的可移植性 。而且从划分关键字,运算符,界符,标识
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 比亚迪物流仓储合同范本
- 承包超市生鲜区合同范本
- 服装店员工入股协议合同
- 房间合同到期转租协议书
- 水田交换种植合同协议书
- 接种疫苗免责协议书范本
- 早餐时段承包合同协议书
- 知识产权转让合同与协议
- 水产合作养殖协议合同书
- 租赁空场地合同协议模板
- 资阳市安岳县县属国有企业招聘(33人)考前自测高频考点模拟试题附答案详解
- 2025北京平谷区初三二模数学试题及答案
- 2025年四川省资阳市中考真题化学试题(无答案)
- 2025年中级会计职称考试经济法冲刺试题及答案
- 2025年事业单位工勤技能-福建-福建行政岗位工四级(中级工)历年参考题库典型考点含答案解析
- 2025年应急通信保障中心招聘笔试预测试题及答案
- 2025-2026学年苏少版(新疆专用2024)小学综合实践四年级上册《遇见草木染》教学设计
- 保安培训课件45张
- 成人肺功能检查技术进展及临床应用指南课件
- 2025-2030牛肉分销渠道冲突与供应链协同优化报告
- 肿瘤科中医护士进修汇报
评论
0/150
提交评论