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()
args = []
expect("(")
while !matches(")")
- args << identifier()
+ id = identifier()
+ expect(":")
+ id.type = expect(:ident).text.to_sym
+ args << id
expect(",") if !matches(")")
end
expect(")")
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)
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)
def infer_call(env, expr)
raise "unimplemented"
+ error(expr.loc, "unimplemented")
end
def infer_if(env, expr)
raise "unimplemented"
+ error(expr.loc, "unimplemented")
end
##
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)
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
$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
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