コード例 #1
0
ファイル: Canon.cs プロジェクト: signingoff/Naive-Tiger
 public static StmExpList Reorder(Tree.ExpList exps)
 {
     if (exps == null)
     {
         return(NopNull);
     }
     else
     {
         Tree.Expr a = exps.Head;
         if (a is Tree.CALL)
         {
             Temp.Temp t = new Temp.Temp();
             Tree.Expr e = new Tree.ESEQ(new Tree.MOVE(new Tree.TEMP(t), a),
                                         new Tree.TEMP(t));
             return(Reorder(new Tree.ExpList(e, exps.Tail)));
         }
         else
         {
             Tree.ESEQ  aa = DoExp(a);
             StmExpList bb = Reorder(exps.Tail);
             if (Commute(bb.Stm, aa.Exp))
             {
                 return(new StmExpList(Seq(aa.Stm, bb.Stm),
                                       new Tree.ExpList(aa.Exp, bb.Exps)));
             }
             else
             {
                 Temp.Temp t = new Temp.Temp();
                 return(new StmExpList(
                            Seq(aa.Stm,
                                Seq(new Tree.MOVE(new Tree.TEMP(t), aa.Exp),
                                    bb.Stm)),
                            new Tree.ExpList(new Tree.TEMP(t), bb.Exps)));
             }
         }
     }
 }
コード例 #2
0
ファイル: Canon.cs プロジェクト: signingoff/Naive-Tiger
 static Tree.ESEQ DoExp(Tree.ESEQ e)
 {
     Tree.Stm  stms = DoStm(e.Stm);
     Tree.ESEQ b    = DoExp(e.Exp);
     return(new Tree.ESEQ(Seq(stms, b.Stm), b.Exp));
 }
コード例 #3
0
ファイル: Canon.cs プロジェクト: Nxun/Naive-Tiger
 public static StmExpList Reorder(Tree.ExpList exps)
 {
     if (exps == null) return NopNull;
     else
     {
         Tree.Expr a = exps.Head;
         if (a is Tree.CALL)
         {
             Temp.Temp t = new Temp.Temp();
             Tree.Expr e = new Tree.ESEQ(new Tree.MOVE(new Tree.TEMP(t), a),
                            new Tree.TEMP(t));
             return Reorder(new Tree.ExpList(e, exps.Tail));
         }
         else
         {
             Tree.ESEQ aa = DoExp(a);
             StmExpList bb = Reorder(exps.Tail);
             if (Commute(bb.Stm, aa.Exp))
                 return new StmExpList(Seq(aa.Stm, bb.Stm),
                           new Tree.ExpList(aa.Exp, bb.Exps));
             else
             {
                 Temp.Temp t = new Temp.Temp();
                 return new StmExpList(
                        Seq(aa.Stm,
                          Seq(new Tree.MOVE(new Tree.TEMP(t), aa.Exp),
                           bb.Stm)),
                        new Tree.ExpList(new Tree.TEMP(t), bb.Exps));
             }
         }
     }
 }