[省选联考 2022] 预处理器 题解

来自bzoj(传统题)

目录

题面:

思路:

输入:

宏的实现:

定义宏:

删除宏:

展开的实现:

直接展开:

连续展开:

递归展开:

综合:

代码:



题面:


宏是 C/C++ 语言的一项特性,它根据预先定义的规则进行文本替换(也被称为 “宏展开”),能够实现定义常量、简化代码重复输入等功能。例如:

#define PI 3.14159
double area = PI * r * r;
以上代码经过宏展开后变为:

double area = 3.14159 * r * r;

其中,宏定义命令变成了空行,而其他行中的宏被展开成了规则定义的文本。

C/C++ 语言代码在编译时对宏的处理由预处理器完成。你的任务是实现一个简化版的预处理器,要求如下:

  • 代码由组成,每行除行末的换行符外,均由可打印 ASCII 字符(ASCII 码范围 32∼126)组成。每行要么是预处理命令(以 # 开头),要么是普通文本(其他情况)。

  • 预处理器逐行处理代码,

    • 如果是预处理命令,执行该命令,并输出一个空行。
    • 如果是普通文本,对其进行宏展开并输出结果。
  • 预处理命令有两种,分别是宏定义命令 #define 和取消宏定义命令 #undef

    • 宏定义命令的格式为 #define <name> <content>,其中第一部分 #define 是命令名,第二部分 <name> 是要定义的宏的名字,第三部分 <content> 是要定义的宏的展开内容。
    • 取消宏定义命令的格式为 #undef <name>,其中第一部分 #undef 是命令名,第二部分 <name> 是要取消的宏的名字。

    以上两种预处理命令中,相邻两部分之间都严格用一个空格分隔。<name> 是由大小写字母和数字以及下划线组成的标识符(一个或多个字符),<content> 可以包含任意可打印 ASCII 字符(零个或多个字符)。一个宏定义的有效范围是从它定义所在行开始到后续最近的宏名匹配的取消定义所在行为止(如果没有对应的取消定义,则有效范围一直覆盖到文件结束)。

对普通文本进行宏展开时,将一行文本中每段连续极长的大小写字母和数字以及下划线视为标识符(而不是其中一部分),其余为其他字符。从左到右依次对文本中的标识符进行宏展开:

  1. 如果该标识符是有效的宏名,则用对应的展开内容替换它,此时该宏名进入正在展开的状态,直到本流程结束;否则原样保留宏名。例如,若宏 A 定义为 b,则文本 A 展开结果为 b(发生替换),文本 B 展开结果仍然为 B(未定义,不替换),文本 AA 展开结果仍然为 AAAA 是不同于 A 的另一个标识符,未定义),而文本 A*B 展开结果为 b*B
  2. 替换发生后,如果展开内容中包含标识符,重复应用以上的展开操作,称为 “多次展开”。例如,若宏 A 定义为 B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值