《编译原理》课程设计报告词法分析器.docx
- 文档编号:3708714
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:14
- 大小:62.94KB
《编译原理》课程设计报告词法分析器.docx
《《编译原理》课程设计报告词法分析器.docx》由会员分享,可在线阅读,更多相关《《编译原理》课程设计报告词法分析器.docx(14页珍藏版)》请在冰点文库上搜索。
《编译原理》课程设计报告词法分析器
201X-201X学年第x学期
《编译原理》课程设计报告
院系:
计算机科学与技术
班级:
XX级XX班
学生姓名:
XXXXXX
学号:
XXXXXXXX
指导老师:
XXXXXX
计算机科学与技术学院监制
20XX年X月
目录
1.课程设计的目的
2.课程设计的内容和要求
3.问题分析和相关知识介绍
4.设计思路和关键问题及其解决方案
5.测试和结果分析
6.总结和心得体会
附件1:
参考文献
附件2:
核心源代码
1.课程设计的目的
(1)编写词法分析器
(2)加深对词法分析器工作原理的了解和认识
2.课程设计的内容和要求
编写词法分析器,词法分析器能够识别关系算符,词法分析器能够识别标识符和关键字,词法分析器能够识别无符号数。
3.问题分析和相关知识介绍
构成词法分析器的一种简单方法是用状态转换图来描述源语言词法记号的结构,然后手工把这种状态转换图翻译成为识别词法记号的程序。
词法分析器的任务是把构成源程序的字符流翻译成词法记号流。
4.设计思路和关键问题及其解决方案
把自然语言构造成正规式,把正规式构造成有限自动机NFA,然后根据子集构造法把有限自动机构造成无限自动机DFA,根据极小化DFA状态数算法把DFA构造成最简DFA,其次根据最简DFA画出转换表,根据转换表画出装换图,最后根据装换图就可以编写词法分析器。
5.测试和结果分析
6.总结和心得体会
通过本次试验,不仅仅是我学会了C#基础知识,而且还是我对词法分析器有了更深入的认识,虽然在编写词法分析器过程中遇到了很多困难,例如:
C#语言不熟悉,对此法分析器的工作原理分析的不透彻,但在老师和同学的帮助下,我有了很大的提高,通过不断的努力最终顺利的完成了课程设计,很感谢帮助我的XX同学和XX老师。
附件1:
参考文献
《编译原理(第2版)》高等教育出版社;
《C#程序设计及应用教程(第2版)》人民教育出版社。
附件2:
1.Code文档截图
2.程序源代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
namespaceLexicalAnalysis
{
classProgram
{
staticstring[]keys={"static","true","return","string","Length","break","Console","WriteLine","bool","false","ture","void","if","else","while","int","float","for","enum","default","case","double","do"};
staticList
staticList
staticList
staticList
staticList
//数字,标识符,空白,关系符,运算符
staticvoidMain(string[]args)
{
string[]date=File.ReadAllLines(@"d:
\\code.txt");//路径,并存入data
for(inti=0;i { Console.WriteLine("第"+(i+1)+"行code: "+date.GetValue(i)); analysisByLine(date[i]); } //分别输出存储在四个List中的String Console.WriteLine("关键字,输入回车");//输出所有的关键字 Console.ReadLine(); foreach(stringidinkey) { Console.WriteLine(id); } Console.WriteLine("标识符,输入回车");//输出所有的标识符 Console.ReadLine(); foreach(stringidinbsf) { Console.WriteLine(id); } Console.WriteLine("数字,输入回车");//输出所有的数字 Console.ReadLine(); foreach(stringidinsz) { Console.WriteLine(id); } Console.WriteLine("关系运算符,输入回车");//输出所有的关系运算符 Console.ReadLine(); foreach(stringidingx) { Console.WriteLine(id); } Console.WriteLine("算数运算符,输入回车");//输出所有的算数运算符 Console.ReadLine(); foreach(stringidinys) { Console.WriteLine(id); } Console.WriteLine("输入回车退出"); Console.ReadLine(); } staticvoidanalysisByLine(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(isKey(temp)) { //Console.WriteLine("保留字: "+temp); if(! key.Contains(temp)) { //Console.WriteLine("添加成功"); key.Add(temp); } } else { //Console.WriteLine("标识符: "+temp); if(! bsf.Contains(temp)) { //Console.WriteLine("添加成功标识符=="); bsf.Add(temp); } } } 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.Equals('.')) { temp=temp+a.ToString(); j++; a=code[j]; while(Char.IsDigit(a)) { temp=temp+a.ToString(); j++; a=code[j]; } //判读是否是科学记数法 if(a.Equals('E')||a.Equals('e')) { temp=temp+a.ToString(); j++; a=code[j]; while(Char.IsDigit(a)) { temp=temp+a.ToString(); j++; a=code[j]; } } } //Console.WriteLine("数字: "+temp); if(! sz.Contains(temp)) { //Console.WriteLine("添加成功标识符=="); sz.Add(temp); } } 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); if(! gx.Contains(temp)) { //Console.WriteLine("添加成功标识符=="); gx.Add(temp); } } elseif(a=='=') { temp=temp+a.ToString(); j++; a=code[j]; //Console.WriteLine("关系符"+temp); if(! gx.Contains(temp)) { //Console.WriteLine("添加成功关系=="); gx.Add(temp); } } elseif(a=='>') { temp=temp+a.ToString(); j++; a=code[j]; if(a=='=') { temp=temp+a.ToString(); j++; a=code[j]; } //Console.WriteLine("关系符"+temp); if(! gx.Contains(temp)) { //Console.WriteLine("添加成功标识符=="); gx.Add(temp); } } else { if(a=='+'||a=='-'||a=='/'||a=='*') { temp=temp+a.ToString(); j++; a=code[j]; //Console.WriteLine("运算符"+temp); if(! ys.Contains(temp)) { //Console.WriteLine("添加成功标识符=="); ys.Add(temp ); } } else { j++; } } } } //判断是不是保留字的IsKey方法 staticboolisKey(stringkey) { boolflag=false; for(inti=0;i if(keys[i]==key) { flag=true; //Console.WriteLine(key+"是不是key"+flag); break; } else { flag=false; } //Console.WriteLine(key+"是不是key"); //Console.WriteLine(flag+"是不是key"); returnflag; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 编译 原理 课程设计 报告 词法 分析器