SP1869 MKMOOM - Making Mountains Out Of Molehills
题目描述
宏处理器是一种处理符号的程序,它接受字符流作为输入,并输出字符流。宏类似于普通函数,因为它也有定义,当调用时,会把定义应用到参数上,以此生成结果。在这个任务中,你需要开发一个简单的宏处理器。
“宏调用”由宏的名称以及用逗号分隔的参数列表组成。名称前是 '\['(左括号),最后一个参数后是 '\]'(右括号)。例如,“\[doit,to,it\]”代表调用名为“doit”的宏,并传入两个参数“to”和“it”;“\[random\]”则调用名为“random”的宏,没有参数。
宏调用之前,需要先定义宏,即将宏名称与字符串关联。定义字符串中可以使用特殊标记“$1”到“$9”表示第一个到第九个参数,“$0”用来代表宏自己的名称。在调用宏时,这些标记会被实际参数值替换。例如,若“321”宏的定义为“$3-$2-$1”,那么调用“\[321,This,is,fun\]”会输出“fun-is-This”。宏调用可以嵌套出现,例如“\[321,\[321,A,B,C\],D,E\]”会输出“E-D-C-B-A”。
用 '' 包围的部分不会被解释,可以在里面使用'\[', '\]', ',' 和 '$'等特殊字符,而不影响正常宏功能。因此,调用“\[321,,,\]”会产生“,-\[-$”。
宏定义是通过特殊的宏“def”实现的,它接受两个参数,分别为待定义宏的名称和其定义的符号字符串。以“321”宏为例,它的定义为“\[def,321,\]”。使用 '' 是为了防止“$1”、“$2”和“$3”被当作“def”的参数。def 宏本身不产生输出,系统预先实现了其功能。
**处理过程**
输入的字符流会逐个进行处理,并复制到输出中,直到遇到宏调用或者输入结束。在处理宏调用时,按下述步骤进行:
1. 从左至右评估宏名称及其参数,这可能会递归评估其他宏调用。
2. 当参数列表完整(即遇到闭合的 '\]')时,按照输入流的方式扫描宏定义,同时将“$0”、“$1”等替换为对应的实际参数。
3. 宏调用完成后,丢弃名称和参数,恢复到宏调用中断处继续处理。
**限制和注意事项**
- 宏名称和参数最长32个字符。
- 宏定义字符串最长100个字符。
- 每个宏名称只会定义一次,宏调用总是提供正确数量的参数。
- 字符大小写敏感。所有输入字符,包括行末字符,均要通过宏处理器处理。
- 输出行不超过80个字符,包括行末字符。已知输入数据合法。
输入格式
输入包含多个测试用例,每个用例的开头是一行整数,表示后续文本行数(范围1到10),这些行作为宏处理器的输入。每行最长80个字符,所以总输入字符不超过810。最后一个测试用例后是一行包含整数0。
输出格式
对每个输入用例,输出用例编号(从1开始),一行79个连字符,宏处理器的输出内容,另一行79个连字符,最后是空行。输出中不显示 \*\*BLANK\*\*,而是真正的空行。
**本翻译由 AI 自动生成**