- @ remainder, env')
- end
- | trans_stms env ls (A.For(s1, e, s2, s)::stms) =
- let
- val head = Label.new ()
- val tail = Label.new ()
- val loop = Label.new ()
- val (stm1, env') = if isSome s1 then trans_stms env NONE [valOf s1] else (nil, env)
- val (strans, env') = trans_stms env' (SOME(loop,tail)) s
- val (stm2, env') = if isSome s2 then trans_stms env' NONE [valOf s2] else (nil, env')
- val (remainder, env') = trans_stms env' ls stms
- in
- (stm1
- @ [T.LABEL head, T.JUMPIFN(trans_exp env' e, tail)]
- @ strans
- @ [T.LABEL loop]
- @ stm2
- @ [T.JUMP head, T.LABEL tail]
- @ remainder, env')
- end
- | trans_stms env ls (A.While(e, s)::stms) =
- let
- val head = Label.new ()
- val tail = Label.new ()
- val (strans, env') = trans_stms env (SOME(head,tail)) s
- val (remainder, env') = trans_stms env' ls stms
- in
- (T.LABEL head
- :: T.JUMPIFN(trans_exp env e, tail)
- :: strans
- @ [T.JUMP head, T.LABEL tail]
- @ remainder, env')
- end
-
- | trans_stms env (SOME(b,e)) (A.Break::stms) =
- let
- val (remainder, env') = trans_stms env (SOME(b,e)) stms
- in
- ((T.JUMP e) :: remainder, env')
- end
- | trans_stms env NONE (A.Break::_) = raise ErrorMsg.InternalError "Break from invalid location... should have been caught in typechecker"
- | trans_stms env (SOME(b,e)) (A.Continue::stms) =
- let
- val (remainder, env') = trans_stms env (SOME(b,e)) stms
- in
- ((T.JUMP b) :: remainder, env')
- end
- | trans_stms env NONE (A.Continue::_) = raise ErrorMsg.InternalError "Continue from invalid location... should have been caught in typechecker"
+ @ remainder)
+ end
+ | trans_stms vars ls (A.For(s1, e, s2, s)::stms) =
+ let
+ val head = Label.new ()
+ val tail = Label.new ()
+ val loop = Label.new ()
+ val stm1 = if isSome s1 then trans_stms vars NONE [valOf s1] else nil
+ val strans = trans_stms vars (SOME(loop,tail)) s
+ val stm2 = if isSome s2 then trans_stms vars NONE [valOf s2] else nil
+ val remainder = trans_stms vars ls stms
+ in
+ (stm1
+ @ [T.LABEL head, T.JUMPIFN(trans_exp vars e, tail)]
+ @ strans
+ @ [T.LABEL loop]
+ @ stm2
+ @ [T.JUMP head, T.LABEL tail]
+ @ remainder)
+ end
+ | trans_stms vars ls (A.While(e, s)::stms) =
+ let
+ val head = Label.new ()
+ val tail = Label.new ()
+ val strans = trans_stms vars (SOME(head,tail)) s
+ val remainder = trans_stms vars ls stms
+ in
+ (T.LABEL head
+ :: T.JUMPIFN(trans_exp vars e, tail)
+ :: strans
+ @ [T.JUMP head, T.LABEL tail]
+ @ remainder)
+ end