Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /trunk/src/typechecker/typechecker.sml
ViewVC logotype

Diff of /trunk/src/typechecker/typechecker.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 81, Wed May 26 17:28:54 2010 UTC revision 82, Wed May 26 18:20:49 2010 UTC
# Line 22  Line 22 
22    
23    (* check a dimension, which must be 2 or 3 *)    (* check a dimension, which must be 2 or 3 *)
24      fun checkDim (cxt, d) =      fun checkDim (cxt, d) =
25            if (d < 2) orelse (3 < d)            if (d <= 0)
26              then raise Fail "invalid dimension; must be 2 or 3"              then raise Fail "invalid dimension; must be > 0"
27              else Ty.DimConst(IntInf.toInt d)              else Ty.DimConst(IntInf.toInt d)
28    
29    (* check a shape *)    (* check a shape *)
# Line 149  Line 149 
149                  val ty = checkTy(cxt, ty)                  val ty = checkTy(cxt, ty)
150                  val (args, tys) = checkExprList (env, cxt, args)                  val (args, tys) = checkExprList (env, cxt, args)
151                  in                  in
152                    raise Fail "unimplemented" (* FIXME *)                    raise Fail "E_Cons unimplemented" (* FIXME *)
153                  end                  end
154            (* end case *))            (* end case *))
155    
# Line 245  Line 245 
245              | PT.S_Stabilize => (AST.S_Stabilize, env)              | PT.S_Stabilize => (AST.S_Stabilize, env)
246            (* end case *))            (* end case *))
247    
248        fun checkParams (env, cxt, params) = let
249              fun chkParam (env, cxt, param) = (case param
250                     of PT.P_Mark m => chkParam (env, #span m, #tree m)
251                      | PT.P_Param(ty, x) => let
252                          val x' = Var.new(x, AST.ActorParam, checkTy (cxt, ty))
253                          in
254                            (x', Env.insertLocal(env, x, x'))
255                          end
256                    (* end case *))
257              fun chk (param, (xs, env)) = let
258                    val (x, env) = chkParam (env, cxt, param)
259                    in
260                      (x::xs, env)
261                    end
262              in
263    (* FIXME: need to check for multiple occurences of the same parameter name! *)
264                List.foldr chk ([], env) params
265              end
266    
267        fun checkMethod (env, cxt, meth) = (case meth
268               of PT.M_Mark m => checkMethod (env, #span m, #tree m)
269                | PT.M_Method(name, body) => let
270                    val (body, _) = checkStmt(env, cxt, body)
271                    in
272                      AST.M_Method(name, body)
273                    end
274              (* end case *))
275    
276        fun checkActor (env, cxt, {name, params, state, methods}) = let
277            (* check the actor parameters *)
278              val (params, env) = checkParams (env, cxt, params)
279            (* check the actor state variable definitions *)
280              val (vds, env) = let
281                    fun checkStateVar (vd, (vds, env)) = let
282                          val (x, x', e') = checkVarDecl (env, cxt, AST.ActorStateVar, vd)
283                          in
284                            (AST.VD_Decl(x', e')::vds, Env.insertLocal(env, x, x'))
285                          end
286                    val (vds, env) = List.foldl checkStateVar ([], env) state
287                    in
288                      (List.rev vds, env)
289                    end
290            (* check the actor methods *)
291              val methods = List.map (fn m => checkMethod (env, cxt, m)) methods
292              in
293                AST.D_Actor{name = name, params = params, state = vds, methods = methods}
294              end
295    
296      fun checkDecl (env, cxt, d) = (case d      fun checkDecl (env, cxt, d) = (case d
297             of PT.D_Mark m => checkDecl (env, #span m, #tree m)             of PT.D_Mark m => checkDecl (env, #span m, #tree m)
298              | PT.D_Input(ty, x, optExp) => let              | PT.D_Input(ty, x, optExp) => let
# Line 267  Line 315 
315                  in                  in
316                    (AST.D_Var(AST.VD_Decl(x', e')), Env.insertGlobal(env, x, x'))                    (AST.D_Var(AST.VD_Decl(x', e')), Env.insertGlobal(env, x, x'))
317                  end                  end
318              | PT.D_Actor{name, params, state, methods} => raise Fail "unimplemented" (* FIXME *)              | PT.D_Actor arg => (checkActor(env, cxt, arg), env)
319              | PT.D_InitialArray(bindings, iterators) => raise Fail "unimplemented" (* FIXME *)              | PT.D_InitialArray(bindings, iterators) => raise Fail "unimplemented" (* FIXME *)
320              | PT.D_InitialCollection(bindings, iterators) => raise Fail "unimplemented" (* FIXME *)              | PT.D_InitialCollection(bindings, iterators) => raise Fail "unimplemented" (* FIXME *)
321            (* end case *))            (* end case *))

Legend:
Removed from v.81  
changed lines
  Added in v.82

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0