C编译器剖析_3.3 语法分析_C语言的外部声明(3)

C 语言文法 ( C Language Grammar ) 【代码】C 语言文法 ( C Language Grammar ) 阅读详情

    在上一小节中,我们讨论了C标准文法中与声明Declaration有关的几个非终结符。在此基础上,接下来让我们看看ucl\decl.c中与“声明说明符DeclarationSpecifiers”和“声明符Declarator”相关的代码。函数ParseCommonHeader()分析了“声明说明符”和“声明符”,


图3.3.10 ParseCommonHeader()

    图3.3.10第1179行创建了一个kind域为NK_Declaration的语法树结点,第1181行通过函数ParseDeclarationSpecifiers()为“声明说明符”创建了语法子树,而接下来遇到的是分号,则说明当前声明中不存在“可带初始化的声明符InitDeclarator”。例如,在以下只包含“声明说明符”和分号的代码中,结构体struct Data的定义,在语法上就对应我们在上一小节介绍过的“结构体或联合体说明符StructOrUnionSpecifier”,其语法地位就相当于基本类型int。

struct Data{

         int a;

         int b:20;

};

    如果“声明说明符”之后存在“声明符”,则通过第1188行和第1193行的函数调用ParseInitDeclarator()创建了与“可初始化的声明符”相应的语法子树,第1192行用于跳过相邻声明符之间的逗号分隔符,其余的代码用于把若干个InitDeclarator对应的语法子树链接到一起。图3.3.11给出了由函数ParseCommonHeader()构造的一棵语法树。


图3.3.11 ParseCommonHeader()构造的语法树

    在图3.3.11中,我们有意选取与图3.3.4一样的代码,在图3.3.11中,我们只给出了在函数ParseCommonHeader()中,我们所能看到的语法树轮廓,而语法树结点astSpecifiers和astInitDeclarator的相关细节,我们会在函数ParseDeclarationSpecifiers()和函数ParseInitDeclarator()中进行讨论。接下来,让我们先讨论函数ParseDeclarationSpecifiers(),图3.3.12给出了与“声明说明符DeclarationSpecifiers”相关的产生式。第989至994行告诉我们,auto、register、static、extern和typedef被称为存储类说明符;而由第996至998行可知,const和volatile即为类型限定符;而第1000至1012告诉我们,“int等基本类型”、“结构体或联合体说明符”、枚举说明符和类型定义名TypedefName都是“类型说明符TypeSpecifier”。第984和第987行则告诉我们“声明说明符”是由若干个存储类说明符StorageClassSpecifier、类型限定符TypeQualifier或者类型说明符TypeSpecifier所构成。


图3.3.12 声明说明符的产生式

    函数ParseDeclarationSpecifiers()的主要代码如图3.3.13所示,第6行创建了一个kind域为NK_Specifiers的语法树结点,第7行的specs-> stgClasses用于作为单向链表的链首,记录若干个“存储类说明符”结点构成的单链表;第8行的specs->tyQuals用于volatile或者const构成的单链表;第9行的specs->tySpecs所指向的单链表则记录了所有的类型说明符。

C编译器剖析_3.3 语法分析_C语言的外部声明(1) 3.3  C语言的外部声明_ExternalDeclaration     在分析完表达式和语句之后,《K&R》附录中关于标准C的6页文法,我们就已经差不多已经理解了一半,另外的3页文法基本上都是关于声明Declaration的,与声明相关的代码在ucl\decl.c中。不少编程语言的书籍中,对声明与定义是有严格区分的,在编译器遇到定义时,需要为之分配内存;而遇到声明时,则不必为之分配内存,因为 阅读详情

相关推荐

C编译器剖析_3.3 语法分析_C语言的外部声明(2)

在上一小节中,我们讨论了C标准文法的“外部声明ExternalDeclaration”,介绍了“声明Declaration”和“函数定义FunctionDefintion”这两类外部声明,分别举了以下代码作为例子,在图3.3.4和图3.3.7中给出了这两者对应的语法树。 static  const  int  a1= 3, * a2, a3[5],a4(void);//声明Declarati

SheIsC的专栏 1720

C语言函数声明与定义:编译器视角的契约本质

函数声明是C语言分离编译模型中的核心契约机制,它在编译阶段提前约定函数接口(参数类型、数量、返回值),使编译器能静态校验调用合法性,避免运行时类型错配;函数定义则提供具体实现,二者共同支撑多文件项目的模块化构建。这种声明/定义分离的设计,直接决定了头文件(.h)与源文件(.c)的职责边界,并成为链接器解析符号依赖、解决undefined reference错误的前提。理解该机制,是掌握C语言工程化开发、VSCode多文件编译配置及Makefile构建演进的基础。

