C编译器剖析_3.1 语法分析_C语言的表达式(1)

C编译器剖析_3.2 语法分析_C语言的语句 3.2  C语言的语句_Statement     在这一节中,我们对C语言的各种语句进行分析,相关代码在ucl\stmt.c中。结构体struct astNode是语法树所有结点的父类,而if语句等需要在语法树结点上记录更多的信息,所以在ucl\stmt.h中定义了相关的结构体,我们会在讨论具体的语句时,在语法树示意图上画出相应的结构体。图3.2.1给出了语句的分析函数ParseStateme 阅读详情

3.1  C语言的表达式

    从第3章开始,我们进入UCC编译器的语法分析阶段。相关的代码主要在ucl\decl.c、ucl\expr.c和ucl\stmt.c,分别对应声明Declaration、表达式Expression和语句Statement。在第一章时,我们已经通过一个简单的例子ucc\examples\sc对这些概念有了一个直观的体会,在这一章中,我们需要结合IT大佬们制定的C标准文法来进行语法分析。基本的分析方法和第1章的例子类似,只是所涉及到的文法更加复杂,所构建的语法树也更加庞大。《K&R》的附录”A.13Grammar”一节给出了完整的C89标准文法,可把这一节不到6页的C文法打印出来,对照着UCC的源代码来看。在本章中,我们要完成的任务很明确,就是把C源代码转换成更加适合编译器处理的语法树。我们需要先熟悉一下语法树上最基本的结点,如图3.1.1所示。


图3.1.1   struct astNode

    图中第34行的结构体struct astNode就是语法树中一个最基本的结点,第30行的kind用于记录结点的类别,其取值范围由第6至第23行的枚举常量来确定,第8至14行的NK_Function等枚举常量主要用于标识语法树中与“声明Declaration”相关的结点,而第16行的NK_Expression就用于标识“表达式Expression”结点,第18至22行的NK_IfStatement等主要用于与“语句Statement”相关的结点。第31行的next域用于构成链表。第32行的coord主要用于记录与语法树结点对应的C源代码的位置。结构体struct astNode相当于是所有语法树结点的父类,如果要描述表达式对应的结点,我们需要引入能记录更多信息的结构体struct  astExpression,如图3.1.2所示。


图3.1.2   struct astExpression

      图3.1.2第44行的ty用于记录表达式对应的类型,我们在2.4节中初步介绍过C语言的类型系统。第45行的op是operator的缩写,用于记录表达式的运算符,而第52行的kids则用于记录表达式的运算数。第46行的isarray用于标记当前结点是否为数组,本来第44行的ty域就已记录了结点的类型信息,但是因为数组名在C语言中会被当作“指向数组第0个元素的指针”,此时在ty域中记录的类型已转变为指针类型,所以需要isarray来标记这个结点原本是个数组。第48行的lvalue则是left value的缩写,代表对应的表达式是否为左值。而第49行的bitfld用来标记当前结点是否为结构体对象的位域成员,对位域成员的访问比较特殊,需要进行移位操作。有了这个基础后,我们就可以来看一下ucl\expr.c中对表达式Expression的语法分析了,如图3.1.3所示。


图3.1.3 ParseExpression()

     图3.1.3第514至516行注释中的产生式告诉我们,C语言的表达式Expression由若干个被逗号隔开的赋值表达式AssignmentExpression构成。我们以下面”a,b,c”这个简单的表达式来说明一下由函数ParseExpression()所构成的语法树,如图3.1.4所示。


图3.1.4   表达式“a,b,c”对应的语法树

      图3.1.4中op类别为OP_COMMA的结点是通过图3.1.3的第525至530行构建的,第525行的宏CREATE_AST_NODE()创建了一个kind为NK_Expression的结点,接下来的代码用于对该结点进行赋值。子表达式”a”对应的语法树结点会在第522行被构建,而子表达式”b”和子表达式”c”则会通过第530行的ParseAssignmentExpression()函数来构建,如图3.1.5所示。

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编译器剖析_4.2 语义检查_表达式的语义检查(3)_字符串与标识符

4.2.3             在这一小节,我们先来分析一下基本表达式PrimaryExpression的语义检查,由C的标准文法,我们可以知道与PrimaryExpression相关的产生式如下所示,即加了一对小括号的表达式(Expression)在语法上也相当于标志符ID、常量CONST和字符串StringLiteral。 primary-expression:

SheIsC的专栏 2033

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

4.1  语义检查简介     在这一章中,我们需要在语法分析阶段建立的语法树的基础上,进行语义检查。UCC编译器中与此相关的代码主要在ucl\declchk.c,ucl\stmtchk.c和ucl\exprchk.c,分别用于对声明Declaration、语句Statement和表达式Expression进行语义检查SemanticsCheck。其中,最重要的工作就是建立C语言的类型系统,我们

SheIsC的专栏 2350

深入浅出C语言编译器源码剖析

本文还有配套的精品资源,点击获取 简介:编译器是将高级编程语言转换为机器语言的关键工具,本资源提供的“简单编译器”源码用C语言编写,涵盖编译器设计的各个主要阶段,如词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。通过学习和调试这些源码,开发者能够深入理解编译原理和编程语言的内部工作,提升C语言编程技能,掌握复杂数据结构和算法的应用。建议学习者先了解编译原...

