课程设计报告

发布 2022-10-01 05:40:28 阅读 9063

编译原理。

题目名称: 算术表达式编译器的设计与实现。

小组成员:学号201224020110 姓名曹子恺成绩

学号201224020112 姓名雷彬成绩

指导教师宁航。

编写时间: 2024年12月11日。

1.课程设计题目名称。

算术表达式编译器的设计与实现。

2.课程设计目的语任务。

1、设计目的:

通过设计、编制、调试一个算术表达式编译器,进一步加深对编译器的词法分析、语法分析、错误处理及输出等环节的理解,获得对实际编译器的构造原理、过程和方法的感性认识,系统掌握语法制导翻译技术。

2、设计内容:

采用语法制导翻译模式设计一个算术表达式编译器,该编译器应能支持无符号整数的+、-等基本运算。

3.设计思想和任务分配。

1.开发工具:vc++ 6.0

2.所用算法:递归下降的**分析法。

3.词法分析部分。

(1)算法描述:

词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号。通过dos环境手动输入字符串序列作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出,以形成“(单词种别,单词自身的值)”形式的二元组。

2)具体思路如下:

在函数中让用户输入要识别的符号串,定义每单个字符为zf,然后将输入的符号串读入到exp[20]中,遇#结束。再依次扫描exp[20]中的每一个符号。在每次读入过程中,当时数字时输出二元组,当扫描到算术符时输出,否则报错。

只是运用了简单的循环和条件语句。

4语法分析部分。

语法分析部分采用递归下降方法,需要先将原算术表达式方法改写为ll(1)文法为: e-->te'

e'--te'|ε

t-->ft'

t'--ft'|ε

f-->e)|i

然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。具体方法为:

1)当遇到终结符a时,则编写语句。

if(当前读到的输入符号==a)读入下一个输入符号。

2)当遇到非终结符a时,则编写语句调用a()。

3)当遇到a-->规则时,则编写语句。

if(当前读到的输入符号不属于follow(a))error()

4)当某个非终结符的规则有多个候选式时,按ll(1)文法的条件能唯一地选择一个候选式进行推导。

4.程序说明。

1.函数说明和数据结构:

1)定义了结构体:利用token定义结构单词(word),语义栈(sem);qt为四元式结构,使用了word中两个变量。

2)定义了函数:

void next读下一个单词。

void newt申请一个临时变量函数。

void quat(char生成四元式函数。

int e();int f();int t递归下降分析的三个函数。

2.主要变量说明:

用exp[20]存放构成单词符号的字符串,并且用于判断是否为关键字。w为读入的字符单个变量。cnt[num]按顺序存放读到的字符,为下面语义分析做准备。

词法分析流程图:

5.程序运行结果。

6.测试报告。

出错情况:7.存在问题分析。

1)没有实现对多位数的运算,我们简化了程序功能只识别一位的整数。

2)错误处理不完善,当出现的错误不在表达式结束时,错误后面的字符就分析不出来了。还有就是错误的位置及信息没有输出。

3)未完成内容: 中间**的生成及结果输出功能模块没有实现。

8.总结与体会。

曹子恺:此次编译原理的课程设计不是很圆满的结束了,时间很短,中间有考试,加上小组只有我们俩人,开始的准备工作做得并不清晰,只是抱着学习的心态一起去进行课程设计,在分工方面并不明确,最后我着重进行了词法分析部分的设计与实现。

课程设计实际进行的时间只有四天,第一天和组员雷彬进行了选题,对于题目并没有太大的把握,于是选择了实现功能和要求知识较少的第一题进行设计。但是在随后的设计过程中,在词法分析器设计方面我和雷彬一起看书和上网查找资料,还算顺利的完成了,也完成了空格消除的功能,但是在随后的语法的分析过程中,不懂得将词法分析结果向语法分析的传送,尝试了指针等方式,很遗憾并没有成功,虽然是分模块的制作,但是我们在模块连接上出现了大问题。到了周五,我们仍然不能够完成任务,最基本的输出都没有结果,我们最后将这几天所学的知识用我们理解的方式去进行了编译,结果就是最后答辩时候呈现给老师的程序,源程序**长度跟其他组差距好多,之前完成的一些功能也未能实现出来,这是我们的不足,到答辩的时候我们没有抱着侥幸心理,就是准备跟老师说明这几天进行的真实情况,对知识的不理解程度也反馈给老师。

编译器只是将词法分析器和四元式进行了输出,功能实现的少,再次感受到了对编译原理知识运用的匮乏。到周五答辩的时候,其实我和组员内心都有很多不甘,应该会展现的更好,实现的更好。但是更多发现了对知识掌握的不足。

最后还是要感谢宁航老师和同学们的帮助,我们小组并没有将课程设计完成的很好,我们也缺乏勤学好问的精神,总是害怕问的问题太简单,在答辩的时候宁航老师对我们说的话也让我们意识到这种情况是对自己的不负责。在编译原理的备考和今后的学习生活中,我也要有强烈的求知精神,不会就要搞明白。通过编译原理的课程设计,让我意识到自己在知识方面的缺乏和应用的不力,我会继续努力,继续提高自己。

