计算声明语句中名字的类型和相对地址 P [offset: =0 F D→→D:D D→d:T fenter(id name, T type, offset) offset: =offset+.width] Integer tT type: = integer Twidth: =41 T→real T type =real T width: =81 T-arraylnum] of T Ttype: = array(num. val, T1type) Twidth: -num. val XT1 Widthy T type: =pointer(T, type); . width: =4
P→ {offset:=0} D D→D;D D→id:T {enter(id.name,T.type,offset); offset:=offset+T.width} T→integer {T.type:=integer; T.width:=4} T→real {T.type:=real; T.width:=8} T→array[num] of T1 { T.type:=array(num.val,T1 .type) T.width:=num.val×T1 .width} T→↑T1 {T.type:=pointer(T1 .type); T.width:=4} 计算声明语句中名字的类型和相对地址
273赋值语句的翻译 ●7.3.1简单算术表达式及赋值语句
2.7.3 赋值语句的翻译 7.3.1 简单算术表达式及赋值语句
生赋值语句三地址代码的翻译模式 SFid: =E( p: =lookup(id name) fp≠ nil then emit(p /='E place else error/) E-E+E2i E place: =newtemp emit(E place ='E1-place+E2-place)] E-E E2I E place: =newtemp emit(E place =E1-place x,E 2 place)y
产生赋值语句三地址代码的翻译模式 S→id:=E { p:=lookup(id.name); if pnil then emit(p ‘:=’ E.place) else error } E→E1+E2 { E.place:=newtemp; emit(E.place ‘:=’ E1 .place ‘+’ E2 .place)} E→E1 *E2 { E.place:=newtemp; emit(E.place ‘:=’ E1 .place ‘*’ E2 .place)}
生赋值语句三地址代码的翻译模式 I E place: =newtemp; emit(E place: ="uminus'E1. place) E-E1[ E place: =E1- place] E→id i p: =lookup(id name) fp≠ nil then Eplace:p else error y
产生赋值语句三地址代码的翻译模式 E→-E1 { E.place:=newtemp; emit(E.place‘:=’ ‘uminus’E 1 .place)} E→(E1 ) { E.place:=E1 .place} E→id { p:=lookup(id.name); if pnil then E.place:=p else error }
2.732数组元素的引用 数组元素地址的计算: 设A为n维数组,元素大小为W,low为第 维的下界,n是为第谁维可取值的个数, base为A的第一个元素相对地址 ●元素A[12,…,相对地址公式 (…n2+2)n3+13)…)nk+1)×W+ base-((oW1n2+W2)n3+0W3)…)nk+owk)×W C=base-(.(oW1n2+low2)n3+low3))nk+w)×W在编 译时可确定,可存放在符号表中A的表项
2.7.3.2 数组元素的引用 数组元素地址的计算: ⚫ 设A为n维数组,元素大小为w, lowi 为第i 维 的下界,ni 是为第i维 可取值的个数, base为A的第一个元素相对地址 ⚫ 元素A[i1 ,i2 ,…,ik ]相对地址公式 ((…i1 n2+i2 )n3+i3 )…)nk+ik )×w + base-((…((low1 n2+low2 )n3+low3 )…)nk+lowk )×w ⚫ C= base-((…((low1 n2+low2 )n3+low3 )…)nk+lowk )×w在编 译时可确定,可存放在符号表中A的表项