原子语句的中间代码 输入输出语句: 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|G,Arg1,Arg2,n) 或(FL0AT,Arg1,Arg2) S→L:=RL. tuple R. tuple (ASSIG, 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 赋值语句的中间代码形式:(ASSIG,Arg1,Arg2,n) 或 (FLOAT,Arg1,Arg2) S → L:= R L.tuple R.tuple (ASSIG, R.Arg, L.Arg, size) 或 (FLOAT, R.Arg, L.Arg) 语法制导: S →L:=R #ASSIGN
过函调用 f(E1,E2,…,En) E1. tuple tuple (ACT, E. Arg) 传给形参 (ACT, E. Arg) (CALL, , result) 或(GALL
过函调用 f(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 s→> F E THEN S1 Tuple E Tuple (JUMPO, E. Arg, S EI sel) (JUMPO, E. Arg, S OutL)\ L s, tuple S, Tuple KJUMP, S OutL) (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) S → IF E THEN S1 E.Tuple (JUMP0,E.Arg,S.OutL) S1.Tuple (LABEL,S.OutL)
条件语句代码生成的L文法 Sif start e then testf s, elsepart Endf ElsePart =y else #GenJump #GenEl seL S2 #GenOutL E丨 sePat→3#Gen0utL #StartIF: PUSH(S ElseL); PUSH(S outL iTest F: Generate(JUMPO, Sem[top]. Arg, Sem[top-2]); POP(1) #GenJump: Generate( JUMP, Sem[top]. arg #GenEI seL Generate(LABEL, Sem[top-1]. Ar g) #GenOutL: Generate(LABEL, Sem[top. arg) HEnd IF: POP(2)
条件语句代码生成的LL文法 S→if #StartIF E then #TestIF S1 ElsePart #EndIF ElsePart → else #GenJump #GenElseL S2 #GenOutL ElsePart → #GenOutL #StartIF:PUSH(S.ElseL);PUSH(S.OutL); #TestIF:Generate(JUMP0,Sem[top].Arg,Sem[top-2]);POP(1) #GenJump:Generate(JUMP,Sem[top].Arg ) #GenElseL: Generate(LABEL,Sem[top-1].Arg) #GenOutL: Generate(LABEL, Sem[top].Arg) #EndIF: POP(2)
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)
While语句代码生成的LL文法 S- while startwhile e do twhiletest S, Fini shwhile #StartWhi le: PUSH (S Start; PUSH(S OutL) Generate(LABEL, Sem[top-1]. Arg) wHi leTest: Generate(JUMPO, Sem[top]. Arg, Semltop-1] Ar g) P0P(1); H FinishWhi le: Generate(JUMP,S. StartL) Generate LABEL, S OutL) POP(2)
While语句代码生成的LL文法 S → while #StartWhile E do #WhileTest S1 #FinishWhile #StartWhile :PUSH(S.StartL);PUSH(S.OutL); Generate(LABEL,Sem[top-1].Arg) #WhileTest: Generate(JUMP0,Sem[top].Arg,Sem[top-1].Arg) POP(1); # FinishWhile: Generate(JUMP, S.StartL) Generate(LABEL, S.OutL) POP(2)