- 1、本文档共29页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5编译原理,陈意云 ,课后答案5
luanj@mail.ustc.edu.cn 编译原理习题课(5) 栾 俊 luanj@mail.ustc.edu.cn * 7.1 把算术表达式 –(a+b)*(c+d)+(a+b-c) 翻译成:(a) 语法树(b) 有向无环图(c) 后缀表示(d) 三地址代码 7.1 (续) (a) 语法树 (b) 有向无环图 7.1 (续) (c) 后缀表示ab+cd+*-ab+c++ (d) 三地址代码t1 := a + bt2 := c + dt3 := t1 * t2t4 := -t3t5 := t1 + ct6 := t4 + t5 7.2 把C程序main(){ int i; int a[10]; while(i = 10) a[i] = 0;}的可执行语句翻译成:(a) 语法树(b) 后缀表示(c) 三地址代码 7.2 (续) (a) 语法树 (b) 后缀表示i 10 = a i array 0 = while 7.2 (续) (c) 三地址代码1: if i = 10 goto 3 2: goto 5 3: a[i] := 0;4: goto 15: return 0 7.4 修改图7.4中计算声明的类型和相对地址的翻译方案,允许名字表而不是单个名字出现在形式为D-id: T的声明中。P - { offset = 0; } DS D - D;DD - id:T { enter(id.name, T.type, 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; } 7.4 (续) D - ID_LIST:T ID_LIST - ID_LIST,ID_LIST|id D - { Init(idtable) } ID_LIST:T { for each name in idtable do enter(name, T.type, offset); offset := offset + T.width; end; }ID_LIST - { Init(idtable1); Init(idtable2) } ID_LIST1,ID_LIST2 { merge(idtable1, idtable2, idtable) }ID_LIST - id { add(idtable, id.name); } 7.5 算符θ作用于表达式e1,e2,...,ek的前缀形式是θp1p2...pk,其中pi是ei的前缀形式。(a) 写出a*-(b+c)的前缀形式。(c) 给出把表达式翻成前缀形式的语法制导定义。 7.5 (续) (a) *a-+bc (c) 表达式翻成前缀形式的语法制导定义 E - E+T | TT - T*F | FF - -F | (E) | id L - En { printf(E.string); }E - E1 + T { E.string = “+” + E1.string + T.string; }E - T { E.string = T.string; }T - T1*F { T.string = “*” + T1.string + F.string; }T - F { T.string = F.string; }F - -F1 { F.string = “-” + F1.string; }F - (E) { F.string = E.string; }F - id { F.string = id.value; } 7.7 修改图7.11的语法制导定义,为栈机器产生代码。E ? E1 or E2 { E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘or’, E2.place) }E ? E1 and E2 { E.place := newtemp; emit (E.place, ‘:=’,
文档评论(0)