正在加载图片...
China-pub.com 第8章代码生成 313 下载 1de 3 adi atn adi 表81P代码合成字符串属性的属性文法 文法规则 语义规则 ep→id=ep, exp,pcode "lda"id.strval +exp.pcode +"stn exp-aexp exp.pcode aexp.pcode aexp,aexp,+factor aexp:pcode=aexp:pcode ++factor.pcode++"adi gexn-factor aexn ncode factor ncode factor一(ep) factorpcode=exp.pcode factor→nu 2)三地址码前面那个简单表达式的三地址码属性文法在表8-2中给出。在那张表中,我 们称代码属性为tacode。同表8-l,也用+表示其间插有换行符的串连接,表示其间有空格的 串连接。与P代码不同,三地码要求为表达式的中间结果生成临时变量名,这就要求属性文法 在每个节点中都包括一个新名字属性。这个属性也是合成的,如果没有为一个内部节点分配 个新产生的临时名,就用newtemp()产生 个临时名字系列t1、t2、t3,,(每次调用 newtemp()就返回一个新的)。在这个简单例子中,仅对应于+的节点需临时名,赋值操作使用 右边的表达式的名字。 表82三地址码作为合成串属性的属性文法 文法规则 语义规则 ep→id=ep exD.Hame=exD.月ane exp tacode exp..tacode +id.strval ="lexp.name ep一aep exp.name aexp.name aep,→ae明,+facto aexp,to code+factor.tacod +aexp namel"="aexp.nam "+"actor.name aep一factor aexp.name factor.name aexp.tacode factor.tacode factor一(ep) factor namte exp.nante factor.tacode exptacode factornum factor-id factor.tacode 表8-2的产生式exp一aexp和aep一factor中,将名字属性即1 acodek属性从子节点提到父节点, 在操作符内部节点中,新名字属性应在联合的acode代码之前生成。在叶产生式factor-一num利ldc 3 adi s t n ldc 4 a d i 表8-1 P-代码合成字符串属性的属性文法 文 法 规 则 语 义 规 则 e x p1 → i d = e x p2 e x p1 .p c o d e = "lda" || i d. s t rv a l ++ e x p2 .p c o d e ++ " s t n " e x p → a e x p e x p.p c o d e = a e x p.p c o d e a e x p1 → a e x p2 + f a c t o r a e x p1 .p c o d e = a e x p2 .p c o d e ++ f a c t o r.p c o d e + + " a d i " a e x p → f a c t o r a e x p.p c o d e = f a c t o r.p c o d e f a c t o r → ( e x p ) f a c t o r.p c o d e = e x p.p c o d e f a c t o r → n u m f a c t o r.p c o d e = " l d c "| |n u m.s t rv a l f a c t o r → i d f a c t o r.p c o d e = " l o d "| |i d.s t rv a l 2) 三地址码 前面那个简单表达式的三地址码属性文法在表 8 - 2中给出。在那张表中,我 们称代码属性为t a c o d e。同表8 - 1,也用+ +表示其间插有换行符的串连接, | |表示其间有空格的 串连接。与P -代码不同,三地码要求为表达式的中间结果生成临时变量名,这就要求属性文法 在每个节点中都包括一个新名字属性。这个属性也是合成的,如果没有为一个内部节点分配一 个新产生的临时名,就用 n e w t e m p( ) 产生一个临时名字系列 t 1、t 2、t 3, . . . ( 每次调用 n e w t e mp( )就返回一个新的)。在这个简单例子中,仅对应于 +的节点需临时名,赋值操作使用 右边的表达式的名字。 表8-2 三地址码作为合成串属性的属性文法 文 法 规 则 语 义 规 则 e x p1 → i d = e x p2 e x p1 .n a m e = e x p2 .n a m e e x p1 .t a c o d e = e x p2 .t a c o d e ++ i d.s t rv a l || " = "| |e x p2 .n a m e e x p → a e x p e x p.n a m e = a e x p.n a m e e x p.t a c o d e = a e x p.t a c o d e a e x p1 → a e x p2 + f a c t o r a e x p1 .n a m e = n e w t e m p( ) a e x p1 .t a c o d e = a e x p2 .t a c o d e ++ f a c t o r.t a c o d e ++ a e x p1 .n a m e|| " = "|| a e x p2 .n a m e || " + "| |f a c t o r.n a m e a e x p → f a c t o r a e x p.n a m e = f a c t o r.n a m e a e x p.t a c o d e = f a c t o r.t a c o d e f a c t o r → ( e x p ) f a c t o r.n a m e = e x p.n a m e f a c t o r.t a c o d e = e x p.t a c o d e f a c t o r → n u m f a c t o r.n a m e = n u m. s t rv a l f a c t o r.tacode = " " f a c t o r → i d f a c t o r.n a m e = i d.s t rv a l f a c t o r.t a c o d e = " " 表8 - 2的产生式e x p→a e x p和a e x p→f a c t o r中,将名字属性即t a c o d e属性从子节点提到父节点, 在操作符内部节点中,新名字属性应在联合的 t a c o d e代码之前生成。在叶产生式f a c t o r→n u m和 第 8章 代 码 生 成 3 1 3 下载
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有