コード例 #1
0
ファイル: MStmt.cs プロジェクト: lambdataro/Mokkosu2
 /// <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;
 }
コード例 #2
0
ファイル: MExpr.cs プロジェクト: lambdataro/Mokkosu2
 /// <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;
 }
コード例 #3
0
ファイル: CodeGenerator.cs プロジェクト: lambdataro/Mokkosu2
 /// <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();
     }
 }
コード例 #4
0
ファイル: Typeinf.cs プロジェクト: lambdataro/Mokkosu2
 /// <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();
     }
 }
コード例 #5
0
ファイル: MStmt.cs プロジェクト: lambdataro/Mokkosu2
 /// <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;
 }
コード例 #6
0
ファイル: MStmt.cs プロジェクト: lambdataro/Mokkosu2
 /// <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;
 }
コード例 #7
0
ファイル: MStmt.cs プロジェクト: lambdataro/Mokkosu2
 /// <summary>
 /// ret文を構築する
 /// </summary>
 /// <param name="pos">ファイル位置</param>
 /// <param name="expr">返す式</param>
 public MRetStmt(string pos, MExpr expr)
     : base(pos)
 {
     Expr = expr;
 }
コード例 #8
0
ファイル: MExpr.cs プロジェクト: lambdataro/Mokkosu2
 /// <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;
 }
コード例 #9
0
ファイル: MExpr.cs プロジェクト: lambdataro/Mokkosu2
 public MInvokeExpr(string pos, MExpr expr, string method_name, List<MExpr> args)
     : base(pos)
 {
     Expr = expr;
     MethodName = method_name;
     Args = args;
 }
コード例 #10
0
ファイル: MExpr.cs プロジェクト: lambdataro/Mokkosu2
 /// <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;
 }