C编译器剖析_3.2 语法分析_C语言的语句

C编译器剖析_3.1 语法分析_C语言的表达式(1) 3.1  C语言的表达式     从第3章开始,我们进入UCC编译器的语法分析阶段。相关的代码主要在ucl\decl.c、ucl\expr.c和ucl\stmt.c,分别对应声明Declaration、表达式Expression和语句Statement。在第一章时,我们已经通过一个简单的例子ucc\examples\sc对这些概念有了一个直观的体会,在这一章中,我们需要结合IT大佬们制定的C标准 阅读详情

3.2  C语言的语句_Statement

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


图3.2.1 ParseStatement()

     图3.2.1第335至349给出了语句Statement的产生式,其中列出了从第336行的表达式语句ExpressionStatement,第337行的带标号的语句,一直到第349行复合语句CompoundStatement。在3.1节中,我们介绍了表达式Expression的概念,在C语言中,在表达式的后面跟一个分号,就可以构成一个表达式语句。我们是通过递归来定义非终结符句Statement的,而表达式语句由”Expression;”构成,其中不包含非终结符Statement,这就相当于表达式语句可以充当递归定义Statement的递归出口。类似的,break语句”break;”,continue语句”continue;”,goto语句”goto ID;”,return语句的定义中都没有非终结符Statement,所以这些语句都可以作为递归定义Statement的递归出口。没有递归出口的递归,就如“从前有座山,山上有个庙,庙里有个老和尚,老和尚给小和尚讲故事说,从前有座山,山上有个庙,……”。在第353行,根据当前读头下的token来决定要按哪个语句去分析。第372至379行分别进行case语句、default语句和if语句的分析。但在当前记号CurrentToken是标志符TK_ID的情况下,我们又会遇到老问题,即同一个非终结符的不同侯选式的前缀可能是一样的,我们需要再往前多读若干个token才能把它们区别开,例如第360行给出的标号语句和第366行的表达式语句,都是以标志符TK_ID开头。在第370行,我们暂且调用ParseLabelStatement(),但是在该函数内部我们会尝试再多读一个token,看看会不会遇到冒号,如果是冒号,则说明我们遇到的是标号语句;否则我们可能多读了一个token,需要让词法分析器作回溯,对应的代码如图3.2.2第38至56行所示。


图3.2.2 ParseLabelStatement()

     图3.2.2第4

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

相关推荐

c4编译器源码剖析

c4_source 1. 概述 c4是500行代码实现一个c语言编译器 简单暴力,适合了解基础的编译器原理 2. 主流程 1.建立系统符号表 2.读取源代码 3.一次遍历源代码,同时进行词法分析,语法分析和中间代码生成。 4.执行中间代码 3. 中间代码 3.1. 基础 中间代码 操作 意义 LEA 2 将栈往上的2个位置变量加载到寄存器 加载本地变量 IM

fishmei的博客 6058

C编译器剖析_5.3.2 中间代码生成及优化_switch语句的翻译

5.3.2.Switch语句的翻译    在这一小节中,我们来讨论一下switch语句的翻译,switch语句的产生式如下所示。 SwitchStatement:                    switch( expr ) statement    当C程序员编写出如下代码时,UCC编译器会在语义检查阶段进行报错“error:The  break shall  appear  in

SheIsC的专栏 2262

【C语言进阶教程】编译器优化

本节将帮助您了解本教程的目的、结构,以及在开始学习之前您需要具备的基础知识和准备工作。编译器优化是指通过编译器对代码进行分析和转换,以提高程序效率和性能的过程。优化目标通常是减少执行时间、降低内存使用、提高代码稳定性和可读性等。为了在不改变程序正确行为的情况下做到这一点,编译器使用各种技巧和策略。优化的基本概念编译器优化是自动化的优化过程,旨在提高代码的质量和效率。通过简化代码、减少冗余、改善内存使用等方式来提高程序性能。优化可能涉及多个方面:包括执行速度、内存占用、功耗等。为什么需要优化。

2072

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编译器剖析_3.3 语法分析_C语言的外部声明(3)

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

SheIsC的专栏 2017

C编译器剖析_1.3 由文法到分析器_语句Statement

理解了变量和函数的声明,及如何处理四则运算表达式后,接下来我们想在表达式的基础上去实现控制流语句,即常见的if语句和while语句。与语句statement相关的产生式如下所示:          Statement --> IfStatement | WhileStatement|CompoundStatement|ExpressionStatement          IfStateme

SheIsC的专栏 2379

【C语言】初识C语言(上篇)

初识C语言第一部分

StackFrame 4005

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

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

weixin_42451850的博客 1499

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

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

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

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

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

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

Unity工业数据可视化:基于ModbusTCP的实时数据通信实战

本文详细介绍了在Unity中实现工业数据可视化的核心方法,重点讲解了基于ModbusTCP协议与PLC等工业设备进行实时数据通信的实战流程。内容涵盖NModbus库的集成、Modbus Slave模拟器的使用、TCP连接的建立与多线程安全通信、数据读写与解析,以及如何将实时数据驱动3D场景,为构建工业数字孪生与监控系统提供完整解决方案。

ol7890123的博客 553

DPABI安装教程

DPABI是是中科院心理研究所严超赣老师团队开发的一款磁共振脑影像数据分析工具包。基于SPM,在安装DPABI之前需要安装好SPM,才能正常使用。SPM的安装方法见文matlab2021a版本条件下安装spm_kidllll的博客-优快云博客 1、下载安装包 下载地址:DPABI: a toolbox for Data Processing & Analysis for Brain Imaging | The R-fMRI Network 2、将下载好的dpabi文件夹移动到matl..

qq_42356925的博客 1万+

从零搭建A股量化交易系统:开源框架选型与实战部署指南

本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。

sugar的博客 1271

在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统

电动汽车(EV, Electric Vehicle)的动力学建模与控制仿真在车辆开发过程中起着至关重要的作用。通过Simulink进行整车动力学模型的构建和控制策略的验证,可以有效评估车辆性能、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车整车动力学模型与控制仿真。该系统能够模拟复杂的整车动力学行为,验证控制策略的有效性,并通过优化设计提高车辆的性能和可靠性。

xiaoheshang_123的博客 549

使用FSL对DTI数据进行预处理

在fsl官网我们可以看到是同时使用了AP和PA图像处理,采用的是最小二乘法将2个图像合并为1个图像。–inindex此处需要处理的是PA图像,在acq_param.txt中我们是把这个放在第一行的,此处为1,如果处理的是AP图像,则此处为2。为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。即如果AP和PA只有1个B0像时,那么这里就是两行,如果各有3个B0像则这里应该是6行。假设转换后的图像为sub01_AP.nii.gz和sub01_PA.nii.gz。

weixin_52073820的博客 4839

YOLOv8【第七章:损失函数篇·第1节】一文搞定,IoU系列损失函数!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1196

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 142

SAP_MM_配额安排_PA认证总结

配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。

java_zhong1990的专栏 1021

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

jre9下载 jdk9

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值