【问题标题】:Why cannot the comments be used within the tokens?为什么不能在代币中使用评论?
【发布时间】:2015-02-28 21:27:38
【问题描述】:

如果我有代码,比如

 int main()
    {
        i/* this is me*/nt a=9;
        printf("%d",a);
        getch();
        return 0;
    }

在这里,如果我尝试在标记 int 中使用注释,那么它会产生什么问题,因为它会显示错误。当在词法阶段,词法分析器只是将字符流转换为标记时,编译器会出现什么问题,它删除了所有的 cmets,那么这里有什么问题?

【问题讨论】:

  • 我认为从根本上定义语言以使您的构造成为可能是不可能的。但是,我很高兴它不是这样设计的。这会导致非常混乱的错误,到目前为止我从未错过过这个“功能”。为什么还要在标识符中添加注释?

标签: c compiler-construction


【解决方案1】:

5.1.1.2/3 in the C11 Standard

每条评论被一个空格字符替换。

【讨论】:

  • 另一种方法,将评论替换为空,可能会导致不可预知的错误——可能不仅仅是将评论视为空格分隔符。
【解决方案2】:

因为 C 语言被指定禁止这样做。直观地说,cmets 是类空间的。你可以想象编译器将每个 cmets 解析为一个空格。

您可能对preprocessor replacement 能力感兴趣。了解它的 concatenationstringification 功能(在宏内部)。

还有一个实用的理由来禁止 cmetsinside 词法标记:它会使源代码非常难以被人类阅读

此外,在令牌中允许 cmets 可能会使解析器变慢。

我知道没有一种编程语言接受令牌内的 cmets。

在 1970 年代和 1980 年代,大多数 C 编译器有效地运行一个单独的预处理器进程 (/lib/cpp),它生成一个由真正的编译器解析的预处理文件 (cc1,它生成一个汇编程序文件)。今天,预处理器实际上是cc1 编译器的一部分(在GCC 中,它是libcpp/ 内部库)——因为生成了一个虚拟的标记流,所以它以某种方式作为词法分析器工作——并且通常不会将预处理文件写入磁盘。

【讨论】:

  • 所以基本上是词法分析器生成的临时文件包含空格字符然后传递给解析器,我正确吗?
  • 不是今天,但你的照片在上个世纪是正确的。
  • 源代码中的所有空白字符如制表符、换行符是否都被单个空白替换,那么在词法分析器形成的临时文件中是否有任何表示,那么在解析时如何区分制表符和换行符,例如,在 printf 语句中我们给出制表符和换行符,那么解析器将如何工作,那么如果词法分析器处理空格字符,我就是完全困惑如何处理空格?
  • 允许在令牌中使用 cmets 是出于务实的原因,实际上禁止它们会导致源代码非常不可读。即,长令牌。 C 已经做了一些倒立来允许单行字符串跨越多行,这表明语言设计者已经意识到了这个问题。他们只是没有为 1000 个字符的标识符这样做,这需要它。
猜你喜欢
  • 2011-01-05
  • 2023-03-05
  • 1970-01-01
  • 2015-01-13
  • 2021-04-21
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多