From 2b1c357220ae8f5ce119c31414b3c1fe714860f1 Mon Sep 17 00:00:00 2001 From: Mike Lowis Date: Mon, 4 Dec 2023 16:30:16 -0500 Subject: [PATCH] added check_var but it's definitely broken --- cerise.rb | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/cerise.rb b/cerise.rb index 767b4e1..f996951 100755 --- a/cerise.rb +++ b/cerise.rb @@ -664,6 +664,8 @@ class TypeChecker 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 @@ -678,9 +680,8 @@ class TypeChecker 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 @@ -740,16 +741,16 @@ class TypeChecker # 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 @@ -786,12 +787,12 @@ class TypeChecker 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? -- 2.52.0