中间代码
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
实现ENTRY(i)
定义两个语义函数 LOOKUP(NAME): 对NAME查符号表.若此名出现在表中, 则将其表项位置作为LOOKUP的值; 否则,LOOKUP为空. FILLSYM(NAME):
在符号表中开辟一新项,项名
为NAME,把此项的入口作为FILLSYM的值.
12
ENTRY定义为: FUNCTION ENTRY(NAME) BEGIN ENTRY:=LOOKUP(NAME); IF ENTRY=NULL THEN ERROR [ENTRY:=FILLSYM(NAME)] END
E→E(1) op E(2) {E · VAL= TRIP(op, E(1) · VAL , E(2) · VAL) } E→(E(1)) {E · VAL = E(1) · VAL } E→-E(1) {E · VAL= TRIP(@ , E(1) · VAL , _)} @代表一元负运算 E →id {E · VAL = ENTRY(id)}
#VX:=B
#VX:=FB #VX:=TB
+
+ +
R8
R6 R4
FB · PLACE:=ENTRY(B)
TB· PLACE:=FB· PLACE EB· PLACE:=TB· PLACE
8
9
0345
034510
#VX:=EB
#VX:=EB+
+
C
S10
S9
27
步 状态栈 骤 10 0345109
11 0345107
25
(5) T(1) → T(2)*F {T(1)· PLACE:=NEWTEMP; GEN(*, T(2)· PLACE, F· PLACE, T(1) · PLACE (6) T → F {T· PLACE:=F· PLACE} (7) F →(E) {F· PLACE:=E· PLACE} (8) F → i {F· PLACE:=ENTRY(i)} (9)V →i {V· PLACE:=ENTRY(i)}
19
三、四元式
1、表示 Op ARG1 ARG2 RESULT 其中: ARG1, ARG2, RESULT(运算结果)是用户定义的变量 或引进的临时变量, 指向符号表的入口位置. 2、说明 ①一目运算用ARG1 ②四元式出现的顺序与表达式的计值顺序一致. ③临时变量:可以象变量名一样填入符号表. ④四元式之间通过临时变量联系,易于优化.
* S11
D S9 # R8
F D· PLACE:=ENTRY(D)
15 03451013117
16 03451013 17 0345 18 01
#VX:=EB+TC*FD # R5
#VX:=EB+TT1 # VX:=ET2 #A # # # R3 R2
(*, TC· PLACE, F D· PLACE,T1 · PLACE)
符号栈
#VX:=EB+C
输 动 语义操作 入 作 PLACE:=ENTRY(C) * R8 FC·
* R6
TC· PLACE:=FC· PLACE
# VX:=EB+FC
12 03451013
13 0345101311 14 03451013119
#VX:=EB+TC
#VX:=EB+TC* #VX:=EB+TC*D
逆波兰 ab+cd+*
1
2、后缀式的计算:利用分析栈
计算步骤:自左向右扫描后缀式 遇到运算量进栈
遇到k目运算符则作用于栈顶的k项
用运算结果代替这k项. 例:计算ab+c*
a, b
b a
+
t1
c
c t1
*
t2
2
3、后缀式的推广
(1)赋值语句的后缀式
a:=e
逆波兰: ae:=
逆波兰 a3bc+*:=
E →id
{E ·code= id}
5
后缀式放入POST[k]中
产生式 E→E(1) op E(2) E→(E(1)) E →id 语义动作 {POST[k]:=op; k=k+1} { }
{POST[k]:=id; k=k+1}
6
二、三元式和树 1、三元式 (1)表示形式 op ARG1 ARG2 其中:op:运算符 ARG1:第一运算量 ARG2:第二运算量 表达式及各种语句都可以表示成三元式 三元式出现的顺序为表达式的计值顺序 一目运算任选ARG1或ARG2
例:if e then x else y表示成
e’
p1
jez
x’
p2
jump
y’
…
4
4、语法制导生成后缀式
E· code:构成后缀式的符号串 ‖:两串并置运算 Op:运算符 产生式 E→E(1) op E(2) E→(E(1)) 语义动作 {E · code= E(1) · code ‖ E(2) · code ‖op} {E · code= E(1) · code }
23
2、文法 S→A A →V:=E E →E+T∣T T → T*F∣F F →(E) ∣i V →i 此文法为SLR(1)文法, 可以构造出SLR(1)分析表.
24
3、产生式及语义动作 (1) S→A { } (2) A →V:=E {GEN(:=, E· PLACE, _, V· PLACE} (3) E(1) →E(2)+T {E(1)· PLACE:=NEWTEMP; GEN(+, E(2)· PLACE, T· PLACE, E(1) · PLACE} (4)E → T {E· PLACE:=T· PLACE}
20
例:A:=-B*(C+D) op ARG1 ARG2 (1) @ B _ (2) + C D (3) * T1 T2 (4) := T3 _
RESULT T1 T2 T3 A
其中:Ti 是临时变量
21
§5.4 自下而上分析法:简单语句的翻译 一、语句的翻译 1、语句:各种语句均有语义动作 ①可执行语句----生成四元式 ②不可执行语句---填写符号表 2、语句翻译的构思要点 ①确定语句的目标代码结构 ②中间代码 ③添加语义动作 3、数据结构:符号表,四元式表,临时变量表
F
E的代码 S1的代码 S2的代码
29
T
2、布尔式的源文法 G[E]:
E→E∧E
E→E∨E E→E E→(E) E→i rop i E→i 其中: rop为关系运算符, >, <, =, ≧,≦, ≠
30
3、布尔式的四元式形式 (jnz, A, _ , p):
若A为真转第p个四元式
(jez, A, _ , p): 若A为假转第p个四元式 (jθ, A1, A2, p): 若的A1 θ A2关系为真转第p个四元式 (j,_ , _ , p): 无条件转第p个四元式
例: a:=3*(b+c)
(2)条件语句的后缀式 例: if e then x else y
将if—then —else 看成三目运算符¥ 逆波兰:exy ¥ 缺点:x,y 都被计值
3
改进:将后缀式放在一个一维数组POST[n]中
运算符 无条件转移:jump 条件转移:小于转jlt 零转jez 后缀式 p jump e1e2 p jlt e p jez 意义 转到POST[p] e1<e2转POST[p] e=0转POST[p]
26
例:分析句子X:=B+C*D 步 状态栈 骤 1 0 2 3 4 02 03 034 符号栈 # #X #VX #VX:=
其中X, B, C, D为终结符 输入 动 作 X S2 := := B R9 S4 S9 语义操作
VX· PLACE:=ENTRY(X)
5
6 7
0349
0347 0346
7
例:A+B*C的三元式
op (1) * (2) + ARG1 B A ARG2 C (1)
ARG1和 ARG2: 指示器,指向符号表的某一位置或三元式表自身的某 一项。
8
例:X:=a*b+c op ARG1 ARG2 (1) * a b (2) + (1) c (3) := X (2) 例:(A∧B)∨ (C ∨D) op ARG1 ARG2 (1) ∧ A B (2) C _ (3) ∨ (2) D (4) ∨ (1) (3)
13
2、间接三元式 去除重复三元式,便于优化 用一张间接码表辅以三元式表来表示中间代码. 间接码表按运算的先后顺序列出有关的三元式 在三元式表中的位置.
14
例: x:=(a+b)*c y:=d*(a+b) 一般三元式: op ARG1 (1) + a (2) * (1) (3) := x (4) + a (5) * d (6) := y
5
p+1
(5) (关于S1的四元式序列)
E的真出口
(p+1) (关于S2的四元式序列) (q) ……
E的假出口
问题:确定布尔式的真、假出口
确定目标地址
32
(1) 确定布尔式的真、假出口.
分情况讨论: ①E→E(1) ∨E(2) (E(1)为真,则E为真)
16
例:A*B+C*D 树: + * *
A
B
C
D
三元式 op ARG1 ARG2 (1) * A B (2) * C D (3) + (1) (2)
17
(2)语法制导生成树形表示
E· VAL:指示器,指向树的一个结点. NODE(op, LEFT , RIGHT): 建立一棵新树, 根为op , LEFT, RIGHT分别为左右 分支;从NODE回送的值是一个指示器,指向这棵新树 的根. UNARY(op, CHILD): 生成只有一个分支CHILD的子树. LEAF(i):建立一个以i为标志的结点并回送此结点的地址.
9
(2)语法制导生成三元式
E· VAL: 指示器,或指向符号表的某一项或三元式 自身的某一项 TRIP(op,ARG1,ARG2):语义过程,产生新的三元式 (op,ARG1,ARG2)并回送三元式在表中的位置。
ENTRY(id):语义过程,查找标识符id在符号表中
的位置
10
语法制导生成三元式 产生式 语义动作
31
例: if A∨B<D (1) (jnz, A, _ ,5) (2) (j, _, _ , 3)
then S1 else S2的四元式序列 A的真出口 A的假出口 5 3
(3) (j<, B, D, 5)
(4) (j,_, _, p+1) …… (p) (j , _, _, q)
B的真出口
B的假出口
§5.3 中间代码
一、逆波兰------主要用于表达式 1、表达式的逆波兰表示 后缀式: e1e2……ekθ θ是k目运算符(k>=1)
特点:运算量在前,运算符在后,无括号 例:a+b*c a*(b+c/d) 逆波兰 a bc*+ 逆波兰 ab cd/+*
a*(b+c)
(a+b)*(c+d)
逆波兰 a bc+*
ARG2 b c1 AGR2 (1) + a b (2) * (1) c (3) := x (2) (4) * d (1) (5) := y (4) 间接码表 (1)(2)(3)(1)(4)(5)
15
3、树 用树形数据结构来表示一个表达式或语句. (1)树 ①简单变量或常数的树就是该变量或常数本身. ②如果表示e1和e2的树为T1和T2, 则e1+e2, e1*e2, -e1的树为: + * - T1 T2 T1 T2 T1
22
二、赋值语句和表达式到四元式的翻译 1、定义
NEWTEMP: 函数过程,产生新的临时变量T1,T2,……。 E· PLACE: 与非终结符号E相关的语义变量,表示存放E值的变量 名在符号表的入口或是一个整数码。 GEN(op, ARG1, ARG2, RESULT): 语义过程,把四元式填入四元式表中。 ENTRY(id):语义过程,查找标识符id在符号表中 的位置
(+, EB· PLACE, T1· PLACE,T2· PLACE) (:=,T2· PLACE,_,X)
28
§5.5 作为条件控制语句的布尔式的翻译 1、布尔式的作用 if E then S1 else S2; E的作用:控制对S1和 S2的选择,找到出口,E值不保留. E的出口:真出口----- S1语句 假出口----- S2语句
18
产生式和语义动作
E→E(1) op E(2) {E · VAL= NODE(op, E(1) · VAL, E(2) · VAL) } E→(E(1)) {E · VAL = E(1) · VAL } E→-E(1) {E · VAL= UNARY(@ , E(1) · VAL , _)} @代表一元负运算 E →id {E · VAL = LEAF(id)}