【问题标题】:In which step of compilation are comments removed?在编译的哪个步骤中删除了注释?
【发布时间】:2016-03-10 19:14:10
【问题描述】:

There are several steps in compilation of a program:

  • 线重建
  • 词法分析
  • 预处理。
  • 语法分析
  • 语义分析

第一步“线重构”中去除cmets吗?

【问题讨论】:

  • 你为什么会这样想?

标签: compiler-construction compilation


【解决方案1】:
  • 预处理是它自己的一个阶段,它有自己的扫描和解析,先于词法分析。
  • 我是一名编译器编写者,我从未听说过“行重构”。编译器不处理行:它们处理令牌流。您的引文特别指出这是一些奇怪语言的特例。
  • 您忽略了流分析、优化、寄存器分配和代码生成等等。
  • 在词法分析(有时在概念上将其描述为“筛选”和“扫描”时,注释被忽略,而不是删除,在这种情况下,您可以说 cmets 被筛选掉了,就像空白一样。

【讨论】:

    【解决方案2】:

    我将在回答时牢记 C 编译器。大多数编译器通常会出现以下情况,但我要给出的示例适用于 C 编译器。

    在行重构阶段之后移除 cmets,并且通常在词法分析阶段被忽略。可以通过这种方式进行快速验证。考虑以下代码:

    printf("Hello "); // *************\
    printf("World");  // I like boxes!\
    printf("!\n);     // ^^^^^^^^^^^^^\
    

    当 C 编译器发现一个反斜杠紧跟一个换行符时,行重构阶段会将其变为单行。

    你可以弄清楚上面的代码会导致什么!

    设计选择是因为它与我们期望的行为一致,反斜杠后跟换行符必须始终连接。

    但是,词法分析阶段涉及标记化。在标记代码以进行进一步处理时,此阶段可以方便地忽略 cmets。所以到下一个阶段被调用时,cmets 已经丢失了!

    希望这可以澄清! :)

    P.S.:来源!

    That line-reconstruction takes place before comments are even analyzed

    【讨论】:

    • 谢谢。在示例代码中,第二个和第三个 printf 调用是否被注释了?
    猜你喜欢
    • 2017-07-19
    • 2014-01-21
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2012-06-20
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多