当前位置: 首页 > 工具软件 > UCC > 使用案例 >

UCC编译器学习笔记10

陈昊昊
2023-12-01

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

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;

}

 类似资料: