一、基础文法
1、语法制导的定义:带属性和规则的上下文无关文法
2、基础文法:语法制导定义中的文法(LL或者LR之类的)
3、定义:
每个文法符号都有一组属性
每个文法都有一组语义规则
综合属性:由分析树中它的子节点的属性计算得到
继承属性:由分析树种它的父节点和兄弟节点计算得到
4、常识
终结符只有综合属性
文法的开始符号只有综合属性
文法的综合属性和继承属性的交集为空
形如:综合属性 产生式 继承属性 的类型中
属性的计算规则只能由产生式的文法符号提供
形如:继承属性 产生式 综合属性 的类型中
属性的计算规则不由产生式提供的规则计算
二、语义规则
1、功能
属性计算 静态语义检查 符号表操作 代码生成
2、虚拟综合属性
产生式左部非终结符的虚拟综合属性
会产生副作用的操作(如print(E.val))
3、属性文法
是指语义规则中无副作用的语法制导定义
区别是否产生副作用
三、概念
1、S属性定义:仅仅使用综合属性的语法制导定义
2、注释分析树:每个节点的属性值都标注出来的分析树
3、继承属性:节点的属性由此节点的父节点和兄弟节点计算,
用于表示上下文依赖关系(如定义)
4、依赖图:(有向图)
a、为每一个包含过程调用的语义规则引入一个虚拟综合属性
b、为每一个属性设置一个节点,如果b依赖于c,则有c—>b(依赖什么给你什么)
c、通过拓扑排序找到属性计算次序
5、循环依赖:如A.s = B.i
B.i = A.s
如果一个属性文法中不存在循环依赖,则称为良定义的
四、属性计算次序
根据输入串构建分析树
构造依赖图
拓扑排序
按拓扑排序计算属性
五、语义规则的计算方法
(1)分析树方法
一旦有环即为失败
编译速度慢
(2)基于规则的方法:静态确定语义规则的计算次序
首先使用工具或手工计算出每个产生式的语义规则的计算次序,编译时按顺序就行了
缺点是复杂的依赖关系很难确定次序
特点:语法分析和属性计算分开,先构造分析树,然后按照事先定义的策略计算
因为要考虑语义规则的定义和计算顺序,因此是基于规则的方法
(3)忽略规则的方法:事先确定属性的计算策略(如边分析边计算),
则语义规则的设计必须符合所选分析方法的限制。
如Yacc,是有确定的计算策略的,因此将按照策略来写语义规则
优点是不够造依赖图,提高效率,缺点是限制了语法制导定义的种类