C编译器剖析_4.1 语义检查_语义检查简介

本文详细介绍了C编译器在语义检查阶段的工作,涉及ucldeclchk.c、uclstmtchk.c和uclexprchk.c文件中的功能。通过建立类型系统和对声明、语句、表达式的检查,确保代码符合C语言的语义。以实例解释了非法操作,如不同类型间的非法运算,并提供了分析代码的策略,从exprchk.c开始,然后是stmtchk.c,最后是declchk.c,尽管这与编译器执行顺序相反,但更利于理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.1  语义检查简介

    在这一章中,我们需要在语法分析阶段建立的语法树的基础上,进行语义检查。UCC编译器中与此相关的代码主要在ucl\declchk.c,ucl\stmtchk.c和ucl\exprchk.c,分别用于对声明Declaration、语句Statement和表达式Expression进行语义检查SemanticsCheck。其中,最重要的工作就是建立C语言的类型系统,我们在第2.4节时就已简单介绍过C语言的类型系统。在阅读这部分代码时,一定需要结合语法树进行,看起来比较笨但却很管用的办法是,把第3章中我们构造出来的语法树画在纸质的笔记本上,对照着语法树,才不至于迷失方向。我们就如一只猴子,在语法树上跳来跳去进行语义检查。在如此枝繁叶茂的语法树上,如果没有对应的图纸做导航,很快就会“云深不知处”了。

    按UCC编译器的正常执行流程,我们需要先为变量名和函数名建立起类型信息,这部分工作就主要是在declchk.c中进行,之后再进行语句和表达式的语义检查。我们反复强调过,通过声明Declaration,C程序员实际上建立了类型表达式,UCC编译器会在语义检查时,为变量名和函数名等标志符建立起相应的类型结构。在第2.4节时,我们已初步介绍了在UCC编译器中,整数、函数、结构体、数组和指针等类型结构在UCC编译器内部是如何表示的。而ucl\declchk.c中的代码就是用于创建这些类型结构。有了这些类型信息后,我们就可以进一步检查一下表达式Expression和语句Statement在语义上是否正确,如图4.1.1所示。其中,a是个结构体对象,而b是个整数,按C语言的语义,表达式a+b是非法的。对表达式的语义检查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值