编译课程设计报告.docx
- 文档编号:4694935
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:34.40KB
编译课程设计报告.docx
《编译课程设计报告.docx》由会员分享,可在线阅读,更多相关《编译课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
编译课程设计报告
2010-2011学年第二学期
《编译原理》课程设计报告
院系:
计算机科学与技术
班级:
学生姓名:
学号:
指导老师:
计算机科学与技术学院制
2011年6月
目录
一、课程设计的目的2
二、课程设计的内容及要求2
2.1课程设计内容2
2.2课程设计要求2
三、问题分析及相关知识介绍2
3.1编译系统原理介绍3
3.2算法实现及模拟3
四、设计思路和关键问题及其解决方案3
4.1设计思路3
4.2关键问题的解决方法4
五、结果及测试分析4
六、总结及心得体会5
附录1参考文献5
附录2源程序代码5
一、课程设计的目的
通过课程设计学生利用所学习掌握的知识手工编制一个小型的词法分析器。
进一步理解高级语言在计算机中的执行过程强化对系统软件综合工程实现能力、规划能力的训练;加强对词法分析原理、方法和基本实现技术的理解;提高自己的编程能力,培养好的程序设计风格。
同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。
二、课程设计的内容及要求
2.1课程设计内容
根据编译原理中的词法分析原理,利用使用所学过的任何一种语言编写一个词法分析程序。
分析某语言单词的子集(包括常用关键字、标识符、无符号数、关系运算符)。
2.2课程设计要求
对输入框中的代码进行词法分析,在词法分析结果中输出每个单词的类型。
词法分析的结果显示在词法分析错误信息栏,提示错误个数、错误所在行号,并且对某些词法错误原因进行说明。
三、问题分析及相关知识介绍
3.1编译系统原理介绍
(1)编译程序介绍
本编译程序完成词法分析的功能,下面的文法所描述的单词符号就是本编译程序所要识别的:
1、关键字是由程序语言定义的具有固定意义的标志符。
例如,C#中的"while","if","else","int","do","for","full","true","false"。
2、标识符用来表示各种名字,如变量名、数组名、过程名等等,通常是以字母、下划线开头的并有其组成的字母数字串。
3、关系运算符常用的运算符一般有<,<=,<>,=,>,>=。
4、无符号数任何不带符号的常数,常数的类型一般有整型、实型等等
(2)词法分析器的功能
本程序共三个模块,分别是扫描程序,判断关键字、标识符、无符号数、关系运算符程序,主程序,它们的功能是:
在主程序中,定义并控制指针,从指定的文件进行读入文件内容,然后调用扫描程序进行词法分析;扫描程序中调用判断关键字程序进行判断,最后输出分析结果。
3.2算法实现及模拟
(1)算法思想
该算法采用模块化设计思想,主函数十分短小,主函数中就只做两件事,一是调用载入源文件函数string[]codes=File.ReadAllLines(@"code.txt"),二是调用分析文件函数AnalysisOneLine(code[i]),在主函数外部定义了一些功能函数,
(2)算法功能及分析
此算法能实现简单的词法分析功能。
从源文件中顺序读出单词,并对其进行判断,可以成功识别关键字、标识符、无符号数、关系运算符,并将结果写入输出文件。
四、设计思路和关键问题及其解决方案
4.1设计思路
本实验决定编写一个简易C#语言的词法分析器。
使其能够识别关键字,无符号数,标识符,运算符。
编写一段程序,并且在确保该程序的正确性的情况下,实现本词法分析器的几种功能。
通过读取先前所在准备好的一个code文件,逐个判断其中所包含的字符,过滤掉空格后识别关键字,标识符等,最后再进行拼接以列表的形式输出各类字符。
4.2关键问题的解决方法
调用一个方法,此方法用多个if判断语句来识别读取的字符串是关键字、标识符、关系运算符、无符号数,然后分别存入到已定义过的字符串列表中,最后分类输出指针逐个读入需要分析的程序的内容,先判断首字符是不是字母,若是读入下一个字符,直到遇到结束符,将字符串放入temp中,判断是不是关键字,若是输出temp为关键字,若是,存入keys1[ptr1]中;,判断是不是数字,若是读入下一个字符,直到遇到结束符,将字符串放入temp中,;若首字符不是字母也不是数字,则分情况判断是不是关系运算符,若是保存到relop[ptr3];若都不是,就输出。
五、结果及测试分析
测试数据为一段源程序,存放在一个源文件中,需要识别的单词应尽量包含关键字、标识符、无符号数、关系运算符。
测试数据如下:
图1code.txt
测试结果如图所示:
图2:
词法分析结果
为了测试程序能否识别各种类型的数据,在源文件里包含了各种数据。
有关键字,普通标识符,数字,单分界符,双分界,注释符号,还有不能识别的非法数据。
这样测试的时候才能找到程序是否正确。
有个问题还没有解决,就是科计数法表示的数字没能分辨出来。
六、总结及心得体会
通过本次课程设计进一步理解高级语言在计算机中的执行过程,加深了对编译原理词法分析中重点算法和编译技术的理解,对提高自己的编程能力,一定的帮助。
课堂上老师将词法分析器的编写讲的很详细,但是还是有很多不明白的地方,主要是因为基础薄弱吧。
后来在宿舍人的帮助下,我对词法分析器的有了进一步了解,当然这和老师的督促有关系。
总之,通过本次课程设计,我不仅学会了基础的编译知识,也认识到许多事情看起来难,但只要自己肯做,就可以完成。
附录1参考文献
[1]陈意云,张昱等,《编译原理》高等教育出版社,2008,6
[2]王超,潘杨等,《VisualC#通用范例开发金典》电子工业出版社,2008,6
[3]邵良彬等编著,《ASP.NET(C#)实践教程》清华大学出版社,2007第1版
附录2源程序代码
namespaceLexicalAnalysis
{
classProgram
{
staticstring[]keys=newstring[]{"while","if","else","int","do","for","full","true","false"};
staticstring[]keys1=newstring[100];//保存关键字
staticintptr1=0;
staticstring[]ids=newstring[100];//保存标识符
staticintptr=0;
staticstring[]digit=newstring[100];//保存无符号
staticintptr2=0;
staticstring[]relop=newstring[100];//保存关系运算符
staticintptr3=0;
staticvoidMain(string[]args)
{
string[]codes=File.ReadAllLines(@"code.txt");
for(inti=0;i { AnalysisOneLine(codes[i]); } //Console.WriteLine(Char.IsLetter('_')); Console.ReadLine(); Console.WriteLine("程序中出现的标志符: "); for(inti=0;i { intt=0; for(intj=i+1;j { if(ids[i]==ids[j]) { t++; } } if(t==0) { Console.WriteLine(ids[i]); } } Console.WriteLine("关键字的输出: "); for(intj=0;j { Console.WriteLine(keys1[j]); } Console.WriteLine("程序中出现的数: "); for(intq=0;q { intt=0; for(intj=q+1;j { if(digit[q]==digit[j]) { t++; } } if(t==0) { Console.WriteLine(digit[q]); } } Console.WriteLine("程序中出现的关系运算符: "); for(intd=0;d { intt=0; for(intj=d+1;j { if(relop[d]==relop[j]) { t++; } } if(t==0) { Console.WriteLine(relop[d]); } } Console.ReadLine(); } staticvoidAnalysisOneLine(stringcode) { chara=''; stringtemp=""; intj=0; while(j { a=code[j]; temp=""; if(Char.IsLetter(a)||a=='_')//是否为标识符 { temp=temp+a.ToString(); j++; a=code[j]; while(Char.IsLetterOrDigit(a)) { temp=temp+a.ToString(); j++; a=code[j]; } if(IfKey(temp)) { //Console.WriteLine(temp+"isakey! "); if(nkey(temp)) { keys1[ptr1]=temp; ptr1++; } } else { ids[ptr]=temp; ptr++; } } elseif(a=='<') { temp=temp+a.ToString(); j++; a=code[j]; if(a=='=') { temp=temp+a.ToString(); j++; a=code[j]; } elseif(a=='>') { temp=temp+a.ToString(); j++; a=code[j]; } //Console.WriteLine(temp); relop[ptr3]=temp; ptr3++; } elseif(a=='=') { temp=temp+a.ToString(); j++; a=code[j]; if(a=='=') { temp=temp+a.ToString(); j++; a=code[j]; } //Console.WriteLine(temp); relop[ptr3]=temp; ptr3++; } elseif(a=='>') { temp=temp+a.ToString(); j++; a=code[j]; if(a=='=') { temp=temp+a.ToString(); j++; a=code[j]; } //Console.WriteLine(temp); relop[ptr3]=temp; ptr3++; } elseif(Char.IsDigit(a))//识别数字 { temp=temp+a.ToString(); j++; a=code[j]; while(Char.IsDigit(a)) { temp=temp+a.ToString(); j++; a=code[j]; } if(a=='.')//识别小数部分 { temp=temp+a.ToString(); j++; a=code[j]; if(Char.IsDigit(a)) { temp=temp+a.ToString(); j++; a=code[j]; while(Char.IsDigit(a)) { temp=temp+a.ToString(); j++; a=code[j]; } } } //Console.WriteLine(temp); digit[ptr2]=temp; ptr2++; } else { j++; } } } staticboolIfKey(stringid) { boolresult=false; for(inti=0;i { if(keys[i]==id) { result=true; break; } } returnresult; } staticboolnkey(stringid)//判断关键字重复 { boolresult=true; for(inti=0;i { if(keys1[i]==id) { result=false; break; } } returnresult; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)