From: Michael D. Lowis Date: Mon, 22 Apr 2024 03:30:32 +0000 (-0400) Subject: added type parsing X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=HEAD;p=proto%2Faas.git added type parsing --- diff --git a/cerise.m b/cerise.m index 92ace9c..7862350 100644 --- 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) diff --git a/cerise.rb b/cerise.rb index e79220c..7711bb1 100755 --- 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