原子语句的中间代码 输入输出语句: s→Read()V. tuple (READ, V Arg) S→ Write(E)E. tuple (WRITE, E. Arg) 语法制导: s→Read(V)#READ S→ Write(E)#NR|TE
原子语句的中间代码 输入输出语句: S →Write(E) E.tuple (WRITE, E.Arg); S → Read(V) V.tuple (READ, V.Arg) 语法制导: S → Read(V) #READ S → Write(E) #WRITE
赋值语句: 赋值语句形式: V: =E pt ptr f::=E str 赋值语句的中间代码形式:(AsS|GN,Arg1,Arg2,n) 或(FL0AT,Arg1,Arg2) S→L:=RL. tuple R. tuple (ASSIGN, R, Arg, L Arg, size) E(FLOAt, R Arg, L Arg) 语法制导:S→:=R#ASS|GN
赋值语句: 赋值语句形式: V:=E Vptr:=V1 ptr f:=E Vstr:=V1 str 赋值语句的中间代码形式:(ASSIGN,Arg1,Arg2,n) 或 (FLOAT,Arg1,Arg2) S → L:= R L.tuple R.tuple (ASSIGN, R,Arg, L.Arg, size) 或 (FLOAT, R.Arg, L.Arg) 语法制导: S →L:=R #ASSIGN
过函调用语句 s→id(E1,E2, E1- tuple En tuple (ACT, E. Arg) 传给形参 (ACT, En. Arg) (CALL. , result) 或(GALL,<f)
过函调用语句 S → id(E1,E2,…,En) E1.tuple … En.tuple (ACT,E1.Arg) … (ACT,En.Arg) (CALL,,result) 或(CALL,) 传给形参
形参实参结合中间代码 ( VALACT,E;.Arg, offset;,size1)…值参 ( VARACT,E;,Arg, offset;,size;)…变参 (FUNCACT, E; Arg, offset, s;i ).. 函数参数 (PROACT, E: Arg, offset, size 过程参数 过/函调用代码: (ca|,,true, result)静态转向地址 (ca||,, false, result)动态转向地址
形参实参结合中间代码: (VALACT, Ei.Arg, offseti, sizei)……值参 (VARACT, Ei.Arg, offseti, sizei)……变参 (FUNCACT, Ei.Arg, offseti, sizei)……函数参数 (PROACT, Ei.Arg, offseti, sizei)……过程参数 过/函调用代码: (call ,, true, result) 静态转向地址 (call ,, false, result) 动态转向地址
G0T0语句和标号语句的中间代码 LABEL L1,L2,L空 S->GOTO (JUMP, ARG L S-L. S LABEL, ARG L S tuple
GOTO语句和标号语句的中间代码 LABEL L1 ,L2 ,...,Ln 空 S→GOTO Li (JUMP, ARG(Li ) ) S→Li :S ( LABEL,ARG(Li) ) S.tuple
结构语句的中间代码 C条件语句的中间代码 While语句的中间代码 C Repea语句的中间代码 CFor语句的中间代码 G Case语句的中间代码
结构语句的中间代码 条件语句的中间代码 While语句的中间代码 Repeat语句的中间代码 For语句的中间代码 Case语句的中间代码
条件语句的中间代码 IF E THEN S, ELSE S2 IF E THEN S E Tuple E Tuple (JUMPO, E. Arg, S El seL : (JUMPO, E. Arg, S OutL) S Tuple S1. Tuple 〔JUMP,S.0utL) (LABEL, S OutL (LABEL. S El seL) … s2 Tuple LABEL, S outL)
条件语句的中间代码 IF E THEN S1 ELSE S2 E.Tuple (JUMP0,E.Arg,S.ElseL) S1.Tuple (JUMP,S.OutL) (LABEL,S.ElseL) S2.Tuple (LABEL,S.OutL) IF E THEN S E.Tuple (JUMP0,E.Arg,S.OutL) S1.Tuple (LABEL,S.OutL)
条件语句代码生成原理 在f处: 产生标号S. Esel和S.0utL 在then处: 产生中间代码(JUMP0,E.Arg,S. EIsel) ÷在else处 产生中间代码(JUMP,S.0utL) LABEL, S ElseL) 在S出口处:( LABEL,S.outL)
条件语句代码生成原理 在if处: 产生标号 S.ElseL和S.OutL; 在then处: 产生中间代码(JUMP0, E.Arg, S.ElseL) ; 在else处: 产生中间代码 (JUMP, S.OutL) ( LABEL, S.ElseL) 在S出口处: (LABEL, S.OutL )
条件语句代码生成的L文法 s if startif e then Testf s, elsePart ElsePart =y else #GenJump #GenEl seL S2 #GenOutL E| sePat→λ# GenEI sel # Start:生成两个标号S. EIsel,S.0utL #TestIF: Generate JUMPO, E. arg, SEl seL #GenJump: Generate(JUMP, ElsePart OutL # I seL: Generate LABEL ElsePart. El seL #GenOutL: Generate(LABEL, ElsePart OutL
条件语句代码生成的LL文法 S → if #StartIF E then #TestIF S1 ElsePart ElsePart → else #GenJump #GenElseL S2 #GenOutL ElsePart → #GenElseL #StartIF :生成两个标号S.ElseL,S.OutL #TestIF : Generate(JUMP0, E.Arg , S.ElseL ) #GenJump : Generate(JUMP, ElsePart.OutL ) #GenElseL : Generate(LABEL, ElsePart.ElseL) #GenOutL : Generate(LABEL, ElsePart.OutL )
While语句的中间代码 s→) WHILE E D0S LABEL, S Start) E Tuple (JUMPo, E. Arg, S OutL S, Tuple :-JUMP, S StartD (LABEL, S OutL)
While语句的中间代码 S → WHILE E DO S1 E.Tuple (JUMP0,E.Arg,S.OutL) S1.Tuple (JUMP,S.StartL) (LABEL,S.OutL) (LABEL,S.StartL)