再次感谢宁航老师的教导。

雷彬:在刚接触到题目的时候思路并不是特别清晰,不知道该选择什么文法好。经过大量查阅网上已有资料,我们决定采用递归下降的**分析法,至于分工这块我们开始并没有明确,就是先查阅相关知识,弄明白是在怎么回事。

最后我们对词法分析和语法分析都有了解,我着重语法分析。

在短短一周的课程设计中,由于前两天为了考试准备时间比较多,时间稍显紧张。还有就是平时自己听课总是跟不上老师的步伐,对编译原理知识理解得不够透彻,很多不明白的地方,再加上编程基础相对薄弱,对任务的完成造成了一定的障碍。在此要非常真诚的向老师说一句抱歉,到最后答辩时我们也只是简单的实现的几个功能,没有完成老师的全部要求,有一部分原因是因为我们害羞、不好意思问老师一些很基础的知识点,总是碍于面子去学习新的知识。

这也让我们深刻的认识到自己在学习中的不足,学习方法也有待纠正。尽管课设不是那么完美的结束,但在学习的过程中我还是认真的查看课本,不断理解书中的知识点,这也加深了我对词法语法的理解。之所以自己在编译原理方面很弱,全是自己课堂上听不懂,课后没有多花时间去温习。

最后感谢宁航老师在课程设计中的悉心指导,也感谢曹子恺的辛勤努力和默契配合。在今后的学习中,我会加强自己的求知欲,多花时间在自己比较薄弱的地方,更加努力的学习,不断提高自己。

参考文献。1] 陈意云等《编译原理》 北京:高等教育出版社 2003

附录。#include""

#include""

#include"iostream"

usingnamespacestd;

charw; /当前(w)

intj=1;//临时变量序号。

structtoken//单词的token结构。

chart;inti;

structtokenword,sem[10];/结构单词(word),语义栈(sem)

inti_sem;

structqt//四元式结构。

charw;

structtokenword1;

structtokenword2;

structtokentemp;

charexp[20];/原算术表达式区。

inti=0;//原单词序号。

structqtqt[30]; 四元式区。

intq=1;//四元式序号。

inte();

intt();

intf();

voidnext();读下一个单词。

voidnewt();申请一个临时变量函数。

voidquat(char);/生成四元式函数。

voidsandizhi(inta,intb,intc,intd);

stringcnt[100];

template

intget(t&array)

return(sizeof(array)/sizeof(array[0]))

intmain()

charzf;

cout<<"请输入表达式:";

cin>>exp;

cout<<"词法分析***0'&&zf<='9')

/ i++;

cout<<"

printf("(d)",i+1);

printf("

printf(",c",qt[i].

printf(",c",qt[i].

printf(",c>",qt[i].

elseprintf("error");

return0;

inte()

charw1;//算符(+)暂存变量。

t();while(w=='

w1=w;//暂存运算符(+)

next();next(w)

t();quat(w1);

return1;

intt()

charw2;//算符(*)暂存变量。

f();while(w=='

w2=w;//暂存运算符(*)

next();next(w)

f();quat(w2);

return1;

intf()

if(w=='

next();next(w)

e();if(w!='

printf("err");

return0;

elseif((w>='a'&&w<='z')|w>='0'&&w<='9'))

sem[++i_sem]=word;//push(sem,w)

elseprintf("err");

return0;

next();next(w)

return1;

voidnext()

w=exp[i];

i++;voidnewt()

t';voidquat(charww)

newt();

qt[q1].w=ww;//qt[q]:=ww,sem[s-1],sem[s],temp);

qt[q-1].word1=sem[i_sem-1];

qt[q-1].word2=sem[i_sem];

qt[q-1].temp=word;

i_sem--;pop(sem);

i_sem--;pop(sem);

sem[++i_sem]=word;//push(sem,temp);q++;

课程设计报告格式 课程设计

洛阳理工学院。课程设计说明书。课程名称。设计课题。专业。班级。学号。姓名。完成日期2014年12月26日。问题描述 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的内容要求。基本要求 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的基本要求。测试数据 小四宋体,行间距单倍行距,每...

课程设计总结,课程设计报告

课程设计总结,课程设计报告。3.尝试应用项目管理软件进行项目进程的规划管理 绘制甘特图,不作硬性要求 二 选题说明。人事管理是企业信息管理的重要部分,面对大量的人事工资信息,财务部门采用人力处理将浪费大量的时间 人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的人事工资管理软件进行自动...

课程设计 课程设计报告格式

学校名。课程设计报告。课程名称 c语言程序设计 系别 专业班级 学号。姓名。课程题目 企业人事管理系统 完成日期 指导老师 年月日。附件。课程设计的内容。企业人事管理系统 本项目的目标是开发一个功能实用,操作简便,简单明了的人事管理系统。能够录入人事的基本资料,在操作上能够完成诸如添加 修改 删除 ...