diff --git a/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs b/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs index ec7f3812f119f8566a04cf43e7779ceb47416c6f..9bb671e534480b5b1dfefb4185ea030c84126312 100644 --- a/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs +++ b/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs @@ -99,13 +99,13 @@ namespace SimpleLang.Visitors public override void VisitIfNode(IfNode i) { - var x = genc.DeclareLocal(typeof(int)); //переменная условного выражения + //var x = genc.DeclareLocal(typeof(int)); //переменная условного выражения i.expr.Visit(this); - genc.Emit(OpCodes.Stloc, x); // x := значение условного выражения + //genc.Emit(OpCodes.Stloc, x); // x := значение условного выражения Label jmp = genc.DefineLabel(); - genc.Emit(OpCodes.Ldloc, x); + //genc.Emit(OpCodes.Ldloc, x); genc.Emit(OpCodes.Ldc_I4_0); genc.Emit(OpCodes.Ble, jmp); // if x<=0 then goto jmp @@ -119,25 +119,24 @@ namespace SimpleLang.Visitors public override void VisitWhileNode(WhileNode wh) { - var x = genc.DeclareLocal(typeof(int)); //переменная цикла с условием - wh.Expr.Visit(this); - genc.Emit(OpCodes.Stloc, x); // x := значение условного выражения в цикле + //wh.Expr.Visit(this); + //genc.Emit(OpCodes.Stloc, x); // x := значение условного выражения в цикле Label stop = genc.DefineLabel(); Label back = genc.DefineLabel(); genc.MarkLabel(back); - genc.Emit(OpCodes.Ldloc, x); + wh.Expr.Visit(this); genc.Emit(OpCodes.Ldc_I4_0); - genc.Emit(OpCodes.Ble, stop); // if x<=0 then goto stop + genc.Emit(OpCodes.Beq, stop); // if x == 0 then goto stop wh.Stat.Visit(this); - genc.Emit(OpCodes.Ldloc, x); // положить x на стек + /*genc.Emit(OpCodes.Ldloc, x); // положить x на стек genc.Emit(OpCodes.Ldc_I4_1); // положить 1 на стек genc.Emit(OpCodes.Sub); - genc.Emit(OpCodes.Stloc, x); // x := x - 1; + genc.Emit(OpCodes.Stloc, x); // x := x - 1;*/ genc.Emit(OpCodes.Br, back); @@ -146,7 +145,7 @@ namespace SimpleLang.Visitors public override void VisitRepeatNode(RepeatNode rp) { - var x = genc.DeclareLocal(typeof(int)); //переменная цикла с постусловием + //var x = genc.DeclareLocal(typeof(int)); //переменная цикла с постусловием Label stop = genc.DefineLabel(); Label back = genc.DefineLabel(); @@ -157,16 +156,16 @@ namespace SimpleLang.Visitors st.Visit(this); rp.Expr.Visit(this); - genc.Emit(OpCodes.Stloc, x); + //genc.Emit(OpCodes.Stloc, x); - genc.Emit(OpCodes.Ldloc, x); + //genc.Emit(OpCodes.Ldloc, x); genc.Emit(OpCodes.Ldc_I4_0); - genc.Emit(OpCodes.Ble, stop); // if x<=0 then goto stop + genc.Emit(OpCodes.Beq, stop); // if x == 0 then goto stop - genc.Emit(OpCodes.Ldloc, x); // положить x на стек + /*genc.Emit(OpCodes.Ldloc, x); // положить x на стек genc.Emit(OpCodes.Ldc_I4_1); // положить 1 на стек genc.Emit(OpCodes.Sub); - genc.Emit(OpCodes.Stloc, x); // x := x - 1; + genc.Emit(OpCodes.Stloc, x); // x := x - 1;*/ genc.Emit(OpCodes.Br, back);