如果我的程序有字符串s1 =“喜欢/ * this”,则s2 =“喜欢/ *这是评论* / this”和s3 =“喜欢// 这不是评论” 在s1和s3中,“/ ”和“// *”是字符串的一部分。 在s2中,它是用户在输出屏幕上显示的注释。 c / c ++编译器使用什么算法? (我的猜测是,编译器只是忽略“”中的所有文本)
答案 0 :(得分:4)
不,在字符串内部没有注释,所有字符都是字符串的一部分。从C标准,第6.4.9章(评论):
除了字符常量,字符串文字或注释之外,字符/ *引入注释。检查此类注释的内容仅用于识别多字节字符并查找终止它的字符*。
然后是//
评论的类似规则。
此外,有一个很好的脚注说明,由于评论中未识别/*
,因此评论不会嵌套。
关于编译器使用的算法......好吧,当标记输入文件时,编译器知道它是否在字符串内(它必须知道它自己的状态),是否很容易切换到评论模式与否。
答案 1 :(得分:3)
它是编译器的lexical analysis。对于C,它与preprocessing绑定(因此请查看libcpp/源代码的GCC目录)。详细了解parsing& abstract syntax trees
您应该阅读Dragon Book,其中概述了编译技术(我们无法在几句话中解释它们)。
词法分析通常使用有限自动机(对应于正则表达式)技术来完成。在许多情况下,您可以生成词法分析器,例如使用flex。还可以生成语法分析,例如,使用bison或ANTLR(与堆栈自动机相关)。
(顺便说一下,目前的GCC 6& 7正在使用手写的词法分析器和解析器 - 而不是用例如flex
& bison
生成它们 - 首先要管理很多额外信息,例如源位置,宏观扩展的内容;以及更好的错误消息;以及可能的效率)
如果您需要有关GCC的详细说明,我的MELT documentation网页包含大量参考资料。另请参阅GCC internals文档,当然还要下载并研究 GCC 的source代码。另请参阅this。