编译课程设计报告书马聪敏

上传人:tia****nde 文档编号:36882940 上传时间:2018-04-03 格式:DOC 页数:14 大小:204.50KB
返回 下载 相关 举报
编译课程设计报告书马聪敏_第1页
第1页 / 共14页
编译课程设计报告书马聪敏_第2页
第2页 / 共14页
编译课程设计报告书马聪敏_第3页
第3页 / 共14页
编译课程设计报告书马聪敏_第4页
第4页 / 共14页
编译课程设计报告书马聪敏_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《编译课程设计报告书马聪敏》由会员分享,可在线阅读,更多相关《编译课程设计报告书马聪敏(14页珍藏版)》请在金锄头文库上搜索。

1、课程设计报告课程设计报告( 2011 - 2012 年度第 1 学期)名 称:编译技术课程设计 B 题 目:词法分析器设计 算符优先分析程序设计 基于算符优先分析方法的语法制导翻译程序设计院 系:计算机系 班 级:网络 1002 学 号:201009030212 学生姓名:马聪敏 指导教师:岳燕 黄建才 设计周数:1 周 成 绩: 日期:2012 年 1 月 6 日一、课程设计的目的与要求一、课程设计的目的与要求1 词法分析器设计的目的与要求11 词法分析器设计的目的实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这

2、个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。12 词法分析器设计的要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表 1-1 所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多

3、个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值) 。表 1-1 单词符号及其内部表示单词符号种别编码单词的属性值BEGINIFTHENELSEEND标识符整型常数+*()123456789101112在名字表中的地址十进制整数2 算符优先分析程序设计的目的与要求2.1 算符优先分析程序设计的目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先

4、分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2 算符优先分析程序设计的要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“”结尾) ,如果输入串是句子则输出“YES” ,否则输出“NO”和错#误信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1)文法文法 设算符优先文法为:GTTEE|FFTT|PFPF|iEP| )(说明:i 为整型常数或者为标识符表示整型变量;使用中用*表示。(2)优先关系

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

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

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

8、始化,然后 ch 得到输入的字符串的第一个字符,对 ch 进行判断。a 若 ch 是字母,则将 ch 存入 token 数组,然后指针 p 和指针 m 向后移动,ch 一直在变化,一直将 ch 存入 token 直到 ch 不是字母或者数字的时候,然后分析 token 存入的单词,将该单词和关键字进行比较,若是关键字,则输出(关键字在 table 中的的位置,) ,若不是关键字则当做标识符来处理;b 若 ch 是数字,则当做常数处理;c 若 ch 是“=” , “+” , “*” , “*” , “,” , “(” , “)”,则单独处理。(2)isdigit(ch) 用来判断 ch 中存放的

9、是否是数字型字符。(3)isalpha(ch) 用来判断 ch 中存放的是否是字母型字符。(4)void main()用来输入要进行识别的语句(5)token8字符数组,存放构成单词符号的字符串。(6)prog80字符数组,存放所有用户输入的字符。(7)syn 整数,存放当前单词的种别码。 (8)sum 存放无符号整数 。2 算符优先分析程序设计2.1 设计思想(1)首先建立 char Terminal7=+,*,(2)pop( ) /出栈函数;(3)change(char ch) /将字符转为数字,以得到算符优先值(4)fenxi() /比较函数,比较字符优先级并产生相应四元式三、课程设计总

10、结或结论三、课程设计总结或结论1词法分析器设计词法分析在此次课设中相对容易,所需识别的单词符号比较少。难点在于关键字与标识符的区别,设计时借助字符数组 char *rwtab6=“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);b

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

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

13、关内容,加深了对C+语言的头文件的用途的理解。2算符优先分析程序设计算符优先文法的程序设计最重要的函数是 void analy(char* tmp)/分析函数,此函数将传入的字符串逐个分析,与算符优先关系表比对:if(cmp_syn(sj,ch)=或=时进行移进操作while(cmp_syn(sj,ch)=)dostr=sj;if(Is_Vt(sj-1)!=(-1) j-;else j=j-2; while(cmp_syn(sj,str)=|cmp_syn(sj,str)=);/-格式输出for(int h=0;h时,进行归约操作实验心得:实验心得:用过本次试验我明白了:算符是一种自下而上的分

14、析方法,它借助某种优先关系寻找可规约串进行规约,但是这种规约不是严格的最左规约,所以它不是一种规范规约。对于算符优先文法,该程序的主要难点在于何时规约和何地规约,以及规约前后对几个指针位置的处理。在实验编程中,存在几个问题。首先构造算符优先关系表,没有优先关系用!表示。其次,在移进和规约的编写时,要用到前面通过 synij返回的符号进行查找。最后我又添加了一个标志位,程序执行成功标志位不变,否则,标志位置 1,输出有错。编程中一些小的问题通过百度都改了,总体来说比较具体的。通过这次实验,我了解了算符优先分析器的组成结构以及对文法的要求,加深了对算符优先程序有了比较深的理解。在实验过程中遇到了一

15、些问题,但是通过自己的思考,最终得以解决,在一定程度上提高了软件开发能力。3.基于算符优先分析方法的语法制导翻译程序的设计主要部分归约的程序设计如下:if(curcmp=i) /*当前比较为 i,出栈一次*/ pop();d=w;a=w;push(F); /*归约到 N*/ k=1; else /*当前比较不为 i,出栈三次*/ pop();pop();b=w;pop();c=w;push(F); /*归约到 N*/ k=1; if(x=0)cout“;else cout“;x+;实验心得:实验心得:开始设计这个程序的时候,还不太清楚什么时候产生四元式,以什么方式产生四元式。通过看书,我发现四元式的产生一般都是在有中间变量、回填、对运算符的规约的时候。用栈这个数据结构来实现输入缓冲区、当前比较串存放区和四元式

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号