weixin_42451850的博客 1499

C语言编译器源码项目:编译原理学习与实践

词法分析是编译器的第一阶段,主要任务是将源代码的字符序列转换为一系列的词法单元(也称为记号或tokens)。词法单元是具有特定意义的最小单元,它代表了编程语言的原子符号,例如关键字、标识符、字面量、运算符和分隔符。词法单元可以分为以下几类:关键字(Keywords):如ifelsewhilefor等,这些是编程语言的保留字,具有特定的语法意义。标识符(Identifiers):用于变量名、函数名等,由字母、数字和下划线组成,但第一个字符不能是数字。

weixin_31961675的博客 1043

C语言一个子集编译器词法语法分析中间及目标代码

这是一个关于C语言的一个子集的编译器,其中包括了一个编译器所包含的全部,有词法分析,语法分析,及token表的生成与显示,中间代码(三元式)及目标代码(汇编指令)的生成与显示。采用C++,MFC编译实现的可视化界面,易于操作~~

C编译器剖析

c编译器

C 编译器剖析

C 编译器剖析,讲述编译器的构造及实现,内容经典、详实。

c语言表达式的语法分析器

java平台对输入的表达式进行了简单的词法分析(注意:输入只能在txt中输入!!!),用算符优先分析方法分析表达式是否合法,程序能给出语法的分析过程和表达式的结果。由于C语言的运算符较多,导致算符运算关系表比较大,所以每种表达式选择了一种符号作为代表。压缩包中给了多个用例。

编译原理 类C语言编译器 词法分析 语法分析LR1 语义分析

用C++编写的类C语言编译器,代码清晰。完成词法分析、语法分析LR1、语义分析。其中LR语法分析自动生成action-goto表。语义分析生成三地址码。可做编译原理课程设计大作业等等。

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程

本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。

2301_80014343的博客 1434

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

Rust嵌入式开发环境搭建指南(基于Stm32+Vscode)

本文档旨在指导开发者如何搭建基于Rust语言的STM32嵌入式开发环境。相比传统的C/C++开发方式,Rust提供了更强的内存安全保障和现代化的语言特性,非常适合嵌入式系统开发。本指南将详细介绍从环境搭建到项目配置的全过程,特别关注VSCode作为IDE的配置以及STLink和DAPLink调试器的使用。

u014627020的博客 2601

告别音质玄学:实测ACM8625S搭配杰理AC695x,如何通过寄存器精准调出好声音

第一次听到ACM8625S驱动音箱发出的声音时,我有些失望——这个被厂商宣传为"高保真数字功放"的芯片,默认配置下的表现甚至不如一些廉价模拟功放。经过两周的反复调试,最终配置使这款售价不到200元的音箱达到了接近专业监听设备的音质水平。特别是在鼓点和电吉他表现上,既保持了足够的冲击力,又不会掩盖人声细节。例如,当频率响应曲线在10kHz有+2dB提升时,多数评测者认为听感最佳,尽管这会使THD略微增加0.05%。虽然厂商提供的配置工具能快速生成基础代码,但想要获得最佳音效还需要手动优化。

weixin_29655587的博客 354

直击痛点:VS2015离线安装报错“安装包丢失或损坏”的根源分析与精准修复

本文深入剖析了Visual Studio 2015离线安装时出现“安装包丢失或损坏”报错的根本原因,指出问题核心在于安装程序固化的临时路径查找逻辑。文章提供了一步到位的精准修复方案,通过将ISO镜像中的完整packages文件夹复制到安装程序指定的临时路径,即可无需联网、无需操作证书直接解决问题,并对比分析了其他常见方法的局限性。

weixin_27734811的博客 357

华为OD机试真题-查找单入口空闲区域(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【查找单入口空闲区域】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 查找单入口空闲区域。

qq_45776114的博客 1268

AUTOSAR进阶图解==>AUTOSAR_SWS_DefaultErrorTracer

AUTOSAR Default Error Tracer (DET)是AUTOSAR架构中的核心错误追踪模块,提供统一的错误报告机制。DET能够处理开发错误、运行时错误和瞬态故障三类问题,支持模块级和实例级的配置管理。模块架构上,DET通过Det_API接口与其他模块交互,可配置转发错误至诊断事件管理器(DEM)或调试日志追踪(DLT)。其配置结构包含全局参数和模块实例参数,允许灵活控制错误报告行为。DET在AUTOSAR 4.3.0版本中从DevelopmentErrorTracer扩展而来,增强了错误处

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 909

《30天入门 SAP BTP 开发》教程的目录和使用说明,建议收藏

本教程分为两部分:第一部分为SAP BTP入门系列,包含从基础概念到操作步骤的系统性学习内容,建议零基础用户按顺序学习;第二部分为专题文章集合,涵盖SAP BTP的多个技术点,适合已有基础的用户按需查阅。教程包含账号申请、Global Account操作、Java应用开发、AI工具使用等丰富内容,同时解答常见问题并提供实战案例。所有文章均附带详细链接,便于读者系统学习或针对性查阅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4383

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: C编译器剖析_2.5 UCC编译器的符号表管理
下一篇: C编译器剖析_3.1 语法分析_C语言的表达式(2)
SheIsC
博客等级 码龄12年 224粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值