我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 语义分析 >

循环语句的语法分析及语义分析程序设计

归档日期:06-30       文本归类:语义分析      文章编辑:爱尚语录

  通过设计、编制、调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

  其中用递归下降法完成以上任务,中间代码选用四元式。展开我来答

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  1 课程任务书····································(2)

  1问题描述·······································(3)

  2文法及属性文法的描述···························(3)

  2.1 while-do循环语句的文法·····················(3)

  2.2while-do循环语句的结构翻译·················(3)

  3语法分析及中间代码形式的描述···················(4)

  3.1 语法分析方法·······························(4)

  3.2 中间代码形式描述···························(4)

  4简要的分析与概要设计···························(5)

  4.1词法分析··································(5)

  4.2递归下降翻译器的设计·······················(5)

  4.3语法制导翻译·······························(5)

  5 详细的算法描述································(6)

  5.1 文法·······································(6)

  5.2 查错·······································(6)

  6 测试方法和测试结果···························(9)

  6.1测试方法··································(9)

  6.2测试结果··································(10)

  7 设计的特点、不足、收获与体会·················(10)

  7.1 设计的特点································(10)

  7.2 不足、收获与体会··························(11)

  8 参考文献·····································(11)

  通过设计、编制、调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

  (1)学号29至32的同学按顺序分别选择递归下降法、LL(1)、算符优先分析法(或简单优先法)、LR法完成以上任务,中间代码选用四元式。

  (2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

  2.给出语法分析方法及中间代码形式的描述、文法和属性文法的设计;或者词法分析方法

  设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。

  产生式为S- while E do A,为便于语法制导翻译将其改写如下:

  递归下降法的实现思想是为文法的每个非终结符号设计一个相对应的递归子程序,识别程序由一组这样的子程序组成。

  中间代码采用四元式输出,一个四元式是一个带有四个域的记录结构,这四个域分别称为op﹑arg1﹑arg2及result。域op包含一个代表运算符的内部码。语句while ab do a=a+b的四元式输出形式如下:

  词法分析程序的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号的中间程序。词法分析检查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。

  1.:对每个非终结符A构造一个函数过程,对A的每个继承属性设置一个形式参数,函数的返回值为A的综合属性,A对应的函数过程中,为出现在A的产生式中的每一个文法符号的每一个属性都设置一个局部变量。非终结符A对应的函数过程中,根据当前的输入符号决定使用哪个产生式候选。

  2:每个产生式对应的程序代码中,按照从左到右的次序,对于单词符号,非3:终结符和语义动作分别做以下工作。

  (1)对于带有综合属性x的终结符X,把x的值存入为X,x设置的变量中。然后产生一个匹配X的调用,并继续读入一个输入符号。

  (2)对于每个非终结符号B,产生一个右边带有函数调用的赋值语句c=B(b1,b2,…,bk)

  (3)对于语义动作,把动作的代码抄进分析器中,用代表属性的变量来代替对应属性的每一次引用。

  在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。

  在C++环境下,设计几个有代表的用例,进行测试,例如:输入语句WabDa=a+b#(其中d表示do ,w表示while)。若得出的不是预期的结果,那么程序就出现问题。如果有问题的话就进行单步调试找到程序中出现的逻辑问题。

  本次设计是采用递归下降的方法对输入的while--do 循环语句进行语法,语义分析,并输出四元式。因此程序中充分体现了递归下降的思想。

  本次的设计的不足主要是我没将程序一般化,实现不了用户自动输入代码进行词法分析的四元式输出,此程序只能实现对WabDa=a+b#的分析与四元式输出,由于我所设计的栈中只能一个字符一个字符的存放,因此只能用D W分别表示do while;而且我对语法制导翻译这一块很不熟悉,因此我始终不能用程序实现语法制导翻译输出四元式,于是根据自己的理解,直接把四元式写了出来。

  本次课程设计巩固了我所学习的关于递归下降法这一方面的知识,并且使我对WHILE—DO循环语句也有了更深刻的理解,提高了我的动手能力。

  注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、

本文链接:http://furymagazine.com/yuyifenxi/129.html