为什么注释不能在令牌中使用?

时间:2015-02-28 21:27:38

标签: c compiler-construction

如果我有代码,比如

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

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

2 个答案:

答案 0 :(得分:9)

请参阅5.1.1.2/3 in the C11 Standard

  

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

答案 1 :(得分:3)

因为指定C语言禁止这样做。直观地说,评论是空间的。您可以想象编译器将每个注释解析为空格。

您可能对preprocessor replacement能力感兴趣。阅读其concatenation& stringification能力(在宏内)。

还有一个实用的理由禁止内部词法标记:它会使人类的源代码非常难以理解

此外,允许在令牌内部发表评论可能会使解析器变慢。

我知道没有编程语言接受令牌内的评论。

在20世纪70年代和20世纪80年代,大多数C编译器有效地运行一个单独的预处理器进程(/lib/cpp),该进程生成一个预处理文件,该文件由真实编译器(cc1解析,生成汇编程序文件)。今天,预处理器实际上是cc1编译器的一部分(在GCC中它是libcpp/内部库) - 作为词法分析器工作,因为生成了一个虚拟的标记流 - 并且没有预处理文件通常写入磁盘。