#P16474. [GKS 2013 #B] Ignore all my comments

[GKS 2013 #B] Ignore all my comments

题目描述

优秀的程序员会写出绝妙的注释。Igor 是一名程序员,他喜欢旧式的 C 风格 /* ... */ 注释块。对他来说,如果能把这种风格用作所有编程语言甚至文档(例如 Python、Haskell 或 HTML/XML 文档)的统一注释格式,那就太理想了。

在 Igor 看来,做到这一点并不太难。他需要的是一个注释预处理器,用来移除所有 /* 后跟注释文本再跟 */ 的注释块。处理后的文本便可以交给相应的编译器或文档渲染器——无论它是什么。

不过,Igor 的预处理器并不那么简单。它有以下一些很酷的功能:

  • 预处理器所读取的注释可以像大多数编程语言中的括号那样进行嵌套。注释内部可以包含注释。例如,下面的代码块有一个外层的注释,应当被注释预处理器移除。该块包含两个内部注释。
    printf("Hello /* a comment /* a comment inside comment */
              inside /* another comment inside comment */
              string */ world");
    

经过预处理步骤后,它变为:

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:

然后,按照题目描述中指定的方式,打印移除所有注释后的文档。不要移除注释外部的任何空格或空行。

//*no recursion*/* file header
***********/************
* Sample input program *
**********/*************
*/
int spawn_workers(int worker_count) {
  /* The block below is supposed to spawn 100 workers.
     But it creates many more.
     Commented until I figure out why.
  for (int i = 0; i < worker_count; ++i) {
    if(!fork()) {
      /* This is the worker. Start working. */
      do_work();
    }
  }
  */
  return 0; /* successfully spawned 100 workers */
}

int main() {
  printf("Hello /*a comment inside string*/ world");
  int worker_count = 0/*octal number*/144;
  if (spawn_workers(worker_count) != 0) {
    exit(-1);
  }
  return 0;
}
Case #1:
/* file header
************************
*/
int spawn_workers(int worker_count) {
  
  return 0; 
}

int main() {
  printf("Hello  world");
  int worker_count = 0144;
  if (spawn_workers(worker_count) != 0) {
    exit(-1);
  }
  return 0;
}

提示

限制

输入程序仅包含:

  • 字母:a-z,A-Z,
  • 数字:0-90\text{-}9
  • 标点:~ ! @ # % ^ & * ( ) - + = : ; " ' < > , . ? | / \ { } [ ]
  • 空白字符:空格,换行

测试集 1 - 可见

小输入包含一个小于 2k2\text{k} 字节的程序。

测试集 2 - 隐藏

大输入包含一个小于 100k100\text{k} 字节的程序。

翻译由 DeepSeek V4 Pro 完成