weixin_33738982的博客 1615

C编译器剖析_4.4 语义检查_外部声明_结构体和数组的初始化

本节讨论标量类型、数组、结构体和联合体的初始化。 在C语言中,全局或静态变量的初始化应为常量;而局部变量没有此要求。

SheIsC的专栏 1633

编程基础-外部声明在变量声明中的使用与原由

现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程,里面含有A.cpp和B.cpp两个简单的C++源文件:   //A.cpp   int i;

木头人在奋斗 612

C编译器剖析PDF文档_UCC162.3源代码

包含C编译器剖析PDF文档,及修改少量BUG后的编译器源代码UCC162.3, 欢迎访问对应博客http://blog.csdn.net/sheisc

LPC546xx USB接口VBUS阈值设计:从原理到实践,解决冷启动与可靠性问题

在嵌入式USB接口设计中,VBUS信号不仅是电源线,更是设备连接检测与电源管理的核心。其电压阈值直接决定了USB物理层(PHY)能否正确识别主机并建立有效会话。理解VBUS的会话有效电压(Votg_sess_valid)与PHY有效电压(VBUS_valid)等关键参数,是确保接口稳定性的基础。这些参数影响着设备枚举的成功率、通信稳定性以及长期可靠性。在工程实践中,尤其是对于集成PHY的微控制器如NPC LPC546xx系列,VBUS的连接方案(直接连接或通过稳压器)需要根据设备供电模式(自供电/总线供电)

weixin_30915275的博客 400

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5567

gnuradio+b210实现FM收音机

gnuradio+b210实现FM收音机环境介绍FM接收1 Flow Graph2 变量参数FM发射1 Flow Graph 环境介绍 Name Version gnuradio 3.7.14.0 uhd 3.15.0.0 ubuntu 18.04 usrp b210 参考 https://www.ijedr.org/papers/IJEDR1702038.pdf Audio File Transmission using GNURADIO and USRP FM接

u011745228的博客 5126

工业音频故障检测:从CNN到Transformer的技术演进

音频信号处理是工业设备预测性维护的核心技术之一,通过分析设备运行时产生的声波特征实现故障预警。传统方法依赖梅尔频率倒谱系数(MFCC)等手工特征,而深度学习技术尤其是Transformer架构,通过自注意力机制突破了CNN在跨频段特征提取上的局限。Audio Spectrogram Transformer(AST)等先进模型在工业场景中展现出91.2%的高召回率,显著优于传统方案。这种非接触式监测技术结合边缘计算优化,已成功应用于石油化工、电力能源等领域,实现提前72小时预测轴承故障,单项目可避免数百万元的

weixin_30467861的博客 326

从USB 2.0到USB 3.x:Synopsys SVT USB VIP配置避坑与接口选择指南

本文详细解析了从USB 2.0到USB 3.x的Synopsys SVT USB VIP配置要点,涵盖协议版本选择、物理接口匹配及UVM层次化架构实现。重点介绍了layering sequence的配置技巧和常见问题解决方案,帮助验证工程师高效避坑并优化验证流程。

weixin_42653691的博客 238

STM32开发 -- GPIO详解

之前有简单讲过GPIO工作模式和寄存器,还是有点没搞明白。这次需要全方位的看一下了。 一、数据手册 1、STM32F105RC引脚说明 可知:STM32F105RC 一共有4组IO口 一共16X3+3=51个IO GPIOA0~A15 GPIOB0~B15 GPIOC0~C15 GPIOD0~D2 2、程序定义 GPIO端口号 STM32F1...

不积跬步,无以至千里 5万+

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

基于 STM32 的智能水表流量计设计与实现 —— 数据采集与远程传输

本文设计的基于 STM32 的智能水表流量计通过霍尔传感器实现流量采集,结合 STM32 的处理能力完成数据计算、存储与远程传输,具备计量精准、功耗低、可远程监控等特点。未来可优化方向:引入低功耗模式延长电池寿命,增加水质检测模块实现多参数监测,提升水务管理智能化水平。

weixin_42300449的博客 1027

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: C编译器剖析_3.3 语法分析_C语言的外部声明(2)
下一篇: C编译器剖析_4.1 语义检查_语义检查简介
SheIsC
博客等级 码龄12年 224粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值