C编译器剖析_4.3 语义检查_语句statement

本文详细介绍了C编译器在语义检查阶段对语句的处理,包括复合语句、break和continue的检查,以及switch、case和default的处理方式。通过函数CheckStatement和相关辅助函数,实现对不同语句的语义验证,并维护符号表和作用域。
摘要由CSDN通过智能技术生成

4.3  对语句Statement的语义检查

   在这一节中,我们来分析一下对语句Statement的语义检查,与其相关的代码在stmtchk.c中。图4.3.1第1至16行的数组StmtCheckers,给出了用于对各语句进行语义检查的函数表,第17行的CheckStatement(stmt)函数根据参数stmt的kind域来查这个函数表,由函数指针来调用相应的函数完成语义检查,如图第18行所示。这样的代码结构我们在对表达式进行语义检查时,也在exprchk.c中遇过。


图4.3.1 CheckStatement()

    在完成对表达式语义检查的基础上,再对switch和while等语句进行语义检查就相对容易了许多。图4.3.1第15行的CheckLocalCompound用于对复合语句进行语义检查,其代码如图4.3.2第20至26行所示。复合语句的左大括号表示了一个新的作用域的开始,我们需要创建新的符号表来存放在该作用域中声明的符号,第22行调用的EnterScope函数中完成了创建新符号表的工作。在图4.3.2第30行,我们把“代表符号表所在作用域深度”的全局变量Level加1,第31至35于创建一个用于存放变量名和函数名的新符号表,由第33行的outer指向外层(深度较浅的)符号表,第35行的全局变量Identifiers始终指向与当前作用域对应的标志符符号表(存放变量名和函数名等);第37至42行用于创建一个新的用于存放结构体名、枚举名和联合体名的符号表࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值