随着解释器功能不断加强,当下咱们的解释器已经可以对C语言的解释执行提供了很好的支持,咱们有了循环,有了库函数调用,随着咱们对解释器进一步的开发,它的功能必将也来越完善,愈来愈趋近于一个功能强大的C语言解释器,这一节,咱们继续锦上添花,为当前的解释器增长对循环while 和 do … while的解释执行功能,完成这节后,咱们的解释器开发将进入一个重大的里程碑,那就是,他将能解释执行用C语言编写的快速排序算法,进而也代表,咱们开发的解释器已经达到了一个比较成熟的地步,完成本节代码后,咱们的解释器将能解释执行下面代码:vue
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); }
咱们先看看两个循环对应的语法表达式:java
STATEMENT -> WHILE LP TEST RP STATEMENT STATEMENT -> DO STATEMENT WHILE LP TEST RP SEMI
其中,WHILE , DO 对应的就是while 和 do 两个关键字, TEST对应while后面的循环条件。根据语法表达式,咱们能够构造对应的语法执行树,在codeTreeBuilder.java中,添加以下代码:node
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, 咱们先把大括号里面的语句集合执行一次,而后再判断循环条件是否成立。markdown
从isLoopContinute函数的实现咱们能够发现,do..while 和 for 循环同样,下标为1的节点对应的是循环条件判断,而对于while,下标为0的子节点才是对应于循环条件判断。app
有了上面代码后,咱们解释器就能解释执行while 和 do…while 两个循环语句了。至此,解释器具有已了解释执行快速排序算法的相应功能,在下一节,咱们将用C语言实现快速排序算法,而后使用咱们构建的解释器来解释执行。可以执行具有必定复杂度的C语言代码,标识着咱们的解释器已经达到了必定的专业完备性。ide
更加详细的代码讲解和调试演示过程,请参看视频。函数
本文分享自微信公众号 - Coding迪斯尼(gh_c9f933e7765d)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。oop