下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、各种语言成分的语法及其翻译方案(示例)1. 普通声明语句的翻译 下面是声明语句的文法:Pf prog id (input , output ) D ; S D f D ; D | List : T | proc id D ; S List f Listi, id | idT f integer | real | array C of Ti | Ti | record DC f num C | £声明语句的翻译模式:Pfprog id (input , output) offset := 0 D ; SDfD ; DDfid : Tenter (id .name, T.type, of
2、fset); offset:= offset + T.widthTfintegerT.type := integer; T.width :=4Tfreal T.type :=real; T.width :=8Tf array num of Ti T.type := array (num .val, T1.type);T.width := num .val 灯1.widthTf TTi T.type := pointer (T1.type); T.width := 42. 嵌套过程中声明语句的翻译 嵌套过程声明语句的产生式。Pfprog id (input , output ) D ; SDfD
3、 ; D | id: T | proc id ; D ; S(7.1)嵌套过程声明语句的翻译模式:Pfprog id (input , output) MD ;S addwidth (top(tblptr),top(offset);pop(tblptr);pop(offset)Mf t := mktable(nil );push(t, tblptr); push(0, offset)DfD1Q2Dfprocid ; N D1 ; St:= top(tblptr); addwidth (t, top(offset); pop(tblptr);pop(offset); enterproc(top(
4、tblptr ), id .name,t)D f id : T enter(top(tblptr), id .name, T.type, top(offset);top(offset) := top(offset) + T.widthN f t:= mktable(top(tblptr); push(t, tblptr); push(0, offset)3. 记录的翻译下面是生成记录类型的产生式:Tfrecord D end生成记录类型的翻译模式:T f record L D end T.type := record(top(tblptr);T.width := top(offset);pop
5、(tblptr); pop(offset)L f t:= mktable(nil); push(t, tblptr); push(0, offset)4. 赋值语句的翻译 下面是典型的赋值语句文法:SfLeft := EE - E1 + E2 | E1 * E2 |- E1 |(E1 )| LeftLeftfElist | id日ist f Elist, E |id E(7.2)赋值语句的翻译模式:(1) Sf Left:=Eif Left.offset=null then /*Left 是简单变量 id*/ gencode(Left.addr ':=' E.addr);els
6、egencode(Left.addr '' Left.offset ' ' ':=' E.addr) /* Left 是数组元素*/ EfEi+E2E.addr:=newtemp;gencode(E.addr ':='Ei.addr'+'E2.addr) E-(Ei) E.addr:= Ei.addr(4) EfLeftif Left.offset=null then /*Left 是简单 id*/E. addr:= Left.addrelse begin/* Left 是数组元素*/E. addr:=newtem
7、p;gencode(E.addr ':=' Left.addr ' ' Left.offset '')endLeftfElist Left.addr:=newtemp;/* Left是数组元素,因此存放基址和位移*/Left.offset:=newtemp;gencode(Left.addr ':=' c(Elist .array);gencode(Left.offset ':=' Elist.addr '*' width(Elist.array )(6) Leftfid Left.addr:=id
8、 .addr; Left.offset=null ElistElisti, E t:=newtemp;m:= Elisti.ndim+1;gencode(t ':='曰isti.addr '*' limit (Elist i.array , m); /* 计算 em-i Xnm */gencode(t ':=' t '+' E. addr);/* 计算 + im */Elist.array:= Elist i.array ;Elist.addr:=t;Elist.ndim:=m Elistid E Elist .array :=i
9、d .addr; Elist.addr:= E.addr;曰ist.ndim :=15.各种控制结构的翻译5.1 布尔表达式的翻译布尔表达式的文法为: B-B or M B2 BfB and M B2 Bfnot B1(4) B-(B1) B-E relop E2(6) B-true BffalseMf e布尔表达式的翻译模式如下所示:B-B1 or m B2 backpatch(B1 .falselist, M.quad);B.truelist := merge(B1.truelist , B2.truelist );B.falselist := B2.falselistB- B1 and
10、M B2 backpatch(B1 .truelist, M.quad);B.truelist := B2.truelist ;B.falselist := merge(B1.falselist, B2.falselist)B-not BB.truelist := B1.falselist; B.falselist := B1 .truelist B-(B1) B.truelist := B1.truelist; B.falselist := B1.falselistB-Erelop E2B.truelist kmakelist(nextquad);B.falselist := makelis
11、t(nextquad+1);gencode('if Ei.addr relop .opEi.addr'goto -); gencode('goto -) Bftrue B.truelist := makelist(nextquad); gencode('goto 力BffalseB.falselist := makelist(nextquad); gencode('goto 力Mf M.quad := nextquad5.2 常用控制流语句的翻译控制流语句if-then , if-then-else和while-do的文法为: Sf if B then
12、Si S- if B then S else S2 Sf while B do Si Sf begin L endSf A LfLi;S LfS(7.9)if-then , if -then -else 和 while -do 语句的翻译模式:Sf if B then M1 Si N else M2 S2 backpatch(B.truelist, M.quad);backpatch(B.falselist , M 2.quad);S.nextlist := merge(S1.nextlist, merge(N. nextlist, S2. nextlist)N N.nextlist := m
13、akelist(nextquad); gencode('goto -)Mf M.quad := nextquadSf if B then M Si backpatch(B.truelist, M.quad);S.nextlist := merge(B.falselist , S1. nextlist)Sf while Mi b do M2 Si backpatch(S1.nextlist, M.quad);backpatch(B.truelist ,M2.quad);S.nextlist:= B.falselist; gencode('goto'M1.quad) Sf
14、begin L end S.nextlist:= L.nextlist Sf A S.nextlist := nil L-L1;MSbackpatch(L1.nextlist, M .quad); L.nextlist := S.nextlistLfS( L.nextlist := S.nextlist1.3 for循环语句的翻译for 循环语句的文法如下所示:Sf for id := Ei to E2 step E3 do Sifor 循环语句的翻译模式如下所示:Sf for id := Ei to E2 step E3 do M Si backpatch(Si.nextlist, M.ag
15、ain,);gencode( goto-, -, ,M.again); S.nextlist := M.again ;Mf e M.addr := entry(id); gencode( ' :=Ei.addr, -, M.addr); Ti:=newtemp;gencode( :=E2.a,ddr, -, T1); T2:=newtemp; gencode( :=E3.a,ddr, -, T2); q:=nextquad; gencode( goto-, -, ,q+2); M .again :=q+1; gencode( +M .a, ddr, T2, M.addr);M.next
16、list:=nextquad; gencode( 'ifM.'addr >'Ti 'goto-' );1.4 repeat语句的翻译repeat 语句的文法如下所示:S- repeat Si until BRepeat 语句的翻译模式如下所示:Sf repeat M Siuntil N B backpatch( B.falselist,M .quad);S.nextlist :=B.truelistMf M.quad := nextquadNf e( backpatch (Si .nextlist, nextquad)6. switch 语句的语法
17、制导翻译switch 语句的文法为:Sf switch (E ) ClistClistf caseV : S Clist | default : Sswitch 语句的翻译模式如下所示:Sf switch (E)i:=0; Si.nextlist:=0; push Si.nextlist; push E.addr; push i; q:=0; push qClist pop q;pop i;pop E.addr;pop Si .nextlist; S.nextlist :=merge(Si.nextlist , q); push S.nextlist Clistf caseV :pop q;
18、pop i; i:=i+1; pop E.addr;if nextquad w0 then backpatch(q, nextquad);q:=nextquad;gencode( if' E.addr '却i 'gotcLi);push E.addr; push i;push qSpop q; pop i; pop E.addr; pop Si-1.nextlist; p:=nextquad;gencode( goto -); gencode(Li:);Si.nextlist:=merge(Si.nextlist, p);Si.nextlist:=merge(Si.ne
19、xtlist, Si-1. nextlist);push Si.nextlist; push E.addr ; push i; push q Clist Clistfdefault :pop q; pop i; i:=i+1; pop E.addr;if nextquad w0 then backpatch(q, nextquad);q:=nextquad;gencode( if' E.addr '却i ' gotoV+i);push E.addr; push i;push q Spop q; pop i ; pop E.addr; pop Si-1 .nextlist
20、; p:= nextquad;gencode(goto -); gencode(Li:);Si.nextlist :=merge(Si.nextlist, p);Si.nextlist :=merge(Si. nextlist, Si-1 .nextlist);push Si.nextlist; push E.addr; push i; push q7. 过程调用和返回语句的翻译 过程调用和返回语句的文法如下所示:Sf call id(Elist) 日ist f Elist, E | E Sf return E过程调用语句的翻译模式如下所示: Sf call id (Elist) n :=0;
21、repeatn:=n+1; 从 queue 的队首取出一个实参地址p;gencode('param', -, -, p);until queue 为空 ;gencode('call', id .addr, n, -) 日ist f Elist, E将E.addr添加到queue的队尾日ist f E初始化queue,然后将 E.addr加入到queue的队尾。 过程返回语句的翻译模式为:Sf return Eif 需要返回结果 then gencode( :=', E.addr, -, F); gencode( ret, -, -, -)其中, F 是存放结果的指定单元,四元式(ret, -, -, -)执行如下操作: 恢复主调程序的寄存器内容; 释放过程运行时所占用的数据区; 按返回地址返回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【FFA 2026】Agentic Lake 1 Fluss 湖流一体新篇章:极致实时分析与 AI 实时数据底座
- 2026年二级消防防排烟风机选型测试试卷(含答案及解析)
- 2026年安徽省宿州市中小学编制教师招聘笔试模拟试题及答案详解
- 2026年鹤岗市兴山区中小学编制教师招聘考试备考试题及答案详解
- 2026年株洲市荷塘区中小学编制教师招聘考试备考题库及答案详解
- 2026年白银市平川区中小学编制教师招聘考试参考题库及答案详解
- 2026年佛山市禅城区中小学编制教师招聘笔试备考题库及答案详解
- 2026年六安市金安区事业编单位人员招聘笔试备考试题及答案详解
- 2026年湖北省鄂州市中小学编制教师招聘笔试备考题库及答案详解
- 2026年云南省普洱市事业编单位人员招聘笔试备考试题及答案详解
- 建筑施工物料提升机安全检查标准与实施指南培训
- 2026广东嘉应检测中心有限公司招聘3人考试参考试题及答案详解
- 统编版(2024)八年级下册历史期末复习:材料题 专项练习题 (含答案)
- 绵阳市2026年公开招聘园区产业发展服务专员的备考题库(110人)及一套完整答案详解
- 地下水动态评价技术规范(2025版)
- 江苏科技大学《大学物理A》2025 - 2026学年第一学期期末试卷(A卷)
- 工作场所安全使用化学品规定
- 小学二年级数学下册无纸化测试题
- T-QGCML 772-2023 管状电机标准规范
- 双梁抓斗桥式起重机大修施工方案【完整版】
- 计算机组成原理考试题
评论
0/150
提交评论