5编译原理,陈意云 ,课后答案5.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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 + b t2 := c + d t3 := t1 * t2 t4 := -t3 t5 := t1 + c t6 := 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 1 5: return 0 7.4 修改图7.4中计算声明的类型和相对地址的翻译方案,允许名字表而不是单个名字出现在形式为D-id: T的声明中。 P - { offset = 0; } DS D - D;D D - 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 | T T - T*F | F F - -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)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档