Skip to content
Snippets Groups Projects
Commit 010135c9 authored by Acer's avatar Acer
Browse files

ParserGenerator if while repeat fixed

parent 08aa4e9d
No related merge requests found
Pipeline #5909 passed with warnings with stages
in 6 minutes and 52 seconds
......@@ -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);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment