/// <summary> /// トップレベル関数定義を構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="name">関数名</param> /// <param name="args">仮引数の列</param> /// <param name="body">本体の文</param> public MTopFun(string pos, string name, List<MArg> args, MStmt body) : base(pos) { Name = name; Args = args; RetType = new TypeVar(); Body = body; }
/// <summary> /// トップレベル関数の型推論 /// </summary> /// <param name="stmt">トップレベル関数</param> static void TypeinfTopFun(MTopFun stmt) { var ret_type = new TypeVar(); var func = new FunctionInfo(stmt.Args, ret_type); function_table.Add(stmt.Name, func); current_function = func; env.StartScope(); foreach (var arg in stmt.Args) { env.Add(stmt.Pos, arg.Name, arg.Type); } TypeinfStmt(stmt.Body); env.EndScope(); if (func.RetType.Reduce() == null) { Unification(stmt.Pos, new DotNetType(typeof(void)), stmt.RetType); } else { Unification(stmt.Pos, func.RetType, stmt.RetType); } }
/// <summary> /// 式を構築 /// </summary> /// <param name="pos">ファイル位置</param> public MExpr(string pos) { Pos = pos; Type = new TypeVar(); }