动手实现编译器(九)——WHILE语句

在上一节中,我们实现了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值