您的位置:首页 > 编程语言 > C语言/C++

C语言解释器-10 控制结构之循环

2013-03-28 16:59 429 查看
循环具有类似的结构:条件判断,循环体。

其基类如下所示:

publicclassLoop:ControlFlow
{
publicExpression.ExpressionNodeCondition;

publicvirtualBlockBody
{
get{returnChildren.Count>0?Children.Last()asBlock:null;}
}

publicboolNeedBreak=false;
publicboolNeedContinue=false;
最简单的循环莫过于while,或do..while。好了,已经将while循环都列举了。先看while循环的运行代码:
publicoverridevoidRun(Contextctx)
{
Debug.WriteLine("BeginWhile.");

base.Run(ctx);

while(true)
{
if(Condition!=null)
{
Expression.Operand.ValuecondVal=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("EndWhile.");
}


do...while与while不同的部分在于,先运行循环体,再运行判断:

publicoverridevoidRun(Contextctx)
{
Debug.WriteLine("BeginDo...While.");

base.Run(ctx);

while(true)
{
Body.Run(this);

if(NeedBreak)
break;

if(Condition!=null)
{
Expression.Operand.Valueval=Condition.Evaluate(this).GetValue(this);

Debug.WriteLine(string.Format("Condition:{0}={1}",Condition.ToString(),val.ToString()));

if(val.AsInt==0)
{
break;
}
}
}//while

Debug.WriteLine("EndDo...While.");
}


复杂一点的是for循环,比其它循环结构多出初始化部分和迭代部分:

publicclassForLoop:Loop
{
publicContextInitializer
{
get{returnChildren.Count>0?Children.First():null;}
}

publicExpression.ExpressionNodeIterator;



由于初始化部分可以定义循环变量,形如:for(inti=0;....)。所以,还需要重载以下两个方法:

publicoverrideboolHasDefined(stringstr)
{
if(FindByName(str)==null)
returnbase.HasDefined(str);
else
returntrue;
}

publicoverrideContextFindByName(stringstr)
{
Contextres=null;

if(Initializer!=null)
{
Initializer.Parent=null;

res=Initializer.FindByName(str);

Initializer.Parent=this;
}

if(res==null)
returnthis.Parent.FindByName(str);
else
returnres;
}



然后就可以确定for循环的运行代码:

publicoverridevoidRun(Contextctx)
{
Debug.WriteLine("BeginFor.");

if(Initializer!=null)
Initializer.Run(this);

base.Run(ctx);

while(true)
{
if(Condition!=null)
{
Expression.Operand.Valueval=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("EndFor.");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: