华北电力大学编译课程设计报告书

上传人:d**** 文档编号:170274050 上传时间:2022-11-19 格式:DOCX 页数:17 大小:264.14KB
收藏 版权申诉 举报 下载
华北电力大学编译课程设计报告书_第1页
第1页 / 共17页
华北电力大学编译课程设计报告书_第2页
第2页 / 共17页
华北电力大学编译课程设计报告书_第3页
第3页 / 共17页
资源描述:

《华北电力大学编译课程设计报告书》由会员分享,可在线阅读,更多相关《华北电力大学编译课程设计报告书(17页珍藏版)》请在装配图网上搜索。

1、课程设计报告( 2011 - 2012年度第 1 学期)名题院班学称:目:系:编译技术课程设计B词法分析器设计算符优先分析程序设计基于算符优先分析方法的语法制导翻译程序设计计算机系级:网络号:学生姓名:指导教师:设计周数:1成 绩:日期:2012年1月6日一、课程设计的目的与要求1 词法分析器设计的目的与要求11 词法分析器设计的目的实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学 内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程 序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。 能使得学生在设计和调试编

2、译程序的能力方面有所提高。为将来设计、分析编译程序打下良 好的基础。12 词法分析器设计的要求 设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并 输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设 计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没 有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表1-1 所示,单词符号中标识符由一个字母后跟多个字母、数 字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式: (种别编码,单词的属性值)。表 1-1 单词符号及其内

