if (expr.is_a? IR::Op)
check_op(env, expr, type)
+ elsif (expr.is_a? IR::Var)
+ check_var(env, expr, type)
else
etype = infer(env, expr)
if type != etype
infer_const(env, expr)
elsif (expr.is_a? IR::Op)
infer_op(env, expr)
-
-# elsif expr.is_a? IR::Var
-# infer_var(env, expr)
+ elsif expr.is_a? IR::Var
+ infer_var(env, expr)
# elsif expr.is_a? IR::Let
# infer_let(env, expr)
# elsif expr.is_a? IR::If
# check(env, expr.else, type)
# end
#
-# def check_var(env, expr, type)
-# etype = infer(env, expr)
-# if (etype.class == String)
-# expr.type = type
-# env.set_type(expr.name, type)
-# elsif expr.type != type
-# error(expr.loc, "expected #{type}, received #{etype}")
-# end
-# type
-# end
+ def check_var(env, expr, type)
+ etype = infer(env, expr)
+ if (etype.class == String)
+ expr.type = type
+ env.set_type(expr.name, type)
+ elsif expr.type != type
+ error(expr.loc, "expected #{type}, received #{etype}")
+ end
+ type
+ end
#
# def verify(cond, loc, msg)
# error(loc, msg) if not cond
end
-# def infer_var(env, expr)
-# if not env.defined?(expr.name)
-# error(expr.loc, "symbol '#{expr.name}' not defined")
-# end
-# expr.type = env[expr.name][:type]
-# end
+ def infer_var(env, expr)
+ if env[expr.name].nil?
+ error(expr.loc, "symbol '#{expr.name}' not defined")
+ end
+ expr.type = env[expr.name][:type]
+ end
#
# def infer_let(env, let)
# if let.body.nil?