P16474 [GKS 2013 #B] Ignore all my comments
题目描述
优秀的程序员会写出绝妙的注释。Igor 是一名程序员,他喜欢旧式的 C 风格 `/* ... */` 注释块。对他来说,如果能把这种风格用作所有编程语言甚至文档(例如 Python、Haskell 或 HTML/XML 文档)的统一注释格式,那就太理想了。
在 Igor 看来,做到这一点并不太难。他需要的是一个注释预处理器,用来移除所有 `/*` 后跟注释文本再跟 `*/` 的注释块。处理后的文本便可以交给相应的编译器或文档渲染器——无论它是什么。
不过,Igor 的预处理器并不那么简单。它有以下一些很酷的功能:
- 预处理器所读取的注释可以像大多数编程语言中的括号那样进行嵌套。注释内部可以包含注释。例如,下面的代码块有一个外层的注释,应当被注释预处理器移除。该块包含两个内部注释。
```c
printf("Hello /* a comment /* a comment inside comment */
inside /* another comment inside comment */
string */ world");
```
经过预处理步骤后,它变为:
```c
printf("Hello world");
```
- Igor 知道注释可以出现在文本的任何地方,包括字符串内部 `"/*...*/"`、常量数字 `12/ * . . . * /34`,甚至字符转义 `\/* . . .* \n` 中。
或者更形式化地说:
```
text:
text-piece
text-piece remaining-text
text-piece:
char-sequence-without-`/*`
empty-string
remaining-text:
comment-block text
comment-block:
`/*` comment-content `*/`
comment-content:
comment-piece
comment-piece remaining-comment
comment-piece:
char-sequence-without-`/*`-or-`*/`
empty-string
remaining-comment:
comment-block comment-content
char:
letters
digits
punctuations
whitespaces
```
我们的预处理器在给定一段文本时,会按照规范移除所有 comment-block 实例。
**注意**
- Igor 只需要在一趟扫描中移除注释。他并不会移除因注释块被移除而产生的额外注释块。例如:
`//*no recursion*/* file header */`
应该生成:
`/* file header */`
- 任何 `/*` 或 `*/` 中的 `*` 字符不能复用于另一个 `/*` 或 `*/` 中。例如以下情况**不**构成一个正确的注释块
`/*/`
输入格式
一个含有 `/*` 和 `*/` 注释块的文本文档。输入文件是合法的,它遵循题目描述中 text 的规范。输入文件总是以一个换行符结束。
输出格式
本题只有一组测试用例。首先需要输出下面这一行。
Case #1:
然后,按照题目描述中指定的方式,打印移除所有注释后的文档。不要移除注释外部的任何空格或空行。
说明/提示
### 限制
输入程序仅包含:
- 字母:a-z,A-Z,
- 数字:$0\text{-}9$
- 标点:`~ ! @ # % ^ & * ( ) - + = : ; " ' < > , . ? | / \ { } [ ]`
- 空白字符:空格,换行
**测试集 1 - 可见**
小输入包含一个小于 $2\text{k}$ 字节的程序。
**测试集 2 - 隐藏**
大输入包含一个小于 $100\text{k}$ 字节的程序。
翻译由 DeepSeek V4 Pro 完成