第六章、第七章 语义分析
内容:第六章理论向+第七章技术向
属性:为文法中终结符、非终结符配备的若干相关的值
- 综合属性:自下而上传递信息
- LR分析法适合计算文法符号的综合属性,因为是自下而上的。
- 继承属性:自上而下传递信息
- 仅仅使用综合属性的属性文法称S-属性文法
- 终结符仅含有综合属性
- L-属性文法适合于一遍扫描的自上而下分析
- S-属性文法(也叫综合属性文法)适合于一遍扫描的自下而上分析
- S-属性文法一定是L-属性文法,因为本身是特殊的L-属性文法
- 每一个产生式都有一个语义规则,语义规则是可以用来计算属性值的。
- 语法制导翻译法:为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则。
- 如果是计算产生式左边非终结符的属性值的话,就是综合属性(用产生式右边符号的属性值来算)。如果计算产生式右边符号的属性,就是继承属性,可以由父节点(它的产生式左边的)和它的兄弟节点(产生式右边在它左边的那些节点)的属性来算。
- 用属性文法来做翻译的方法叫做语法制导翻译,也叫语义分析。包含两大类,属性文法(告诉你这个产生式可以算哪些属性值)和翻译模式(与属性文法区别是非常详细,告诉你这个产生式什么时候在哪里可以算哪些属性值)。
- 语义规则被计算的时机
- 在自上而下语法分析中,一个产生式匹配输入串成功时
- 在自下而上分析中,当一个产生式被用于进行归约时
(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
常见的中间语言
- 后缀式,又叫逆波兰表示
- 图表示: DAG图、抽象语法树(不讲、了解)
- 三地址代码(重点,叫三地址是因为通常来说是两个运算量+一个结果量)
- 三元式
- 四元式
- 间接三元式
将中缀表达式转换为后缀表达式,遵循以下步骤:
- 第一步:按照运算符的优先级对所有的运算单位加括号
- 第二步:把运算符号移动到对应的括号后面,再把括号去掉。
例如:a*(-b+c)=>(a*((-b)+c))=>(a(b)-c)+)=>ab-c+
翻译成四元式:简单的控制语句,我现在直接看着就能写出四元式。如果两个while嵌套,需要注意第二个while自己要有跳回外层的while的四元式,而且while中的do部分也不光要跳回自己的while,还要加上跳回外层的while的四元式。
第八章 符号表
符号表的内容
对于变量名、数组名和过程名,它们的信息栏中一般要求有下列信息:
1.变量
- 类型:整、实或布尔等;
- 种属:简单变量、数组、过程等;
- 大小:长度,即所需的存储单元字数;
- 相对数:指分配给该名字的存储单元的相对地址;
- 若为数组,则记录其内情向量;
- 形式参数标志;
- 是否对这个变量进行过赋值的标志位。
2.过程
- 是否为程序的外部过程?
- 若为函数,类型是什么?
- 其说明是否处理过?
- 是否递归?
- 形式参数是些什么?为了与实在参数进行比较, 必须把它们的种属、类型信息同过程名联系在一起。
登记在符号表中的信息
- 活跃信息:表示变量活跃的,也就是值会变
- 待用信息:表示活跃的变量在哪里会被用到
- 例如
- i: A := B op C
- j: E := A op Z
- i就是活跃信息,因为A的值会变
- j就是待用信息,表示A的值会在这里被用到
第九章 运行时存储空间组织
参数传递
- 传地址
- 得结果:传地址的一种变形。每个形参对应两个形式单元,第一个形式单元存放实参地址,第二个单元存放实参的值。在过程体中对形式参数的任何引用或赋值都看作对它的第二个单元的直接访问。
- 传值:把实参的值传递给相应的形参
- 传名:任一出现的形参数都替换成相应的实参。
活动记录:为了管理过程在一次执行中所需要的信息所使用的一个连续的存储块。
第十章 优化
局部优化。划分基本块,并作出程序流图:
求出四元式程序中各个基本块的入口语句:
- 程序第一个语句,或
- 能由条件转移语句或无条件转移语句转移到的语句,或
- 紧跟在条件转移语句后面的语句。
循环优化。对循环中的代码,可以实行:
- 代码外提
- 强度消弱
- 删除归纳变量(变换循环控制条件)
- 循环展开
- 循环合并
第十一章 目标代码生成
内容暂略(留坑不填,逃
(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
visitor tracker