第六、七章语义分析与中间代码

1. 重点内容

   第六章属性文法和语法制导翻译主要讲了属性文法、语义规则、基于属性文法的处理、S属性的自下而上计算、L-属性文法的自顶向下翻译。第七章主要讲了几种常用的中间代码,如:三元式、四元式、逆波兰式。还有布尔表达式的翻译与控制结构的翻译。一下总结几个基本概念,因为没什么难点,就是第六章不在考试范围内,所以没有仔细看过。但是第七章真的是没什么难点,所以这两章相对来说要总结的知识点有点少,计算过程也和简单也没太多特别难的点,所以对于翻译的过程也是总结了一点点。

   掌握几个重要的概念:

1. 属性文法:是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。分为综合属性和继承属性:

2. 综合属性:用于“自下而上”传递信息,在语法树中,一个结点的综合属性的值,由其子结点的属性值确定。

3. 继承属性:用于“自上而下”传递信息。在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。

4. 对于文法的每一个产生式配备一组属性的计算规则,则称为语义规则。

5. 逆波兰式:把操作数写在前面,算符写在后面,也就是后缀式。

6. 抽象语法树:将算符作为分支节点,操作数作为叶子节点。DAG图将重复的子树合并为一个。

7. 三元式:有算符,两个操作数组成;

四元式:有算符,两个操作数和一个操作结果组成。

 

   三元式和四元式可以先通过写出表达式的三地址代码得出,是语法制导翻译的基础,对布尔表达式的语法制导翻译就是将其转化为三元式或四元式。

   因为布尔表达式存在判断条件,因此程序的运行就有跳转,因此当前语句跳转到哪条语句是容易搞混的地方。在翻译过程中,一般将跳转地址空着,等出现跳转目标,再回填,这样就不容易出错了。

   数组赋值语句的翻译需要计算数组元素的相对地址:

            base+((i1-I1)*d2+i2-I2)*w

  注:I1I2分别为i1i2的下界,di为界差,数组中每个元素的宽度为w

2. 习题总结

    因为这一章的内容还算简单,所以题目也没什么难度,以下是我复习的时候做的几个关于语法制导翻译和逆波兰式的题目。这几个题目都是典型的逆波兰式、布尔循环表达式翻译,简单的三元式、四元式的写法还有数组元素赋值表达式的翻译。(因为都是复习的时候做的,题目太多了,所以没有专门写在练习本上,直接在题目旁边写的,可能看着有点不板正第六、七章语义分析与中间代码

 第六、七章语义分析与中间代码第六、七章语义分析与中间代码第六、七章语义分析与中间代码第六、七章语义分析与中间代码

3. 课程总结

    感觉这章还真没什么难点,比前几章简单多了,关于逆波兰式和语法翻译也都能很熟练的掌握了。但是,不得不吐槽一下考试,没想到自己认为最好做的逆波兰式成了最不会的一个题,完全没有考虑过逆波兰式和规范推导也能联系到一起,再回来翻复习资料也没找到,整个考试做的真的是很不尽人意啊。