编译原理课设报告.docx
- 文档编号:3647534
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:25
- 大小:71.16KB
编译原理课设报告.docx
《编译原理课设报告.docx》由会员分享,可在线阅读,更多相关《编译原理课设报告.docx(25页珍藏版)》请在冰豆网上搜索。
编译原理课设报告
北华航天工业学院
《编译原理》课程设计
课程设计题目:
编译程序构造
作者所在系部:
计算机科学与工程系
作者所在专业:
计算机科学与技术
作者所在班级:
作者学号:
作者姓名:
指导教师姓名:
完成时间:
2010年6月18日
课程设计任务书
课题名称
《编译原理》课程设计
完成时间
2010.6.20
指导教师
孙红艳
职称
副教授
学生姓名
李肖丽
班级
B07513
总体设计要求
总体设计要求:
课程设计内容共给定1个题目,每个学生按照课程设计要求,在规定的两周时间内独立完成。
题目:
编译程序构造
涉及内容:
词法分析、语法分析、语义分析生成中间代码
工作内容及时间进度安排
第一周:
星期一:
设计动员,布置课程设计任务,查阅资料,制定方案,进行程序方案设计。
第一周:
星期二—星期五:
编写和调试程序
第二周:
星期一—星期三:
编写和调试程序
第二周:
星期四:
整理,撰写设计报告。
第二周:
星期五:
验收,提交设计报告,评定成绩。
毕业设计成果
1、课程设计报告书一份
2、源程序清单一份
3、成果使用说明书一份
摘要
编译原理是计算机科学与技术专业一门重要的专业课,它具有很强的理论性与实践性, 目的是系统地向学生介绍编译系统的结构、工作原理以及编译程序各组成部分的设计原理和实现技术,在计算机本科教学中占有十分重要的地位。
计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言,就是因为有了编译技术。
编译技术是计算机科学中发展得最迅速、最成熟的一个分支,它集中体现了计算机发展的成果与精华。
本课设是词法分析、语法分析、语义分析的综合,主要是锻炼学生的逻辑思维能力,进一步理解编译原理的方法和步骤。
关键词:
词法分析语法分析语义分析
第1章课程设计目的
《编译原理》课程设计是编译原理课程必不可少的一个环节,通过课程设计,加深对编译原理的教学内容的了解,以及实现编译原理各部分知识的融合。
进而提高学生分析问题、解决问题,从而运用所学知识解决实际问题的能力。
第2章课程设计内容
1.题目:
编译程序构造
2.内容:
涉及词法分析、自下而上语法分析程序的实现:
SLR
(1)分析器的实现以及生成中间代码。
3.具体要求
根据LR分析算法构造SLR
(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。
要求程序具有通用性,改变文法时只需改变程序的数据初值,无需改变程序主体;
要求完成一条说明语句、一条算数表达式和赋值语句的翻译,生成中间代码。
构造其用于SLR
(1)分析的识别活前缀的DFA以及action表和goto表。
然后编程实现。
(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=))。
4.程序设计提示:
(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:
一个符号栈,一个状态栈,一个语义栈,则归约时,则需要在符号栈中退掉n个符号,在状态栈中退掉n个符号(n为产生式符号个数),语义栈中退掉n个符号对应的语义;
(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数字,表示在分析表中对应的下标)。
(3)action表中的错误处理:
简化的错误处理:
当查找action表出现空白时,则当前单词无法移进和规约,可简单的认为当前单词为多余的单词,则抛弃当前单词,读下一单词继续分析。
5.程序扩展要求
有能力的同学可将编译程序扩展布尔表达式的分析和四元式生成,布尔表达式的翻译参见教材(胡元义《编译原理教程》)104——105页。
第3章设计方案介绍
3.1模块划分及模块调用
本系统总体是三个模块,一个是词法分析模块;一个是语法分析模块;一个是语义分析模块。
其中词法分析作为语法分析的子程序调用。
模块调用如图3-1所示:
图3-1模块调用图
第4章程序源代码
程序源代码如下:
#include
#include
#include
#include
#include
#include
#include
intLetter(charch)
{
if(isalpha(ch))return1;
return0;
}
intDigit(charch)
{
if(ch>47&&ch<58)return1;
return0;
}
charbiaozhifu[30][30];
charfuhaobiao1[100][10];
intfuhaobiao2[100];
charsiyuanshi[100][100];
#defineMAXSIZE1024
typedefstruct
{
intstate[MAXSIZE];
charsign[MAXSIZE];
charmean[MAXSIZE][100];
inttop;
}SeqStack;
SeqStack*Init_SeqStack()
{
SeqStack*s=newSeqStack;
if(!
s)
{
cout<<"未申请到空间!
"< returnNULL; } else { s->top=-1; returns; } } intEmpty_SeqStack(SeqStack*s) { if(s->top==-1) return1; elsereturn0; } //入栈 voidPush_SeqStack(SeqStack*s,inta,charb,charc[]) { if(s->top+1>=MAXSIZE) { cout<<"栈满"; } else { s->top++; s->state[s->top]=a; s->sign[s->top]=b; strcpy(s->mean[s->top],c); } } //出栈 voidPop_SeqStack(SeqStack*s) { if(Empty_SeqStack(s)) cout<<"栈空"< else { s->top--; } } //取栈顶元素 intTop_SeqStack(SeqStack*s) { if(Empty_SeqStack(s)) return0; else returns->state[s->top];//返回状态 } //主函数 voidmain() { intno1,no2=0,no3=0,i=0,k,flag=0,m=0,s,t,slength=8,f1=0,f=1,error=0,v=49; charstring[20],filename[30],token[30],nn[2]; chara,b; charplace[3]; place[0]='T'; place[1]=v; place[2]=NULL; inti1,j1=0,l,k1=0; charVN[10]={'A','E','E','T','T','F','F'};//非终结符表 intlength_vn=5; charVT[15]={'i','=','+','*','(',')','#'};//终结符表 intlength_vt=10; charNT[11]={'i','=','+','*','(',')','#','A','E','T','F'};//综合表 intlength_nt=11; charFa[15][10]={"i=E","E+T","T","T*F","F","(E)","i"}; /*(0)A→id=E (1)E→E+T (2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→i*/ //构造ACTION和GOTO表 intanalysis_table[15][11]={2,-1,-1,-1,-1,-1,-1,1,-1,-1,-1, -1,-1,-1,-1,-1,-1,200,-1,-1,-1,-1, -1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1, 7,-1,-1,-1,8,-1,-1,-1,4,5,6, -1,-1,9,-1,-1,-1,100,-1,-1,-1,-1, -1,-1,102,10,-1,102,102,-1,-1,-1,-1, -1,-1,104,104,-1,104,104,-1,-1,-1,-1, -1,-1,106,106,-1,106,106,-1,-1,-1,-1, 7,-1,-1,-1,8,-1,-1,-1,13,5,6, 7,-1,-1,-1,8,-1,-1,-1,-1,12,6, 7,-1,-1,-1,8,-1,-1,-1,-1,-1,11, -1,-1,103,103,-1,103,103,-1,-1,-1,-1, -1,-1,101,10,-1,101,101,-1,-1,-1,-1, -1,-1,9,-1,-1,14,-1,-1,-1,-1,-1, -1,-1,105,105,-1,105,105,-1,-1,-1,-1}; SeqStack*A=Init_SeqStack(); Push_SeqStack(A,0,'#',"_");//将初态和"#"压入栈中A cout<<"请输入文件名: "; cin>>filename; ifstreaminstuf(filename,ios: : in); cout<<"**************************操作过程如下************************"< cout<<"状态栈"<<'\t'<<'\t'<<"符号栈"<<'\t'<<'\t'<<"语义栈"<<'\t'<<'\t'<<"四元式"<<'\t'<<'\t'<<"动作说明"< cout<<"------------------------------------------------------------------------------------------------------------"< do{ //****************状态栈******符号栈******语义栈************** t=0; into=0,p=0,q=0; while(t<=A->top) { cout< if(A->state[t]>=10) { o=o+2; } else { o++; } t++; } if(o<8) { cout<<'\t'<<'\t'; } elseif(o>=8&&o<16) { cout<<'\t'; } t=0; while(t<=A->top) { cout< p=p++; t++; } if(p<8) { cout<<'\t'<<'\t'; } elseif(p>=8&&p<16) { cout<<'\t'; } t=0; while(t<=A->top)//输出语义栈 { cout< q=q+strlen(A->mean[t]); t++; } if(q<8) { cout<<'\t'<<'\t'; } elseif(q>=8&&q<16) { cout<<'\t'; } //***********************词法分析器************************** if(f==1) { //i: token数组变量,j: 标识符数组变量,l: 查看标识符数组k: 查看符号表 for(i1=0;i1<30;i1++) { token[i1]='\0'; } if(f1! =1) { instuf.get(a); } while (1) { i1=0; if(a==''||a=='')//滤去空格 { instuf.get(a); while(a==''||a=='') { instuf.get(a); } continue; } elseif(Letter(a)||a=='_') { intflag=0; while(Letter(a)||a=='_'||Digit(a)) { token[i1]=a;//将当前读入的字符送入token数组 i1++; instuf.get(a); f1=1; } //查表是否已存在该标志符 for(l=0;l<30;l++) { if(strcmp(biaozhifu[l],token)==0) { flag=1; break; } } if(flag! =1) { strcpy(biaozhifu[j1],token);//符号如表 j1++; fuhaobiao2[no2]=j1-1; } else { fuhaobiao2[no2]=l; } b='i'; strcpy(fuhaobiao1[no2],"id"); no2++; strcpy(string,token); for(i1=0;i1<30;i1++) { token[i1]='\0'; } break; } elseif(a=='+'||a=='*'||a=='('||a==')'||a=='#'||a=='=') { nn[0]='\0'; nn[1]='\0'; nn[0]=a; strcpy(fuhaobiao1[no2],nn); nn[0]='\0'; nn[1]='\0'; fuhaobiao2[no2]=-1; no2++; f1=0; b=a; strcpy(string,"_"); break; } else { cout<<'\t'<<'\t'; cout<<"非法字符!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 报告