1、第七章 动作文法与属性文法任课教师王养廷主要内容1.属性文法2.继承属性3.综合属性4.属性树5.属性求值6.拷贝型属性文法1 属性文法n属性文法 带属性的文法,1968年Knuth提出n作用 描述静态语义n特点 类似于尾动作文法 属性文法=文法产生式+属性计算规则 比动作文法 规范 级别高 使用时受到限制1 属性文法n属性文法的思想 对每个语法符号引进相关的属性符号 对每个产生式写出计算属性的属性规则n属性文法包括 文法内容 语义内容 属性符号的定义 属性规则的定义1 属性文法n属性规则的形式=说明 规则是一个赋值结构 属性变量 属性表达式:包括属性变量和常量1 属性文法n属性计算 对于产生
2、式ABC 图P260 描述属性的计算方法 说明P261 想象一下,对于一个表达式是如何计算的?1 属性文法n属性文法思想 每个文法符号定义相关的属性 每个产生式有一个求值规则1 属性文法n属性分类 继承属性 相当于输入属性 有父结点和兄弟结点的属性值决定 综合属性 相当于输出属性 有本结点的继承属性和子结点的属性决定1 属性文法n属性定义 为了描述属性,为每个属性定义:名字 类型 类别 例如表达式 E senv:SEnv denv:DEnv etype:EType eval:EValue Id name:string n val:integer1 属性文法n属性规则 LX1 X2Xk /X1.
3、i=e1 Xk.i=ek L.s=e0/n注意:属性规则没有次序 属性规则并不代表要进行属性计算 Xi可以依赖其后面的属性 定义产生式右部的继承属性规则 定义产生式左边的综合属性规则1 属性文法n属性规则举例产生式属性规则属性定义EPE.val=P.valEval:integerE1 E2+PE1.val=E2.val+P.valP val:integerPnP.val=n.valn val:integerP(E)P.val=E.val1 属性文法n属性规则举例产生式属性规则属性定义EPP.env=E.envE.val=P.valE env:DEnv val:integerE E1+PE1.e
4、nv=E.envP.env=E.envE.val=E1.val+P.valP env:DEnv val:integerPnP.val=n.valn val:integerPnP.val=lookup(id.name,p.devn)id name:stringP(E)P.val=E.val1 属性文法n文法E nE (E)E E+En属性文法E n E.val:=n.valE (E1)E.val:=E1.valE E1+E2 E.val:=E1.val+E2.valn说明1 属性文法n属性文法举例 例子:P245 说明n属性文法与尾动作文法区别 属性规则不是语义动作 属性规则只有求值规则,而无顺
5、序 每个属性定义一次 那些属性变量可以有规则受限2 继承属性与综合属性n属性类别 继承属性 综合属性n说明 开始符号没有继承属性 终极符号只能有综合属性n举例 P246图 讲解3 属性规则n左部变量要求 产生式右部符号的继承属性变量 产生式左部符号的综合属性变量n属性规则次序 先确定属性类型 再写出属性规则3 属性规则n举例 P247 说明4 属性树与属性依赖n属性依赖 由属性规则确定n属性依赖图 节点为属性域 边表示依赖 是一个有向图5 属性求值n定义SynthVal(S)n方法 对于给定的输入串,根节点的继承属性和叶结点的综合属性已经确定。计算属性树中节点的属性值 重复上述过程直到根节点的所有综合属性计算完成为止n举例 P2496 拷贝型属性文法n定义 每个属性规则具有拷贝形式的赋值结构 右部为一个常量或一个属性变量n符号E BC 相当于.left:=B.s.right:=C.sE.s:=.result6 拷贝型属性文法n举例 P250 说明总结n重点 属性文法的基本概念 属性求值规则