编译原理课设报告
- 格式:doc
- 大小:219.50 KB
- 文档页数:23
北华航天工业学院《编译原理》课程设计课程设计题目:编译程序构造作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术作者所在班级:作者学号:作者姓名:指导教师姓名:完成时间:2010 年 6 月 18 日课程设计任务书摘要编译原理是计算机科学与技术专业一门重要的专业课, 它具有很强的理论性与实践性,目的是系统地向学生介绍编译系统的结构、工作原理以及编译程序各组成部分的设计原理和实现技术,在计算机本科教学中占有十分重要的地位。
计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言,就是因为有了编译技术。
编译技术是计算机科学中发展得最迅速、最成熟的一个分支,它集中体现了计算机发展的成果与精华。
本课设是词法分析、语法分析、语义分析的综合,主要是锻炼学生的逻辑思维能力,进一步理解编译原理的方法和步骤。
关键词:词法分析语法分析语义分析目录第1章课程设计目的 (1)第2章课程设计内容 (1)第3章设计方案介绍 (2)3.1 模块划分及模块调用 (2)第4章程序源代码 (2)第5章程序测试数据和结果 (14)第6章课程设计总结 (17)参考文献 (18)第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<iostream.h>#include<string.h>#include<istream.h>#include<fstream.h>#include<stdlib.h>#include<stdio.h>#include<ctype.h>int Letter(char ch){if(isalpha(ch)) return 1;return 0;}int Digit(char ch){if(ch>47&&ch<58) return 1;return 0;}char biaozhifu[30][30];char fuhaobiao1[100][10];int fuhaobiao2[100];char siyuanshi[100][100];#define MAXSIZE 1024typedef struct{int state[MAXSIZE];char sign[MAXSIZE];char mean[MAXSIZE][100];int top;}SeqStack;SeqStack *Init_SeqStack(){SeqStack *s=new SeqStack;if(!s){cout<<"未申请到空间!"<<endl;return NULL;}else{s->top=-1;return s;}}int Empty_SeqStack(SeqStack *s){if(s->top==-1)return 1;else return 0;}//入栈void Push_SeqStack(SeqStack*s,int a,char b,char c[]) {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);}}//出栈void Pop_SeqStack(SeqStack*s){if(Empty_SeqStack(s))cout<<"栈空"<<endl;else{s->top--;}}//取栈顶元素int Top_SeqStack(SeqStack*s){if(Empty_SeqStack(s))return 0;elsereturn s->state[s->top]; //返回状态}//主函数void main(){int no1,no2=0,no3=0,i=0,k,flag=0,m=0,s,t,slength=8,f1=0,f=1,error=0,v=49;char string[20],filename[30],token[30],nn[2];char a,b;char place[3];place[0]='T';place[1]=v;place[2]=NULL;int i1,j1=0,l,k1=0;char VN[10]={'A','E','E','T','T','F','F'}; //非终结符表int length_vn=5;char VT[15]={'i','=','+','*','(',')','#'}; //终结符表int length_vt=10;char NT[11]={'i','=','+','*','(',')','#','A','E','T','F'};//综合表int length_nt=11;char Fa[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表int analysis_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,'#',"_"); // 将初态和"#"压入栈中Acout<<"请输入文件名:";cin>>filename;ifstream instuf(filename,ios::in);cout<<"**************************操作过程如下************************"<<endl;cout<<"状态栈"<<'\t'<<'\t'<<"符号栈"<<'\t'<<'\t'<<"语义栈"<<'\t'<<'\t'<<"四元式"<<'\t'<<'\t'<<"动作说明"<<endl;cout<<"------------------------------------------------------------------------------------------------------------"<<endl;do{//****************状态栈******符号栈******语义栈**************t=0 ;int o=0,p=0,q=0;while(t<=A->top){cout<<A->state[t]; //输出状态栈if(A->state[t]>=10){o=o+2;}else{o++;}t++;}if(o<8){cout<<'\t'<<'\t';}else if(o>=8&&o<16){cout<<'\t';}t=0;while(t<=A->top){cout<<A->sign[t]; //输出符号栈p=p++;t++;}if(p<8){cout<<'\t'<<'\t';}else if(p>=8&&p<16){cout<<'\t';}t=0;while(t<=A->top) //输出语义栈{cout<<A->mean[t];q=q+strlen(A->mean[t]);t++;}if(q<8){cout<<'\t'<<'\t';}else if(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;}else if(Letter(a)||a=='_'){int flag=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;}else if(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<<"非法字符! "<<a;error++;instuf.get(a);continue;}}}k=0;no1=-1;for(int j=0;j<length_nt;j++) //判断输入符号标号{if(b==NT[j]){no1=j;break;}}s=analysis_table[Top_SeqStack(A)][no1];if(s==200){cout<<'\t'<<'\t';cout<<"分析完成。