From: Mike Lowis Date: Tue, 5 Dec 2023 21:26:35 +0000 (-0500) Subject: started implementing type checking X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=bb5bd2e956f03d516be5c704088c1b3157f1754c;p=proto%2Faas.git started implementing type checking --- diff --git a/cerise.rb b/cerise.rb index f996951..2e42a04 100755 --- a/cerise.rb +++ b/cerise.rb @@ -428,13 +428,13 @@ class Parser def make_binop(loc, op, left, right) node = IR::Op.new(loc, nil, op, left, right) - checker.infer(syms, node) +# checker.infer(syms, node) node end def make_unop(loc, op, value) node = IR::Op.new(loc, nil, op, value, nil) - checker.infer(syms, node) +# checker.infer(syms, node) node end @@ -1038,20 +1038,29 @@ end # Emit the Code ## -$parser = Parser.new("cerise.m") +$parser = Parser.new("cerise.m") +$checker = TypeChecker.new($parser) state = Codegen.init($parser.syms) $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 + if val.type + $checker.check($parser.syms, val.value, val.type) + else + $checker.infer($parser.syms, val.value) + 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