- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章_语法制导翻译与中间代码生成4.0
mktable(tab) 创建一个符号表,父表指针为tab; Enter(tab,name,type,offset)在tab所指符号表中为名字name建立一个登记项,类型type和相对地址offset填入该项中; addwidth(tab,width) 在tab所指符号表表头中记录下该表中所有名字占用的总宽度; enterproc(tab, name, newtab) 在tab所指符号表中为名字name的过程建立一个登记项,参数newtab指向name的符号表。 属性及过程的定义 P→MD addwidth(pop(s_tab), pop(s_offset)) M→? t:=mktab(nil); push(t, s_tab); push(0,s_offset) D→D;D D→ proc id;ND1;S t:= pop(s_tab); addwidth(t,pop(s_offset)) enterproc(top(s_tab), id.name, t) D→id:T Enter(top(s_tab), id.name, T.type, top(s_offset)) push(pop(s_offset)+T.width, s_offset) N→? t:=mktab(top(s_tab)) push(t, s_tab); push(0,s_offset) pop(s_)弹出s_栈顶元素;top(s_)返回s_栈顶元素;push(e,s_)压入e到栈s_. 处理嵌套过程中的说明语句(方法1) program sort(input,output) var a: array[0..10] of int; x:int; proc readarray; var i:int; begin…a….end; proc exchange(i,j:int); begin x:=a[i];a[i]:=a[j];a[j]=x end; proc quicksort(m,n:int); var k,v:int; func partition (y,z:int):int; var i,j:int; begin …a…v…exchange(i,j);…end; begin…end; begin…end. D N D D D N D D D D N D D D D D D P (方法1) P→MD addwidth(pop(s_tab), pop(s_offset)) M→? t:=mktab(nil); push(t, s_tab); push(0,s_offset) D→D;D D→proc id;ND1;S t:= pop(s_tab); addwidth(t,pop(s_offset)) enterproc(top(s_tab), id.name, t) D→id:T enter(top(s_tab), id.name, T.type, top(s_offset)) push(pop(s_offset)+T.width, s_offset) N→? t:=mktab(top(s_tab)); push(t, s_tab); push(0,s_offset) M program sort(input,output) var a: array[0..10] of int; x:int; proc readarray; var i:int; begin…a….end; proc exchange(i,j:int); begin x:=a[i];a[i]:=a[j];a[j]=x end; proc quicksort(m,n:int); var k,v:int; func partition (y,z:int):int; var i,j:int; begin …a…v…exchange(i,j);…end; begin…end; begin…end. D L D D L L D D L D L D L D D L L L P P→L L.intab=mktab(nil); L.ioffs=0 P.symtab=L.outtab D→ id:T D.outtab=D.intab Enter(D.outtab, id.name, T.type, D.ioffs) D.ooffs=D.ioffs+T.width addwidth(D.outtab,D.ooffs)) L→D D.intab=L.intab; L.outtab=D.outtab D.ioffs=L.ioffs;L.ooffs=D.ooffs L1→ L2;D L2.intab=L1.intab; D.intab=L2.outtab L1.outtab=
原创力文档


文档评论(0)