/// <summary> /// if文を構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="cond">条件式</param> /// <param name="then_stmt">条件式が真のときに実行する文</param> /// <param name="else_stmt">条件式が偽のときに実行する文</param> public MIfStmt(string pos, MExpr cond, MStmt then_stmt, MStmt else_stmt) : base(pos) { Cond = cond; ThenStmt = then_stmt; ElseStmt = else_stmt; }
/// <summary> /// 二項演算を構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="op_type">二項演算の種類</param> /// <param name="lhs">左辺式</param> /// <param name="rhs">右辺式</param> public MBinOpExpr(string pos, BinOpType op_type, MExpr lhs, MExpr rhs) : base(pos) { OpType = op_type; Lhs = lhs; Rhs = rhs; }
/// <summary> /// 式のコンパイル /// </summary> /// <param name="ilgen">IL Generator</param> /// <param name="expr">式</param> static void CompileExpr(ILGenerator ilgen, MExpr expr) { if (expr is MVarExpr) { CompileVarExpr(ilgen, (MVarExpr)expr); } else if (expr is MIntExpr) { ilgen.Emit(OpCodes.Ldc_I4, ((MIntExpr)expr).Value); } else if (expr is MStrExpr) { ilgen.Emit(OpCodes.Ldstr, ((MStrExpr)expr).Value); } else if (expr is MCallExpr) { CompileCallExpr(ilgen, (MCallExpr)expr); } else if (expr is MBinOpExpr) { CompileBinOpExpr(ilgen, (MBinOpExpr)expr); } else if (expr is MIfExpr) { CompileIfExpr(ilgen, (MIfExpr)expr); } else if (expr is MNewExpr) { CompileNewExpr(ilgen, (MNewExpr)expr); } else if (expr is MCallStaticExpr) { CompileCallStaticExpr(ilgen, (MCallStaticExpr)expr); } else if (expr is MInvokeExpr) { CompileInvokeExpr(ilgen, (MInvokeExpr)expr); } else { throw new NotImplementedException(); } }
/// <summary> /// 式の型推論 /// </summary> /// <param name="expr">式</param> static void TypeinfExpr(MExpr expr) { if (expr is MVarExpr) { TypeinfVarExpr((MVarExpr)expr); } else if (expr is MIntExpr) { ((MIntExpr)expr).Type = new DotNetType(typeof(int)); } else if (expr is MStrExpr) { ((MStrExpr)expr).Type = new DotNetType(typeof(string)); } else if (expr is MCallExpr) { TypeinfCallExpr((MCallExpr)expr); } else if (expr is MBinOpExpr) { TypeinfBinOpExpr((MBinOpExpr)expr); } else if (expr is MIfExpr) { TypeinfIfExpr((MIfExpr)expr); } else if (expr is MNewExpr) { TypeinfNewExpr((MNewExpr)expr); } else if (expr is MCallStaticExpr) { TypeinfCallStaticExpr((MCallStaticExpr)expr); } else if (expr is MInvokeExpr) { TypeinfInvokeExpr((MInvokeExpr)expr); } else { throw new NotImplementedException(); } }
/// <summary> /// while文を構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="cond">条件式</param> /// <param name="body">本体の文</param> public MWhileStmt(string pos, MExpr cond, MStmt body) : base(pos) { Cond = cond; Body = body; }
/// <summary> /// 変数宣言文を構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="name">変数名</param> /// <param name="expr">初期化式</param> public MVarStmt(string pos, string name, MExpr expr) : base(pos) { Name = name; Expr = expr; }
/// <summary> /// ret文を構築する /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="expr">返す式</param> public MRetStmt(string pos, MExpr expr) : base(pos) { Expr = expr; }
/// <summary> /// 関数呼び出しを構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="fun">関数部分の式</param> /// <param name="args">引数の式の列</param> public MCallExpr(string pos, MExpr fun, List<MExpr> args) : base(pos) { Fun = fun; Args = args; }
public MInvokeExpr(string pos, MExpr expr, string method_name, List<MExpr> args) : base(pos) { Expr = expr; MethodName = method_name; Args = args; }
/// <summary> /// if式を構築 /// </summary> /// <param name="pos">ファイル位置</param> /// <param name="cond">条件式</param> /// <param name="then_expr">条件式が真の場合に評価する式</param> /// <param name="else_expr">条件式が偽の場合に評価する式</param> public MIfExpr(string pos, MExpr cond, MExpr then_expr, MExpr else_expr) : base(pos) { Cond = cond; ThenExpr = then_expr; ElseExpr = else_expr; }