学习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语句的支持