循環(huán)具有類似的結(jié)構(gòu):條件判斷,循環(huán)體。
其基類如下所示:
public class Loop : ControlFlow { public Expression.ExpressionNode Condition; public virtual Block Body { get { return Children.Count > 0 ? Children.Last() as Block : null; } } public bool NeedBreak = false; public bool NeedContinue = false;
最簡(jiǎn)單的循環(huán)莫過(guò)于while,或do..while。好了,已經(jīng)將while循環(huán)都列舉了。先看while循環(huán)的運(yùn)行代碼:
public override void Run(Context ctx) { Debug.WriteLine("Begin While."); base.Run(ctx); while (true) { if (Condition != null) { Expression.Operand.Value condVal = Condition.Evaluate(this).GetValue(this); Debug.WriteLine(string.Format("Condition: [{0}] = {1}", Condition.ToString(), condVal.ToString())); if (condVal.AsInt == 0) { break; } } Body.Run(this); if (NeedBreak) break; } // while Debug.WriteLine("End While."); }
do...while與while不同的部分在于,先運(yùn)行循環(huán)體,再運(yùn)行判斷:
public override void Run(Context ctx) { Debug.WriteLine("Begin Do...While."); base.Run(ctx); while(true) { Body.Run(this); if (NeedBreak) break; if (Condition != null) { Expression.Operand.Value val = Condition.Evaluate(this).GetValue(this); Debug.WriteLine(string.Format("Condition : {0} = {1}", Condition.ToString(), val.ToString())); if (val.AsInt == 0) { break; } } } // while Debug.WriteLine("End Do...While."); }
復(fù)雜一點(diǎn)的是for循環(huán),比其它循環(huán)結(jié)構(gòu)多出初始化部分和迭代部分:
public class ForLoop : Loop { public Context Initializer { get { return Children.Count > 0 ? Children.First() : null; } } public Expression.ExpressionNode Iterator;
由于初始化部分可以定義循環(huán)變量,形如:for(int i = 0; ....)。所以,還需要重載以下兩個(gè)方法:
public override bool HasDefined(string str) { if (FindByName(str) == null) return base.HasDefined(str); else return true; } public override Context FindByName(string str) { Context res = null; if (Initializer != null) { Initializer.Parent = null; res = Initializer.FindByName(str); Initializer.Parent = this; } if (res == null) return this.Parent.FindByName(str); else return res; }
然后就可以確定for循環(huán)的運(yùn)行代碼:
public override void Run(Context ctx) { Debug.WriteLine("Begin For."); if (Initializer != null) Initializer.Run(this); base.Run(ctx); while (true) { if (Condition != null) { Expression.Operand.Value val = Condition.Evaluate(this).GetValue(this); Debug.WriteLine(string.Format("Condition: [{0}] = {1}", Condition.ToString(), val.ToString())); if (val.AsInt == 0) { break; } } Body.Run(this); if (NeedBreak) break; if (Iterator != null) Iterator.Evaluate(this); } // while if (Initializer != null) { Initializer.FreeLocalVariables(); } Debug.WriteLine("End For."); }
聯(lián)系客服