资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
课程设计报告( 2011 - 2012年度第 1 学期)名 称:编译技术课程设计B 题 目:词法分析器设计 算符优先分析程序设计 基于算符优先分析方法的语法制导翻译程序设计院 系:计算机系 班 级:网络 学 号: 学生姓名: 指导老师:岳燕 黄建才 设计周数:1周 成 绩: 日期:2012年1月6日1一、课程设计的目的与要求1 词法分析器设计的目的与要求11 词法分析器设计的目的试验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培育解决实际问题实力而设置的实践环节。通过这个试验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的实力方面有所提高。为将来设计、分析编译程序打下良好的基础。12 词法分析器设计的要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避开超前搜寻,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,假如基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表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 基于算符优先分析方法的语法制导翻译程序的设计的要求算符优先分析方法是通过反复把输入符号移进分析栈,运用优先关系表在分析栈顶找寻最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约运用的产生式对非终结符号不加区分(即将全部的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“”结尾),假如输入符号串是句子,则依据其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。二、课程设计正文1 词法分析器设计11 设计思想 对输入的字符串逐个分类处理,若所取字符为字母,检验其是关键字或标识符,返回其种别码,标识符还要记录其在名字表中地址并输出;若所取字符为数字,记录其在常数表中的位置,返回种别码及其位置;若所取字符是运算符,返回其相应的种别码。12 运用的相关函数及变量 (1)void scanner() 在这个函数部分进行单词符号的识别,起先进行第一次扫描的时候,对数组token进行初始化,然后ch得到输入的字符串的第一个字符,对ch进行推断。a 若ch是字母,则将ch存入token数组,然后指针p和指针m向后移动,ch始终在变更,始终将ch存入token直到ch不是字母或者数字的时候,然后分析token存入的单词,将该单词和关键字进行比较,若是关键字,则输出(关键字在table中的的位置,),若不是关键字则当做标识符来处理;b 若ch是数字,则当做常数处理;c 若ch是“=”,“+”,“*”,“*”,“,”,“(”,“)”,则单独处理。(2)isdigit(ch) 用来推断ch中存放的是否是数字型字符。(3)isalpha(ch) 用来推断ch中存放的是否是字母型字符。(4)void main()用来输入要进行识别的语句(5)token8字符数组,存放构成单词符号的字符串。(6)prog80字符数组,存放全部用户输入的字符。(7)syn整数,存放当前单词的种别码。 (8)sum 存放无符号整数 。2 算符优先分析程序设计2.1设计思想(1)首先建立char Terminal7=+,*,&,i,(,),#用来存放文法的终结符(其中*用&来表示),然后依据设计报告中的文法和其对应的预先关系表用char Table77来表示,其中两个终结符无优先关系的话用!表示。(2)建立符号栈,并首先将#号置于栈中;从当前输入符号和栈顶元元素来确定优先关系表的下标值。(3)依据优先关系表中的优先关系,定义”移进”和”规约”的函数,来进行对输入符号串的处理。最终当输入符号串的字符未#”时,表示符号串规约完毕。其中处理到输入的符号串不合法时,马上给以报错处理。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) 分析函数,推断是该移进还是归约3 基于算符优先分析方法的语法制导翻译程序的设计 3.1设计思想 这个试验有着其次个试验的基础,保持算符优先分析的整体思想,在此基础上利用词法分析器的思想设计了一段模数转换程序,将字符串转换为数字形式。利用入栈时记录的值进行输出并区分是否是第一次产生四元式,若不是,输出时产生其相应的中间变量。3.2运用的相关函数及变量(1)push(char pchar) /入栈函数;(2)pop( ) /出栈函数;(3)change(char ch) /将字符转为数字,以得到算符优先值(4)fenxi() /比较函数,比较字符优先级并产生相应四元式三、课程设计总结或结论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);break;/输出标识符 case -1:break;/错误时跳转case 0:break;/结尾时的# default: printf(%d,-)n,syn);/输出其余运算符试验心得:在做试验时,我觉得首先要明白关键字、标示符、常数、运算符和分界符的区分,进而再去写出算法将他们分开,我解决此问题用的方法是:先起先在自己编写函数,但是通过看一些编程书,我发觉#include ctype.h这个头文件里包含了我所要用到的int isdigit(int ch);和int isalpha(int ch);,用上之后,是我的程序相对简洁了好多。程序本身用完全独立模式,通过指针j和k的加减来实现超前搜寻,通过数组token和其指针实现最长匹配。在输出种别码和属性方面,实现定义好。编程中还有一个问题就是=的问题,这就用到超前搜寻了,先推断是否为,在内层循环中推断=,假如只是小于,则指针退回,变更相应的种别码和属性。但是最终在错误处理方面,只是报错,并没有指明是哪个错误,所以我觉得这个程序还是可以完善的更好的。通过这次课设,我对之前学过的内容有了更深的理解,了解了扫描器的组成结构、不同种类单词的识别方法,如何设计、编制并调试词法分析程序,加深了对词法分析原理的理解;熟识了构造词法分析程序的相关原理,运用C+干脆编写词法分析程序。另外,也让我重新熟识了C+语言的相关内容,加深了对C+语言的头文件的用途的理解。2算符优先分析程序设计算符优先文法的程序设计最重要的函数是void analy(char* tmp)/分析函数,此函数将传入的字符串逐个分析,与
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号