在上一节中,我们实现了IF语句,在这一节中,我们将进一步实现WHILE循环。从某种意义上说,WHILE循环非常类似于IF语句没有“else”子句,除了总是跳回顶部的循环。
WHILE语句的SysY语法如下
Stmt → ‘while’ ‘(’ Cond ‘)’ Stmt
处理流程:
Lstart: 条件
如果条件为假跳到Lend
执行语句
跳转到Lstart
Lend:
这意味着我们可以借用扫描、解析和代码生成我们与 IF 语句一起使用的结构并进行了一些小的更改
还要处理 WHILE 语句。
修改词法分析
对于新的“while”关键字,我们需要一个新的单词T_WHILE
。
在match_keyword()
中加入对“while”的匹配。
case 'w': if(!strcmp(s, "while")) return (T_WHILE);
break;
修改语法分析
对于新的“while”操作,我们需要一个新的AST操作类型A_WHILE
。这个节点有一个左子树来计算条件,还有一个语句块的右子树,它自身是WHILE循环。
同时添加对WHILE语句的分析函数。
// 分析WHILE语句,并返回AST
struct ASTnode *while_statement()
{
struct ASTnode *condAST, *bodyAST;
// 匹配"while"和"("
match(T_WHILE, "while");
lparen();
// 分析以下表达式和后面的')',
// 确保树的操作是一个比较。
condAST = binexpr(0);
if (condAST