structure Env : ENV = struct structure S = Symbol structure T = Types (* this is wrong, wrong, wrong!!! *) type access = bool type ty = T.ty datatype enventry = VarEntry of {access : Translate.access, ty: ty} | FunEntry of {level : Translate.level, label : Temp.label, formals : ty list, result : ty} (* colin's super el33t function to add definitions to a symbol table *) fun construct_env (entries) = foldr (fn ((name, def), t) => (S.enter(t, S.symbol name, def))) S.empty entries val base_tenv = construct_env [("int", T.INT), ("string", T.STRING)] val base_venv = construct_env [("print", FunEntry{label=Temp.namedlabel "print", level=Translate.outermost, formals=[T.STRING], result=T.UNIT}), ("flush", FunEntry{label=Temp.namedlabel "flush", level=Translate.outermost, formals=[], result=T.UNIT}), ("getchar", FunEntry{label=Temp.namedlabel "getchar", level=Translate.outermost, formals=[], result=T.STRING}), ("ord", FunEntry{label=Temp.namedlabel "ord", level=Translate.outermost, formals=[T.STRING], result=T.INT}), ("chr", FunEntry{label=Temp.namedlabel "chr", level=Translate.outermost, formals=[T.INT], result=T.STRING}), ("size", FunEntry{label=Temp.namedlabel "size", level=Translate.outermost, formals=[T.STRING], result=T.INT}), ("substring", FunEntry{label=Temp.namedlabel "substring", level=Translate.outermost, formals=[T.STRING, T.INT, T.INT], result=T.STRING}), ("concat", FunEntry{label=Temp.namedlabel "concat", level=Translate.outermost, formals=[T.STRING, T.STRING], result=T.STRING}), ("not", FunEntry{label=Temp.namedlabel "not", level=Translate.outermost, formals=[T.INT], result=T.INT}), ("exit", FunEntry{label=Temp.namedlabel "exit", level=Translate.outermost, formals=[T.INT], result=T.UNIT})] end