- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回顾一下VARPART的计算公式,它是一个乘加式。 (…(i1*d2+i2)d3+i3)…+in-1)dn+in elist. PLACE limit( ARRAY,k) 语义变量和过程 Elist.ARRAY 数组名的符号表入口 Elist.DIM 数组维数计数器 Elist.PLACE 记存业已形成的VARPART的中间结果名字在符号表中的位置,或者是一个临时变量的整数码。 Limit(ARRAY,k) 函数过程,数组ARRAY的第k维长度dk 现在要考虑的变量有两类,每个变量V有两项语义值。 V.PLACE 简单变量 变量名的符号表入口 下标变量 保存CONSPART的临时变量的整数码 V.OFFSET 简单变量 NULL(用于区分简单变量和下标变量) 下标变量 保存VARPART的临时变量的整数码 语义动作 1 A?V:=E {IF (V.OFFSET=NULL) THEN GEN(:=,E.PLACE,_,V.PLACE) ELSE GEN([]=,E.PLACE,_,V.PLACE[V.OFFSET])} 2 E?E(1)+E(2) { T:=NEWTEMP; GEN(+,E(1).PLACE,E(2).PLACE,T); E.PLACE := T } 3 E ? (E(1)) { E.PLACE := E(1).PLACE } 4 E?V { IF (V.OFFSET=NULL) THEN E.PLACE := V.PLACE; ELSE BEGIN T:=NEWTEMP; GEN (=[],V.PLACE[OFFSET],_,T); E.PLACE:=T; END } 5 V?elist] { T:=NEWTEMP; GEN(-,elist.ARRAY,C,T); V.PLACE:=T; V.OFFSET := elist.PLACE; } 6 V ? i { V.PLACE:= ENTRY(i); V.OFFSET:= NULL; } 7 elist?elist(1),E { T:=NEWTEMP; k:= elist(1).DIM + 1; dk:=LIMIT(elist(1).ARRAY,k); GEN(*,elist(1).PLACE,dk,T);GEN(+,E.PLACE,T,T); elist.ARRAY := elist(1).ARRAY; elist.PLACE := T; elist.DIM := k; } 8 elist? i[E { elist.PLACE := E.PLACE; elist.DIM := 1; elist.ARRAY := ENTRY(i) } A是一个10*20的数组,A[I+2,J+1]:= M+N的翻译 (+, I, 2, T1) (+, J, 1, T2) (*, T1, 20, T3) (+, T2, T3, T3) (-, A, 21, T4) (+, M, N, T5) ([]=, T5, _,T4[T3]) [ I+2 E A i elist , elist E?I+2 { T1:=TEMP; GEN(+,I,2,T1); E.PLACE:= T1 } elist ? A[E { elist.PLACE:=E.PLACE; elist.DIM :=1; elist.ARRAY:=ENTRY(A) } J+1 E E?J+1 { T2:=TEMP; GEN(+, J, 1, T2); E.PLACE:= T2 } elist?elist(1),E { T3:=NEWTEMP; k:= elist(1).DIM+1; dk:=limit(elist(1).ARRAY,k); GEN(*,elist(1).PLACE,dk,T3);GEN(+,E.PLACE,T3,T3); elist.ARRAY:=elist(1).ARRAY; elist.PLACE:=T3; elist.DIM:=k} ] V V?elist] { T4:=NEWTEMP; GEN(-,elist.ARRAY,C,T4); V.PLACE:=T4; V.OFFSET:=elist.PLACE; } E?M+N { T5:=NEWTEMP; GEN(+, M, N, T5); E.PLACE:= T5; } A?V:=E { IF (V.OFFSET=NULL) THEN GEN(:=,E.PLACE,_,V.PLACE); ELSE GEN([]=, E.PLACE,
原创力文档


文档评论(0)