5编译原理,陈意云 ,课后答案5
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
7.1 (续)
• (a) 语法树
+ +
• (b) 有向无环图
+
+
-
+
* + + a
c b +
*
+
a
b c
d
a
b
c
d
3
2019/2/12
luanj@mail.ustc.edu.cn
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
10
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; }
2019/2/12
Biblioteka Baidu
luanj@mail.ustc.edu.cn
8
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); }
编译原理习题课(5)
栾 俊 luanj@mail.ustc.edu.cn 2019/2/12
7.1
• 把算术表达式 –(a+b)*(c+d)+(a+b-c) 翻译成: (a) 语法树 (b) 有向无环图 (c) 后缀表示 (d) 三地址代码
2019/2/12
luanj@mail.ustc.edu.cn
2019/2/12
luanj@mail.ustc.edu.cn
9
7.5
• 算符θ作用于表达式e1,e2,...,ek的前缀形式 是θp1p2...pk,其中pi是ei的前缀形式。 (a) 写出a*-(b+c)的前缀形式。 (c) 给出把表达式翻成前缀形式的语法制导 定义。
2019/2/12
luanj@mail.ustc.edu.cn
2019/2/12 luanj@mail.ustc.edu.cn 11
7.7
• 修改图7.11的语法制导定义,为栈机器产生代码。
E E1 or E2 E not E1 E ( E1 ) E id1 relop id2 E E1 and E2 { E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘or’, E2.place) } { E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘and’, E2.place) } { E.place := E1.place } { E.place := newtemp; emit (E.place, ‘:=’, ‘not’, E1.place) } { E.place := newtemp; emit (‘if’, id1.place, relop.op, id2.place,‘goto’, nextstat+3 ); emit (E.place, ‘:=’, ‘0’ ); emit (‘goto’, nextstat + 2 ); emit (E.place, ‘:=’, ‘1’ ) } { E.place := newtemp; emit (E.place, ‘:=’, ‘1’ ) } { E.place := newtemp; emit (E.place, ‘:=’, ‘0’ ) }
2019/2/12
luanj@mail.ustc.edu.cn
7
7.4
• 修改图7.4中计算声明的类型和相对地址的翻译方案,允 许名字表而不是单个名字出现在形式为D->id: T的声明中。
P -> DS D -> D;D D -> id:T T -> integer T -> real T -> array[num]of T1 T -> ↑T1 { offset = 0; }
{ enter(id.name, T.type, offset); offset += T.width; } { T.type = integer; T.width = 4; } { T.type = real; T.width = 8; } { T.type = array(num.val, T1.type); T.width = num.val * T1.width; } { T.type = pointer(T1.type); T.width = 4; }
7.2 (续)
• (a) • (b) 语法树 后缀表示
<=
while
= 10 array a i
i 10 <= a i array 0 = while
i 0
2019/2/12
luanj@mail.ustc.edu.cn
6
7.2 (续)
• (c) 三地址代码 1: if i <= 10 goto 3 2: goto 5 3: a[i] := 0; 4: goto 1 5: return 0
2019/2/12 luanj@mail.ustc.edu.cn 4
7.2
• 把C程序 main(){ int i; int a[10]; while(i <= 10) a[i] = 0; } 的可执行语句翻译成: (a) 语法树 (b) 后缀表示 (c) 三地址代码
2019/2/12 luanj@mail.ustc.edu.cn 5