c4编译器学习

学习c4编译器

增加了do语句和for语句

在c4的stmt函数体下增加如下代码

if (tk == Do) {
    next();
    a = e + 1;
    stmt();
 
    if (tk == While) {
        next();
        if (tk == '(') next(); else { printf("%d: open paren expected\n", line); exit(-1); }
        expr(Assign);
        if (tk == ')') next(); else { printf("%d: close paren expected\n", line); exit(-1); }
        *++e = BZ; b = ++e; // 跳转到do语言的后面的语句
    }
    *++e = JMP; *++e = (int)a; // 跳转到条件表达式
    *b = (int)(e + 1); // 计算出到do语句后面的语句
}
else if (tk == For) {
    next();
    
    if (tk == '(') next(); else {
        printf("%d: open paren expected\n", line);
        exit(-1);
    }
    // 初始化表达式
    while (1) {
        expr(Assign);

        if (tk == ',') {
            next();
            continue;
        }
        else if (tk == ';') {
            break;
        }
    }
    next();
    a = e + 1; // 条件表达式地址
    expr(Assign); // 条件表达式
    next();
    *++e = BZ; b = ++e; // 跳转到for语言的后面的语句
    *++e = JMP; int* b1 = ++e; // 先跳到实际程序执行段再跳到更新表达式

    int a1 = e + 1; // 更新表达式开始地址
    while (1) {
        expr(Assign);
        if (tk == ',') {
            next();
            continue;
        }
        else if (tk == ')') {
            break;
        }
    }

    if (tk == ')') next(); else {
        printf("%d: close paren expected\n", line);
        exit(-1);
    }
    *++e = JMP; *++e = (int)a; // 跳转到条件表达式
    *b1 = (int)(e + 1); // 实际代码段
    stmt();
    *++e = JMP; *++e = (int)a1; // 跳转到条件表达式
    *b = (int)(e + 1); // 计算出到for语句后面的语句
}

另外在expr函数里原始代码

    else {
        printf("%d: bad expression\n", line);
        exit(-1);
    }

修改成如下

    else {
        if (tk == ',' || tk == ';') {
            return;
        }
        printf("%d: bad expression\n", line);
        exit(-1);
    }

代码头部枚举 Char, Else, Enum, If, Int, Return, Sizeof, While, 修改为Char, Else, Enum, If, Int, Return, Sizeof, While, Do, For,

在main函数初始化p关键字字段里while后面增加 do for 字段

修改后的c4可以支持如下语句

int k;
k = 0;
do {
    printf("%d\n", k++);
} while(k < 100)

int i, j;
for (i = 0, j = 0; i < 100 && j < 100; i++, j++)
{
    printf("i:%d\n", i);
    printf("j:%d\n", j);
}

后续我还会修改c4 计划增加对 结构体 函数指针 数组的支持 switch goto语句的支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值