基于算符优先分析方法的语法制导翻译程序设计编译课程设计报告书

上传人:仙*** 文档编号:31739996 上传时间:2021-10-12 格式:DOC 页数:37 大小:2.88MB
返回 下载 相关 举报
基于算符优先分析方法的语法制导翻译程序设计编译课程设计报告书_第1页
第1页 / 共37页
基于算符优先分析方法的语法制导翻译程序设计编译课程设计报告书_第2页
第2页 / 共37页
基于算符优先分析方法的语法制导翻译程序设计编译课程设计报告书_第3页
第3页 / 共37页
点击查看更多>>
资源描述
课程设计报告( 2012 - 2013年度第 1 学期)名 称: 编译技术课程设计B 题 目: 词法分析器设计 算符优先分析程序设计 基于算符优先分析方法的语法制导翻译程序设计 院 系: 计算机系 班 级: 计科1001 设计周数: 1周 成 绩: 日期:2013年1月11日2编译技术课程设计B任 务 书一、 目的与要求1词法分析器设计的目的与要求1.1 词法分析器设计的实验目的本实验是为计算机科学与技术专业、网络工程专业、信息安全专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。1.2 词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。表1-1单词符号及其内部表示单词符号种别编码单词的属性值BEGINIFTHENELSEEND标识符整型常数+*()123456789101112在名字表中的地址十进制整数2算符优先分析程序设计的目的和要求2.1 算符优先分析程序设计的实验目的本实验是为计算机科学与技术等专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2 算符优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1)文法设算符优先文法为: 说明:i为整型常数或者为标识符表示整型变量;使用中用*表示。(2)优先关系表设优先关系表如表1-2所示。表1-2优先关系表+ * i ( ) # + * i ( ) # 3基于算符优先分析方法的语法制导翻译程序设计的目的和要求3.1 基于算符优先分析方法的语法制导翻译程序设计的实验目的本实验是为计算机科学与技术等专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。3.2 基于算符优先分析方法的语法制导翻译程序设计的实验要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。4上机前的准备为了充分利用上机时间,在进行编译技术上机实验前应做好各种准备工作,具体应包括:(1)复习与上机题目有关的知识,熟悉有关定义、概念和实现算法。(2)设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查。(3)为所编写的程序构思一个运行、调试环境,例如,以什么方式提供输入数据、显示输出数据,如何调用(或启动)编写的程序。制定出程序调试计划和典型输入代码数据。5课程设计报告课程设计完成后,按学校给定的格式和要求写出课程设计报告。二、 主要内容完成以下课程设计内容:1完成词法分析器设计,实现输入源程序字符串,每调用一次扫描器,就输出一个以内部形式表示的单词符号,输出形式为二元式:(种别编码,单词属性)2完成算符优先分析程序设计,掌握实现通用算符优先分析算法的方法,实现输入终结符号串(即单词符号串,以一个“”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。3完成基于算符优先分析方法的语法制导翻译程序设计,实现输入是终结符号串(即单词符号串,以一个“”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。三、 进度计划序号设计内容完成时间备注1查阅资料,编译器各部分概要设计一天2词法分析器设计一天3算符优先分析程序设计一天4基于算符优先分析方法的语法制导翻译程序设计一天半5验收交实验报告半天已完成的学生验收交实验报告四、设计成果要求1按进度计划和自己的能力完成课程设计内容要求,包括程序框图、源程序、调试步骤、调试方法、对运行结果的分析等。 2总结整个课程设计,撰写出课程设计报告。五、 考核方式1程序调试完成后,由指导教师在计算机上检查,验收课程设计成果,并现场答辩。2评阅课程设计报告。 学生姓名: (签字) 指导教师: 编译课程教学组 年 月 日实验一词法分析器的设计与实现一、课程设计(综合实验)的目的与要求1.1 词法分析器设计的实验目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。1.2 词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。表1-1单词符号及其内部表示单词符号种别编码单词的属性值BEGINIFTHENELSEEND标识符整型常数+*()123456789101112在名字表中的地址十进制整数6二、设计(实验)正文1.词法分析器流程图开始结束初始化读入需要分析的句子还有单词未分析?否是是字母?是否其他单词分析程序是数字?否输出单词二元式关键字或标识符分析程序读一个字符是常数分析程序2.词法分析器设计程序代码#include #include #include using namespace std; int what(char a)if(int(a)=48)&(int(a)=97)&(int(a)=122)return 1;/a-z的字母elsereturn 2;/其他的标点符号void scan(char a,int &m,char zc100100,int &n)cout.setf(ios:left);char zh100;int b=0,weizhi,r=0;int zbbm;/-检测整形常数while(am= )cout遇到空格endl;m+;if(what(am)=0)while(what(am)=0)b=b*10+int(am)-48;m+;static int d=0;d=d+1;zbbm=7;coutsetw(9)setfill( )b;cout,setw(9)setfill( )zbbm,dendl;else/-检测字符型if(what(am)=1)if(am=b)&(am+1=e)&(am+2=g)&(am+3=i)&(am+4=n)&(what(am+5)=2)m=m+5;zbbm=1;coutbegin ,setw(9)setfill( )zbbmendl;/=检测beginelseif(am=i)&(am+1=f)&(what(am+2)=2)m=m+2;zbbm=2;coutif ,setw(9)setfill( )zbbmendl;/检测ifelseif(am=t)&(am+1=h)&(am+2=e)&(am+3=n)&(what(am+4)=2)m=m+4;zbbm=3;coutthen ,setw(9)setfill( )zbbmendl;/检测thenelseif(am=e)&(am+1=l)&(am+2=s)&(am+3=e)&(what(am+4)=2)m=m+4;zbbm=4;coutelse ,setw(9)setfill( )zbbmendl;/检测elseelseif(am=e)&(am+1=n)&(am+2=d)&(what(am+3)=2)m=m+3;zbbm=5;coutend ,setw(9)setfill( )zbbm0)int k=0,y=1;while(kn)&(y=1)r=0;while(zckr!=#)r+;if(r!=j)k+;y=1;elseif(r=j)r=0;while(int(zckr)=int(zhr)&(rj)r+; if(r=j)weizhi=k+1;y=0;elsek+;y=1;if(y=1)j=0;while(zhj!=#)zcnj=zhj;j+;zcnj=#;n=n+1;weizhi=n;zbbm=6;/怎么输出地址cout;for(int i=0;ij;i+) coutzhi;for(int i=0;i(9-j);i+)cout ;cout,setw(9)setfill( )zbbm,weizhiendl; elseif(what(am)=2)if(am=+)zbbm=8;m+;cout+ ,setw(9)setfill( )zbbmendl;/检测+elseif(am=()zbbm=11;m+;cout( ,setw(9)setfill( )zbbmendl;/检测(elseif(am=)zbbm=12;m+;cout) ,setw(9)setfill( )zbbmendl;/检测)elseif(am=*)if(am+1=*)zbbm=10;m+=2;cout* ,setw(9)setfill( )zbbmendl;elsezbbm=9;m+;cout* ,setw(9)setfill( )zbbm,-)endl;elsecout无此类字符!endl;m+;void main()char zc100100;int n=0;coutbegin-1endl;coutif -2endl;coutthen -3endl;coutelse -4endl;coutend -5endl;cout标志符-6endl;cout整型常数-7endl;cout+-8endl;cout*-9endl;cout*-10endl;cout(-11endl;cout)-12endl;cout=endl;coutendl;int m=0;char a100; cout请输入测试语句:; cin.getline(a,100,n); cout输出格式为: endl;coutendl;while(am!=#)scan(a,m,zc,n);system (pause);3. 词法分析器运行结果实验二. 算符优先分析的设计与实现一、课程设计(综合实验)的目的与要求2.1 算符优先分析程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2 算符优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1)文法设算符优先文法为: 说明:i为整型常数或者为标识符表示整型变量;使用中用*表示。(2)优先关系表设优先关系表如表1-2所示。表1-2优先关系表+ * i ( ) # + * i ( ) # 二、设计(实验)正文1算符优先分析流程图 当前字符为# ?#压栈输入字符串输出优先关系表开始栈中为“#N#”不是句子YNN大于?栈顶终结符与当前字符比较结束是句子出栈YN入栈下一个字符规约Y2.程序代码#include#includeusing namespace std;const int MAX=100;char cost88= ,+,*,!,i,(,),#, +, *, !, i, , , (, , , #, ,=;/the priority realiton graphclass stackint top;char arrayMAX;public:stack()top=0;char GetTop()return arraytop-1;int Getsize()return top;void PushStack(char c)if(topMAX) arraytop+=c;elsecoutover flow!=length)char *temp=new charMAX; for(int i=0;i=0)&(posMAX)return arraypos;elsereturn 0;void DispStack()for(int i=0;itop;i+)if (GetChar(i)=!)cout*;coutb;elsecouttop=8)coutt;else couttt;void DispCost()for(int i=0;i8;i+)for(int j=0;j8;j+)if(costij=!)cout*t;else coutcostijt;coutendl;bool IsVT(char c)bool flag=false;for(int i=0;i=a)&(c=0)&(c=a)&(c=0)&(c:return 1;break;case :return -1;break;case =:return 0;break;default:return 2;break;void main()char stringMAX; /for the sentence to be ananlysechar *ch=new char MAX; /the mergeing stringstack s; /for the merge stacks.PushStack(#); /init the stack char a; /store the letter need to be judgeint strp; /point to the letter of the stringint statop; /point to the top of the stackint statopvt; /point to the top VTcout*优先关系表:*endl;DispCost();cout*endl;cout请输入一个字符串 (以#结束):endl;cin.getline(string,MAX); coutThe stack:tThe actionendl;a=string0; /init the pointersstrp=0;statop=s.Getsize()-1;statopvt=statop;while(a!=#) /The analysing progress is as following: /if the letters priority is litter than the top start merge a=stringstrp; / get the letterif(a=*)&(stringstrp+1=*) a=!;strp+;if(IsVT(s.GetChar(statop)statopvt=statop;else statopvt=statop-1; /if the letters priority is greater than the top the push itwhile(IsVT(a)&(SearchCost(s.GetChar(statopvt),a)=1)/the topvt is greater than the letter the can not push then merges.DispStack(); /show the stack before mergingint highpos=statopvt,lowpos=highpos-1; /calculate the length of the mergeing stringif(!IsVT(s.GetChar(lowpos)lowpos-; while(SearchCost(s.GetChar(lowpos),s.GetChar(highpos)!=-1)highpos=lowpos;lowpos-;if(!IsVT(s.GetChar(lowpos)lowpos-;int start=s.Getsize();lowpos+; int length=start-lowpos;strcpy(ch,s.PopStack(length);s.PushStack(N);cout规约:;for(int i=0;ilength;i+)if(chi=!)cout*;elsecoutchi;coutN=A)&(a=Z)&(SearchCost(s.GetChar(statopvt),a)=2)cout错误!endl;cout第strp+1 字符是错的!endl;break;/exit(0);elses.DispStack();if(a=!)cout将* 移进.endl;elsecout将 a 移进.endl;s.PushStack(a);strp+;statop=s.Getsize()-1;s.DispStack();s.PopStack(3);if(s.Getsize()=0)coutYes!endl;elsecoutNo!endl;system (pause);3. 实验运行结果如下:实验三. 基于算符优先分析方法的语法制导翻译的设计与实现一、课程设计(综合实验)的目的与要求3.1 基于算符优先分析方法的语法制导翻译程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。3.2 基于算符优先分析方法的语法制导翻译程序设计的实验要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。二、设计(实验)正文1. 程序流程图如下当前字符为# ?#压栈输入字符串输出优先关系表开始栈中为“#N#”不是句子YNN大于?栈顶终结符与当前字符比较结束是句子出栈YN入栈规约Y判断产生式类型为前三个产生式?Y生成产生式下一个字符2. 程序代码如下:#include#includeusing namespace std;const int MAX=100;char cost88= ,+,*,!,i,(,),#, +, *, !, i, , , (, , , #,op=cost0op;this-s1=s1;this-s2=s2;this-s3=Fp+300; void DispSample()cout(;if(op=!)cout*;elsecoutop;cout,;DispIndirect(s1);cout,;DispIndirect(s2);cout,;DispIndirect(s3);cout)endl;void DispFour()cout产生:Fp;cout (;if(op=!)cout*;elsecoutop;cout,;DispIndirect(s1);cout,;DispIndirect(s2);cout,;DispIndirect(s3);cout);*Four;Four fourMAX; class stack int top;int arrayMAX;public:stack()top=0;int GetTop()return arraytop-1;int Getsize()return top;void PushStack(int c)if(topMAX) arraytop+=c;elsecoutover flow!=length) for(int i=0;ilength;i+)tempi=arraytop-length+i; top=top-length; return length; elsecoutError!=0)&(posMAX)return arraypos;elsereturn 0;void DispStack()for(int i=0;itop5) coutt;else couttt;stack s;void DispCost()for(int i=0;i8;i+)for(int j=0;j8;j+)if(costij=!)cout*t;else coutcostijt;cout=a)&(c=0)&(c=A)&(c:return 1;break;case DispFour();coutendl;return
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!