0
点赞
收藏
分享

微信扫一扫

UCC编译器学习笔记10


编译器如何实现遇到编译错误后,能继续往下编译,这样能在一次编译中尽可能找出所有错误,给报出来,这样程序员可以一次性修改这些错误了,如下:

if (! IsIntegType(swtchStmt->expr->ty))
{
Error(&stmt->coord, "The expression in a switch statement shall be integer type.");
swtchStmt->expr->ty = T(INT); //这样强行置为TNT整型类型,因此可以继续往下语义检查
}
/******************************************************************
default-statement
default : statement
******************************************************************/
static AstStatement CheckDefaultStatement(AstStatement stmt)
{
AstDefaultStatement defStmt = AsDef(stmt);
AstSwitchStatement swtchStmt;
swtchStmt = (AstSwitchStatement)TopStatement(CURRENTF->swtches);

    if (swtchStmt == NULL) //说明default语句出现了,但是当前却没有switch语句中,说明default不应该出现,这个只能在语义检查阶段才能知道非法

 

{
Error(&stmt->coord, "A default label shall appear in a switch statement.");
return stmt;
}
if (swtchStmt->defStmt != NULL)
{
Error(&stmt->coord, "There shall be only one default label in a switch statement.");
return stmt;
}
defStmt->stmt = CheckStatement(defStmt->stmt);
swtchStmt->defStmt = defStmt;
return stmt;
}
举报

相关推荐

0 条评论