【问题标题】:When are whitespace significant in translation phases 5 and 6 in C language?在 C 语言的翻译阶段 5 和 6 中,空白何时重要?
【发布时间】:2015-10-30 17:17:34
【问题描述】:

回顾一下,标准中描述了阶段 5-7:

  1. 字符常量和字符串文字中的每个源字符集成员和转义序列都转换为相应的成员 执行字符集的;如果没有对应的成员, 它被转换为实现定义的成员,而不是 空(宽)字符。 7)
  2. 连接相邻的字符串文字标记。
  3. 分隔标记的空白字符不再重要。每个预处理令牌都被转换为一个令牌。所结果的 标记在句法和语义上被分析和翻译为 翻译单元。

现在我同意空白字符在第 7 阶段不再重要,但是在第 4 阶段之后就不能摆脱它们吗?有没有这样的例子?

当然应该意识到,在此阶段删除分隔 tokens 的空白字符不起作用,因为第 4 阶段之后的数据包含 preprocessing tokens。这个想法是在更早的阶段摆脱分隔预处理标记的空格。

【问题讨论】:

  • 我没有看到我们可以帮助您解决的编程问题。这可能是programmersComputer Science 上的一个更好的问题
  • @icabod 这个问题非常适合language-lawyer 标签,所以即使没有代码也绝对是话题。

标签: c language-lawyer


【解决方案1】:

考虑这个源代码

char* str = "some text"   " with spaces";

在第 5 阶段,这将转换为这些令牌(每行一个令牌):

char
*
str
=
"some text"    
" with spaces"

这里的“some text”和“with spaces”中的空格很重要。

之后,标记之间的所有空格(见上文)都将被忽略。

如果您在第 5 步之前删除空格,您会得到其他字符串文字,例如“sometext”

【讨论】:

  • 但是,即使在第 5 步之前,数据也包含预处理标记,这很重要,因为否则您无法替换字符串中的转义序列。如果您删除预处理标记之间的空格,则不会发生这种情况。另请注意,在第 7 阶段,空白被删除预处理标记被转换为标记(在第 5 阶段没有转换为标记)。
  • 这是错误的。字符串文字是单个 pp 标记,并且空格删除不能将“some text”转换为“sometext”。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多