随着解释器功能不断增强,当下我们的解释器已经能够对C语言的解释执行提供了很好的支持,我们有了循环,有了库函数调用,随着我们对解释器进一步的开发,它的功能必将也来越完善,越来越趋近于一个功能强大的C语言解释器,这一节,我们继续锦上添花,为当前的解释器增加对循环while 和 do … while的解释执行功能,完成这节后,我们的解释器开发将进入一个重大的里程碑,那就是,他将能解释执行用C语言编写的快速排序算法,进而也表明,我们开发的解释器已经达到了一个比较成熟的地步,完成本节代码后,我们的解释器将能解释执行下面代码:,今天小编就来聊一聊关于dowhile循环的用法java?接下来我们就一起去研究一下吧!
dowhile循环的用法java
随着解释器功能不断增强,当下我们的解释器已经能够对C语言的解释执行提供了很好的支持,我们有了循环,有了库函数调用,随着我们对解释器进一步的开发,它的功能必将也来越完善,越来越趋近于一个功能强大的C语言解释器,这一节,我们继续锦上添花,为当前的解释器增加对循环while 和 do … while的解释执行功能,完成这节后,我们的解释器开发将进入一个重大的里程碑,那就是,他将能解释执行用C语言编写的快速排序算法,进而也表明,我们开发的解释器已经达到了一个比较成熟的地步,完成本节代码后,我们的解释器将能解释执行下面代码:
int a[3];
void main() {
int i;
i = 0;
while (i < 3) {
a[i] = i;
i ;
}
i = 0;
do {
printf("%d",a[i]);
i ;
} while (i < 3);
}
我们先看看两个循环对应的语法表达式:
STATEMENT -> WHILE LP TEST RP STATEMENT
STATEMENT -> DO STATEMENT WHILE LP TEST RP SEMI
其中,WHILE , DO 对应的就是while 和 do 两个关键字, TEST对应while后面的循环条件。根据语法表达式,我们可以构造对应的语法执行树,在codeTreeBuilder.java中,添加如下代码:
public ICodeNode buildCodeTree(int production, String text) {
ICodeNode node = null;
Symbol symbol = null;
switch (production) {
....
case CGrammarInitializer.While_LP_Test_Rp_TO_Statement:
case CGrammarInitializer.Do_Statement_While_Test_To_Statement:
node = ICodeFactory.createICodeNode(CTokenType.STATEMENT);
node.addChild(codeNodeStack.pop());
node.addChild(codeNodeStack.pop());
break;
....
}
}
while 语句 和 do..while 语句的执行树节点构造方式是一样的,但逻辑上有些不同,对于while 语句, 添加的第一个节点是TEST, 也就是跟在while 后面的条件判断语句,第二个节点这是在大括号里面的STATEMENT。但是对于do…while语句,第一个节点对应的是大括号里面的STATEMENT, 第二个节点才是用于判断循环是否结束的条件判断语句。
对两个循环语句的解释执行还是落在StatementExecutor的实现中:
public class StatementExecutor extends BaseExecutor{
private enum LoopType {
FOR,
WHILE,
DO_WHILE
};
@Override
public Object Execute(ICodeNode root) {
int production = (int)root.getAttribute(ICodeKey.PRODUCTION);
ICodeNode node;
switch (production) {
....
case CGrammarInitializer.While_LP_Test_Rp_TO_Statement:
while (isLoopContinute(root, LoopType.WHILE)) {
executeChild(root, 1);
}
break;
case CGrammarInitializer.Do_Statement_While_Test_To_Statement:
do {
executeChild(root, 0);
} while(isLoopContinute(root, LoopType.DO_WHILE));
break;
....
}
private boolean isLoopContinute(ICodeNode root, LoopType type) {
ICodeNode res = null;
if (type == LoopType.FOR || type == LoopType.DO_WHILE) {
res = executeChild(root, 1);
}
else if (type == LoopType.WHILE) {
res = executeChild(root, 0);
}
int result = (Integer)res.getAttribute(ICodeKey.VALUE);
return res != null && result != 0;
}
}
对while 和 do…while 语句的执行稍微有所不同,执行while语句时,我们先执行isLoopContinue,也就是先判断循环条件是否成立,如果成立的话,再执行大括号里面的语句集合,对应do…while, 我们先把大括号里面的语句集合执行一次,然后再判断循环条件是否成立。
从isLoopContinute函数的实现我们可以发现,do..while 和 for 循环一样,下标为1的节点对应的是循环条件判断,而对于while,下标为0的子节点才是对应于循环条件判断。
有了上面代码后,我们解释器就能解释执行while 和 do…while 两个循环语句了。至此,解释器具备已了解释执行快速排序算法的相应功能,在下一节,我们将用C语言实现快速排序算法,然后使用我们构建的解释器来解释执行。能够执行具备一定复杂度的C语言代码,标识着我们的解释器已经达到了一定的专业完备性。
,