]> git.mdlowis.com Git - proto/aas.git/commitdiff
added type parsing master
authorMichael D. Lowis <mike@mdlowis.com>
Mon, 22 Apr 2024 03:30:32 +0000 (23:30 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Mon, 22 Apr 2024 03:30:32 +0000 (23:30 -0400)
cerise.m
cerise.rb

index 92ace9c923c75c0a8d20f4aaf51d977d1b8a5954..786235035551bcad60b95fb8083f233a6cb80a49 100644 (file)
--- a/cerise.m
+++ b/cerise.m
@@ -1,9 +1,9 @@
-main()
+main() : int
 {
     return sum(1+1,3)
 }
 
-sum(a,b)
+sum(a : int, b : int) : int
 {
     def c = 5
     if (a < b)
index e79220cc5cb076f3b3f835a5942097218223e89d..7711bb1f97672c7b924aa6b954081dbf6e0061f9 100755 (executable)
--- a/cerise.rb
+++ b/cerise.rb
@@ -267,8 +267,11 @@ class Parser
 
   def function_definition(name)
     args = function_arglist()
-    func = IR::Func.new(name.loc, nil, args, [], [])
+    func = IR::Func.new(name.loc, :void, args, [], [])
     defs = []
+    if accept(":")
+      func.type = expect(:ident).text.to_sym
+    end
     expect("{")
     while matches(:def)
       local = variable_definition()
@@ -290,7 +293,10 @@ class Parser
     args = []
     expect("(")
     while !matches(")")
-      args << identifier()
+      id = identifier()
+      expect(":")
+      id.type = expect(:ident).text.to_sym
+      args << id
       expect(",") if !matches(")")
     end
     expect(")")
@@ -709,10 +715,12 @@ class TypeChecker
 
   def infer_func(env, expr)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def infer_return(env, expr)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def infer_const(env, expr)
@@ -728,10 +736,12 @@ class TypeChecker
 
   def infer_def(env, expr)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def infer_set(env, expr)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def infer_op(env, expr)
@@ -746,10 +756,12 @@ class TypeChecker
 
   def infer_call(env, expr)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def infer_if(env, expr)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   ##
@@ -759,14 +771,18 @@ class TypeChecker
 
   def check_func(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def check_return(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def check_const(env, expr, type)
-    expr, type.type
+    raise "unimplemented"
+    error(expr.loc, "unimplemented")
+#    expr, type.type
   end
 
   def check_var(env, expr, type)
@@ -782,22 +798,27 @@ class TypeChecker
 
   def check_def(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def check_set(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def check_op(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def check_call(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
   def check_if(env, expr, type)
     raise "unimplemented"
+    error(expr.loc, "unimplemented")
   end
 
 
@@ -1113,7 +1134,10 @@ end
 $parser  = Parser.new("cerise.m")
 $checker = TypeChecker.new($parser)
 state = Codegen.init($parser.syms)
+
 $parser.syms.each do |name, val|
+  pp val
+  puts
   if val.type
     $checker.check($parser.syms, val.value, val.type)
   else
@@ -1121,18 +1145,18 @@ $parser.syms.each do |name, val|
   end
 end
 
-#$parser.syms.each do |name, val|
-#  $parser.syms.open_scope
-#  puts "func #{name.to_sym.inspect}, #{val.value.args.length} do"
-#  puts "    locals #{val.value.locals.length}" if val.value.locals.length > 0
-#  state.locals = val.value.locals
-#  val.value.args.each_with_index do |name, idx|
-#    $parser.syms.add_sym(
-#        name.name, name.loc, :param, name.type, idx)
-#  end
-#  val.value.body.each do |stmnt|
-#    Codegen.emit(state, stmnt)
-#  end
-#  puts "end\n\n"
-#  $parser.syms.close_scope
-#end
+$parser.syms.each do |name, val|
+  $parser.syms.open_scope
+  puts "func #{name.to_sym.inspect}, #{val.value.args.length} do"
+  puts "    locals #{val.value.locals.length}" if val.value.locals.length > 0
+  state.locals = val.value.locals
+  val.value.args.each_with_index do |name, idx|
+    $parser.syms.add_sym(
+        name.name, name.loc, :param, name.type, idx)
+  end
+  val.value.body.each do |stmnt|
+    Codegen.emit(state, stmnt)
+  end
+  puts "end\n\n"
+  $parser.syms.close_scope
+end