基于算符优先分析方法的语法制导翻译程序设计.doc
《基于算符优先分析方法的语法制导翻译程序设计.doc》由会员分享,可在线阅读,更多相关《基于算符优先分析方法的语法制导翻译程序设计.doc(26页珍藏版)》请在沃文网上搜索。
1、一、课程设计的目的与要求1 词法分析器设计的目的与要求11 词法分析器设计的目的本实验是为计算机科学与技术专业、网络工程专业、信息安全专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。12 词法分析器设计的要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设
2、计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。表1-1单词符号及其内部表示单词符号种别编码单词的属性值BEGINIFTHENELSEEND标识符整型常数+*()123456789101112在名字表中的地址十进制整数2 算符优先分析程序设计的目的与要求2.1 算符优先分析程序设计的目的本实验是为计算机科学与技术等专业的
3、学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2 算符优先分析程序设计的要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也
4、就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1)文法设算符优先文法为: 说明:i为整型常数或者为标识符表示整型变量;使用中用*表示。(2)优先关系表设优先关系表如表1-2所示。表1-2优先关系表+ * i ( ) # + * i ( ) # 3 基于算符优先分析方法的语法制导翻译程序的设计的目的和要求3.1 基于算符优先分析方法的语法制导翻译程序的设计的目的本实验是为计算机科学与技术等专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序
5、,掌握从一种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。3.2 基于算符优先分析方法的语法制导翻译程序的设计的要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结
6、符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。二、课程设计正文1 词法分析器设计1.1 程序的实现流程(1) 输出提示;(2) 读入源串;(3) 使用循环逐字符检测:如果该首字符是字母,则它是一个标识符或关键字,开始标记;如果首字符是数字,在后面没有字母,则它是数字,有字母则是标识符,开始标记;如果是空格或者运算符则终止这次标记;(
7、4) 每次终止标记前都要输出前面的关键字、标识符或数字,然后输出该运算符,都以二元式形式输出;(5) 检索完最后一个字符或者遇到非法输入则终止检索。1.2自行规定(1) 关键字:begin,if,then,else,end;(2) 标识符:以字母开头由字母或数字组成并且不属于关键字的单词;(3) 数字:完全由十进制数字组成;(4) 标识符:+,*,*,(,)。1.3在屏幕上显示begin:(1,-)if:(2,-)then:(3,-)else:(4,-)end:(5,-)标识符:(6,在名字表中的地址)整型常数:(7,十进制整数)+:(8,-)*:(9,-)*:(10,-)(:(11,-):(
8、12,-)1.4程序流程图开始输入字符串取一个字符是*吗?是否指针A指向该字符是标识符的第一个字符吗?不是指针A指向该字符是a-z吗? 是 是 是是数字的第一个字符? 还在数字中 输出A到B字符串所对应的二元式是0-9? 否 是 在标识符中是空格? 否 是运算符吗?返回 否 是 数字中出现字母 是 否指针B指向该字符输入错误,存在非法字符输出A到B字符串所对应的二元式返回输出该运算符对应的二元式2 算符优先分析程序设计2.1自行规定可识别字符:i,+,*,(,),#,/。由于*识别起来有点儿麻烦,又限于时间上的问题,我暂时用/表示的。2.2优先级设计使用整形二维数组即邻接矩阵形式存放,其中1为
9、高于,0为等于,-1为低于,-2为不能比较。2.3程序流程这里用文字描述,具体流程图参考语法制导翻译。(1) 提示输入;(2) 输入字符串;(3) 错误检验:主要进行检测输入串中是否含有不能识别的字符,首字符必须是i或(,字符串内部(后面只能是i;(4) 输入串放到缓冲区中,栈中只放#;(5) 当栈中出现#N,缓冲区中出现#时退出;(6) 找到栈中第一个终结符,用top指向他;(7) 比较栈顶首终结符和缓冲区首字符的优先级:低于等于则入栈,高于就找到从栈顶数第二终结符准备归约,不能比较就输出错误并终止;(8) 归约时,如果栈顶首终结符和第二终结符优先级相等就把他们及之间的字符归约为N,如果栈顶
10、首终结符优先级高并且是栈顶字符则将该字符归约为N,如果栈顶首终结符优先级高并且栈顶字符是N则将该字符及其左右的N一起归约为N。3 基于算符优先分析方法的语法制导翻译程序的设计3.1在算符优先分析程序的基础上继续实现,可以输出四元式。3.2为了实现输出四元式,需要找到两个操作数,即通过运算符两边的N来找到被归约为N的两个操作数。我使用一个字符串数组来存放被归约为N的操作数,由于栈的特殊性质,每次归约时都是从栈顶的N开始,不论归约的字符串中有几个N都是从栈顶开始,所以我想了一个方法:因为输出四元式时都是归约运算符和他两边的N,所以从第一个N开始就记录该N所对应的字符串,以后每次归约时都要找到该字符
11、前面N的个数,将被归约的几个字符以字符串形式一起存入对应数组中,这样再去找N对应的归约字符串就是他的操作数。3.3程序流程图由于用电脑画程序流程图时一页总是会不够,所以我决定在纸上手工画。三、 课程设计总结或结论三个程序均为自己写的,使用Java语言,Eclipse集成开发环境实现。1词法分析器设计1.1为了实现字符串的增加与删除,我使用的是StringBuilder,他是继承字CharSequence,是一个16位字符数组,以至于在后面拿StringBuilder对象和String对象进行匹配时出现错误。因为一个是字符数组,一个是字符串,必须转化为相同形式才可以比较,我查阅JDK的帮助文档发
12、现String类中有一个将字符串转化为字符数组的方法toCharInt(),但是转化后并不是16位的,于是我自己尝试着写了一个转化函数toCharInt16(),结果发现还是不能匹配成功,通过调试发现两方都是16位字符数组但就是不能匹配成功,我尝试将equals()换位=,还是不行。后面突然发现,我可以将这个StringBuilder对象转化为String对象,总类Object中有toString(),这个方法我经常用,但是一直想着将字符串转换,而忽略了其它。1.2实现技术需要分析的种类比较多:begin,if,then,else,end是关键字不是标识符需要单独考虑,同时他们属于字符串,可以
13、通过找到标识符后再判断是不是关键字;我使用了两个标志位来记录并判断标识符和数字,flagL判断是不是在标识符中,flagN判断是不是在数字中。如果该字符是标识符,flagL为false那么这个字符是接下来这个标识符的第一个字母,这时就可以用指针pointA指向他,并把flagL置为true,flagL为true那么直接去检测下一个字符;如果该字符是数字,flagL为false并且flagN为false说明他是数字的第一个字母,这时可以用pointA指向他,并把flagN置为true,flagL为false并且flagN为true说明这个字母仍然处于数字中,可以直接去检测下一个字符,flagL为
14、true并且flagN为false说明这个字母正处在一个标识符中,可以直接去检测下一个字符,其它情况即flagL为true并且flagN为true说明这个字母既在标识符中又在数字中,是不可能发生的。对于运算符来说,+,*,(,)都是一个字符,检测到是他们就可以置pointB的值,让从pointA开始到pointB-1的字符作为一个整体来说,为了区分他们是标识符还是数字,因为标志符和数字的属性值不同,这是可以检测他的第一个字符,这个字符是字母这个整体就是标识符或关键字,这个字符是数字这个整体就是数字,他们输出时有区别;我们还有一个运算符*,由于他有两个字符,需要区别对待,当检测到第一个*时要先检
15、测下一个字符是不是*,如果是说明检测到的是*,这样下一次循环检测就没有意义了,我又用了一个标志位isDoubleAsterisk,默认是false的,这时就可以将其置为true,每次循环时首先检测isDoubleAsterisk是否为true,为true就直接进入下一循环。将他们前面的整体输出为二元式后要将以上三个标志位置为false,然后还要将他们自己的二元式输出。检测到是空格就直接将前面整体的二元式输出。1.3存在不足由于时间上的关系,这个小程序存在一些bug,比如连续两个空格,就会输出两次前面的东西,虽然不同但是对整体结果有影响;输完最后一个字符后必须要输入个空格才能把最后这个输出。2
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 优先 分析 方法 语法 制导 翻译 程序设计