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
# 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