115 |
toStmt (env, VSet.empty, stms) |
toStmt (env, VSet.empty, stms) |
116 |
end |
end |
117 |
|
|
118 |
fun translate (S.Program{globals, globalInit, actors}) = ?? |
fun translate (S.Program{globals, globalInit, actors}) = let |
119 |
|
val (globalInit, env, _) = cvtBlock (VMap.empty, globalInit) |
120 |
|
(* get the SSA names for the globals and a reduced environment *) |
121 |
|
val (env, globs) = let |
122 |
|
val lookup = lookup env |
123 |
|
fun cvtVar (x, (env, globs)) = let |
124 |
|
val x' = lookup x |
125 |
|
in |
126 |
|
(VMap.insert(env, x, x'), x'::globs) |
127 |
|
end |
128 |
|
val (env, globs) = List.foldl cvtVar (VMap.empty, []) globals |
129 |
|
in |
130 |
|
(env, List.rev globs) |
131 |
|
end |
132 |
|
fun cvtActor (S.Actor{name, params, state, stateInit, methods}) = let |
133 |
|
val (env, params) = let |
134 |
|
fun cvtParam (x, (env, xs)) = let |
135 |
|
val x' = newVar x |
136 |
|
in |
137 |
|
(VMap.insert(env, x, x'), x'::xs) |
138 |
|
end |
139 |
|
val (env, params) = List.foldl cvtParam (env, []) params |
140 |
|
in |
141 |
|
(env, List.rev params) |
142 |
|
end |
143 |
|
val (stateInit, env, _) = cvtBlock (env, stateInit) |
144 |
|
val state = List.map (lookup env) state |
145 |
|
fun cvtMethod (S.Method(name, blk)) = let |
146 |
|
val (body, _, _) = cvtBlock (env, blk) |
147 |
|
in |
148 |
|
IL.Method(name, body) |
149 |
|
end |
150 |
|
in |
151 |
|
IL.Actor{ |
152 |
|
name = name, |
153 |
|
params = params, |
154 |
|
state = state, |
155 |
|
stateInit = stateInit, |
156 |
|
methods = List.map cvtMethod methods |
157 |
|
} |
158 |
|
end |
159 |
|
in |
160 |
|
IL.Program{ |
161 |
|
globals = globs, |
162 |
|
globalInit = globalInit, |
163 |
|
actors = List.map cvtActor actors |
164 |
|
} |
165 |
|
end |
166 |
|
|
167 |
end |
end |