]> git.mdlowis.com Git - proto/aas.git/commitdiff
added scaffolding for inference
authorMichael D. Lowis <mike@mdlowis.com>
Wed, 6 Dec 2023 04:14:08 +0000 (23:14 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Wed, 6 Dec 2023 04:14:08 +0000 (23:14 -0500)
cerise.rb

index 2e42a044f0feca38e6b5a248100e43636e9046b7..18d3b847cd93d95b04d7c85f0b59e3ad8f1739f6 100755 (executable)
--- a/cerise.rb
+++ b/cerise.rb
@@ -676,29 +676,80 @@ class TypeChecker
   end
 #
   def infer(env, expr)
-    if expr.is_a? IR::Const
+    if expr.is_a? IR::Func
+      infer_func(env, expr)
+    elsif expr.is_a? IR::Return
+      infer_return(env, expr)
+    elsif expr.is_a? IR::Const
       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::Let
-#      infer_let(env, expr)
-#    elsif expr.is_a? IR::If
-#      infer_ifexpr(env, expr)
-#    elsif expr.is_a? IR::Set
-#      infer_set(env, expr)
-#    elsif expr.is_a? IR::Func
-#      infer_func(env, expr)
-#    elsif expr.is_a? IR::Apply
-#      infer_apply(env, expr)
+    elsif expr.is_a? IR::Def
+      infer_def(env, expr)
+    elsif expr.is_a? IR::Set
+      infer_set(env, expr)
+    elsif expr.is_a? IR::Op
+      infer_op(env, expr)
+    elsif expr.is_a? IR::Call
+      infer_call(env, expr)
+    elsif expr.is_a? IR::If
+      infer_if(env, expr)
     else
+      pp expr
       error(expr.loc, "unable to determine type of expression")
     end
   end
 
   private
 
+  def infer_func(env, expr)
+    raise "unimplemented"
+  end
+
+  def infer_return(env, expr)
+    raise "unimplemented"
+  end
+
+  def infer_const(env, expr)
+    expr.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_def(env, expr)
+    raise "unimplemented"
+  end
+
+  def infer_set(env, expr)
+    raise "unimplemented"
+  end
+
+  def infer_op(env, expr)
+    # infer the operand type first
+    vtype = infer(env, expr.left)
+    if (expr.left and expr.right)
+      check_binary(env, expr, vtype)
+    else
+      check_unary(env, expr, vtype)
+    end
+  end
+
+  def infer_call(env, expr)
+    raise "unimplemented"
+  end
+
+  def infer_if(env, expr)
+    raise "unimplemented"
+  end
+
+
+
+
 #  def make_typevar()
 #    @typevar ||= 0
 #    var = "abcdefghijklmnopqrstuvwxyz"[@typevar]
@@ -772,27 +823,6 @@ class TypeChecker
 #    check(env, let.expr, type)
 #  end
 
-  def infer_const(env, expr)
-    expr.type
-  end
-
-  def infer_op(env, expr)
-    # infer the operand type first
-    vtype = infer(env, expr.left)
-    if (expr.left and expr.right)
-      check_binary(env, expr, vtype)
-    else
-      check_unary(env, expr, vtype)
-    end
-  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?