3、部表示单词符号BEGINIFTHENELSEEND标识符 整型常数+*(种别编码1234567891011单词的属性值在名字表中的地址十进制整数2 算符优先分析程序设计的目的与要求2.1 算符优先分析程序设计的目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教 学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译 程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组 成结构,掌握实现通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力 方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2 算

4、符优先分析程序设计的要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词 符号串,以一个“ # ”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误 信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作 用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1) 文法 设算符优先文法 G 为:E T E + T I TT T T * F I FF t P T F I PPT(E)Ii说明:i为整型常数或者为标识符表示整型变量;使用中f用*表示。(2) 优先关系表 设优先关系表如表1-2所示。表 1-2 优先关系表3

5、基于算符优先分析方法的语法制导翻译程序的设计的目的和要求3.1 基于算符优先分析方法的语法制导翻译程序的设计的目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课 堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生 应用编译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序,掌握从一 种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法 制导翻译的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、 分析编译程序打下良好的基础。3.2 基于算符优先分析方法的语法制导翻译程序的设计的要求 算符优先分析

6、方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找 最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由 文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作 (即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语 义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即 将所有的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“# ”结尾),如果输 入符号串是句子,

7、则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。二、课程设计正文1 词法分析器设计11 设计思想对输入的字符串逐个分类处理,若所取字符为字母,检验其是关键字或标识符,返 回其种别码,标识符还要记录其在名字表中地址并输出;若所取字符为数字,记录其在 常数表中的位置,返回种别码及其位置;若所取字符是运算符,返回其相应的种别码。 12 使用的相关函数及变量(1)void scanner() 在这个函数部分进行单词符号的识别,开始进行第一次扫描的 时候,对数组token进行初始化,然后ch得到输入的字符串的第一个字符,对ch进行 判断。a.若ch是字母,则将ch存入token数组,然

8、后指针p和指针m向后移动,ch 一直在 变化,一直将ch存入token直到ch不是字母或者数字的时候,然后分析token存入 的单词,将该单词和关键字进行比较,若是关键字,则输出(关键字在:able中的的 位置,),若不是关键字则当做标识符来处理;b.若ch是数字,则当做常数处理;C.若 ch 是“ =”,“+”,“*”,“*”,“,”,“(”,“)”,则单独处理。(2) isdigit(ch) 用来判断 ch 中存放的是否是数字型字符。(3) isalpha(ch) 用来判断 ch 中存放的是否是字母型字符。(4) void main()用来输入要进行识别的语句(5) token8字符数组,

9、存放构成单词符号的字符串。(6) prog80字符数组,存放所有用户输入的字符。(7) syn 整数,存放当前单词的种别码。( 8) sum 存放无符号整数 。2. 算符优先分析程序设计2.1 设计思想(1) 首先建立char Terminal7=+,*,&,i,(,),#用来存放文法的终结符(其中*用& 来表示),然后根据设计报告中的文法和其对应的预先关系表用char Table77来表示, 其中两个终结符无优先关系的话用!表示。(2) 建立符号栈,并首先将#号置于栈中;从当前输入符号和栈顶元元素来确定优先 关系表的下标值。(3) 根据优先关系表中的优先关系,定义”移进”和”规约”的函数,来

10、进行对输入符号串 的处理。最后当输入符号串的字符未#”时,表示符号串规约完毕。其中处理到输入的 符号串不合法时,立即给以报错处理。2. 2 使用的相关函数及变量(1) char Terminal7 终结符集合;(2) char Table77 算符优先关系表;(3) Is_Vt(char ch)判断当前输入符号是否为终结符,是返回其所在位置i,否则返回-1;( 4) char cmp_syn(char ch1,char ch2) 获得算符优先级别;( 5) char* Getchar() 读入输入串,返回其长度;( 6) void analy(char* tmp) 分析函数,判断是该移进还是归

11、约3. 基于算符优先分析方法的语法制导翻译程序的设计3.1 设计思想这个实验有着第二个实验的基础,保持算符优先分析的整体思想,在此基础上利 用词法分析器的思想设计了一段模数转换程序,将字符串转换为数字形式。利用入栈 时记录的值进行输出并区分是否是第一次产生四元式,若不是,输出时产生其相应的中间变量。3.2 使用的相关函数及变量(1)push(char pchar) /入栈函数;(2)pop( ) /出栈函数;(3)change(char ch) /将字符转为数字,以得到算符优先值(4) fenxi() /比较函数,比较字符优先级并产生相应四元式三、课程设计总结或结论1词法分析器设计 词法分析在

12、此次课设中相对容易,所需识别的单词符号比较少。难点在于关键字与标识符的区别,设计时借助字符数组char *rwtab=”begin”,”if,”then”,”else”,”end”,将 存入 token 的字符与之比较,若匹配,则返回二元组,若不匹配,则作为标识符处理。 扫描时,不同的情况赋予相应的扫描码(用 syn 记录),在输出时,利用扫描码编号进 行输出。switch(syn)case 7: printf(”(d,%d)n,syn,b);break;/输出常量case 6: printf(”(d,%d)n,syn,a);break;/输出标识符case -l:break;错误时跳转cas

13、e 0:break;/ 结尾时的#default: printf(”(d,-)n,syn);/输出其余运算符实验心得: 在做实验时,我觉得首先要明白关键字、标示符、常数、运算符和分界符的区别,进 而再去写出算法将他们分开,我解决此问题用的方法是:先开始在自己编写函数,但是通过 看一些编程书,我发现#include ctype.h这个头文件里包含了我所要用到的int isdigit(int ch);和int isalpha(int ch);,用上之后,是我的程序相对简洁了好多。程序本身用完全独立模式, 通过指针j和k的加减来实现超前搜索,通过数组token和其指针实现最长匹配。在输出种 别码和属

14、性方面,实现定义好。编程中还有一个问题就是=和=的问题,这就用到超前搜 索了,先判断是否为或,在内层循环中判断=,如果只是小于,则指针退回,改变相应的 种别码和属性。但是最后在错误处理方面,只是报错,并没有指明是哪个错误,所以我觉得 这个程序还是可以完善的更好的。通过这次课设,我对之前学过的内容有了更深的理解,了 解了扫描器的组成结构、不同种类单词的识别方法,如何设计、编制并调试词法分析程序, 加深了对词法分析原理的理解;熟悉了构造词法分析程序的相关原理,使用C+直接编写词 法分析程序。另外,也让我重新熟悉了 C+语言的相关内容,加深了对C+语言的头文件 的用途的理解。2算符优先分析程序设计算

15、符优先文法的程序设计最重要的函数是void analy(char* tmp)/分析函数,此函数将传 入的字符串逐个分析,与算符优先关系表比对:if(cmp_syn(sj,ch)=vllcmp_syn(sj,ch)=)/移进操作for(int h=0;h=k;h+) coutsh; coutvvtvvtvvchvvtvvtmplvv移进vvendl;if(ch=#&cmp_syn(sj,ch)=)当表达式判断成功结束时 cout或=时进行移进操作while(cmp_syn(sj,ch)=)dostr=sj;if(Is_Vt(sj-1)!=(-1) j-;else j=j-2; while(cmp

16、_syn(sj,str)=llcmp_syn(sj,str)=); /格式输出for(int h=0;hv=k;h+)coutvvsh; coutvvtvvtvvchvvtvvtmp1vv归约vvendl; k=j+1;sk=E; 归约/当优先关系为时,进行归约操作实验心得:用过本次试验我明白了:算符是一种自下而上的分析方法,它借助某种优先关系寻找可 规约串进行规约,但是这种规约不是严格的最左规约,所以它不是一种规范规约。对于算符 优先文法,该程序的主要难点在于何时规约和何地规约,以及规约前后对几个指针位置的处 理。在实验编程中,存在几个问题。首先构造算符优先关系表,没有优先关系用!表示。其

17、次,在移进和规约的编写时,要用到前面通过synij返回的符号进行查找。最后我又添加 了一个标志位,程序执行成功标志位不变,否则,标志位置1,输出有错。编程中一些小的 问题通过百度都改了,总体来说比较具体的。通过这次实验,我了解了算符优先分析器的组 成结构以及对文法的要求,加深了对算符优先程序有了比较深的理解。在实验过程中遇到了 一些问题,但是通过自己的思考,最终得以解决,在一定程度上提高了软件开发能力。3. 基于算符优先分析方法的语法制导翻译程序的设计主要部分归约的程序设计如下:if(curcmp=i) /*当前比较为i,出栈一次*/pop();d=w;a=w;push(F);/*归约到 N*

18、/k=1;else/*当前比较不为i,出栈三次*/pop();pop();b=w;pop();c=w;push(F);/*归约到 N*/k=1;if(x=0)coutvvendlv;else coutendl” 产生的四元式为:”b”,”a”,”Tx-l”,”Tx”;x+;实验心得:开始设计这个程序的时候,还不太清楚什么时候产生四元式,以什么方式产生四元式。 通过看书,我发现四元式的产生一般都是在有中间变量、回填、对运算符的规约的时候。用 栈这个数据结构来实现输入缓冲区、当前比较串存放区和四元式的存放和输出。通过百度知 道(Lchar*)malloc(sizeof(LLchar);这个C+内部

19、集成的函数Malloc向系统申请分配指定size 个字节的内存空间。返回类型是void*类型。在后面用到了很多。用a和b代表四元式中 的变量,在程序中已经返回。最后,每当规约要产生相应的四元式时便紧随之产生,就不在 后面重新列出四元式列表。通过本次实验,对于基于算符优先分析方法的语法制导翻译我有 了更深一步的认识。语法制导翻译中的表示中间代码的四元式的这种结构是很有其特点和优 势的。这次实验基本达到了实验目的,但是在试验中也遇到了很多编程上的困难,在以后学 习中要更加努力。关于语法制导的内容之前未在课堂上有学过,首先锻炼了我的自学能力,通过学习和实践掌握了从一种语句的语法和语义出发,构造相应的

20、语义子程序,实现语法制导翻译的方法。四、参考文献1 陈火旺,刘春玲.程序设计语言-编译原理.国防工业出版社2 宋雨,程晓荣.计算机综合实践指导清华大学出版社附录(设计流程图、程序、运行结果等)、 流程图1、词法分析器否还有单词未分析?是结束是否是是数字?.是字母?否其他单词分析程序关键字或标识 符分析程序读入需要分析的句子输出单词二元式常数分 析程序初始化读一个字符开始2、算符优先文法开始ych=#n输入终结符?Yn fj=Pj=Pn是否可规约结束cmp_syn(sj ,ch)=0 或-1cmp_syn(sj ,ch)=1?规约k=j+1符号栈前三 个字符为从sk开始寻找 最左素短语读入输入符号串输出错误, 不是句子k=k+1; sk=ch输出不是 句子初始化输出是句子ch=tmpstartch=tmpstart3、语法制导翻译、运行结果I D; kjDebugkj .exeI B D:kjDeb u g y.exe进制讲話进约约制 多H7多多m多多3 3 3S-1、词法分析器注:字符表依次为a b c a。2、算符优先文法#E + i #E+E #E+E* #E+E*i#E+EHE 占ES!该输入串是句子PpEsg a_ny kEy to contilrmErrr3、语法制导翻译14

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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