冒着提出一个被认为过于挑剔的问题的风险,我花了很长时间试图证明(作为在整个标准中在不同情况下发生的事情的一个例子)以下第integer literal
2.14.2 节中的an 定义C++11 标准,特别是关于一个细节,即语法符号本身中空格的存在。
(请注意,这个例子 - 整数文字的定义 - 不是我的问题的重点。我的问题的重点是询问 C++ 标准本身使用的语法描述符号,特别是关于语法类别名称之间的空格. 我在这里给出的例子——整数文字的定义——是专门选择的,只是因为它作为一个简单明了的例子。)
(为简洁起见,来自 §2.14.2):
integer-literal:
decimal-literal integer-suffix_opt
decimal-literal:
nonzero-digit
decimal-literal digit
(正如预期的那样,[0] 1 ... 9)nonzero-digit
。digit
(注:以上文字在标准中均为斜体。)
这一切对我来说都是有意义的,假设语法类别描述之间的空格decimal-literal
被digit
理解为不存在于实际源代码中,但仅存在于语法描述本身中,因为它出现在第 2.14.2 节中。
这个约定——在符号中的类别描述之间放置一个空格,可以理解该空格不会出现在源代码中——在规范的其他地方使用。这里的例子只是一个明确的例子,其中空间显然不应该出现在源代码中。(请参阅此问题的附录,了解标准中的反例,其中当这些类别描述被源代码中的实际标记替换时,类别描述之间必须存在或可选的空格或其他分隔符。)
同样,冒着吹毛求疵的风险,我无法在标准中的任何地方找到一个约定声明,即在解释本示例中的符号时,源代码中不存在空格。
该标准在第 1.6.1 节(及之后)中讨论了符号约定。我能找到的唯一相关文本是:
在本国际标准使用的句法符号中,句法类别用斜体表示,字面量和字符用等宽类型表示。替代品列在单独的行中,除非在少数情况下,一长串替代品用短语“一个”标记。</p>
我不会那么挑剔;然而,我发现标准中使用的符号有点棘手,所以我想清楚所有细节。我很感激任何愿意花时间让我了解这一点的人。
附录 针对声称类似于“很明显不应在最终源代码中包含空格,因此标准没有必要明确说明这一点”的评论:我在这个问题中选择了一个简单的例子,很明显的地方。标准中有很多情况下,如果没有 a就不明显了。语言的先验知识(在我看来),例如 §8.0.4 讨论“const”和“volatile”:
cv-qualifier-seq:
cv-qualifier cv-qualifier-seq_opt
...请注意此处的相反假设(最终源代码中需要空格或另一个或多个分隔符),但这不可能从语法符号本身推断出来。
在某些情况下,空格是可选的,例如:
noptr-abstract-declarator:
noptr-abstract-declarator_opt parameters-and-qualifiers
(在这个例子中,为了说明一点,我不会给出节号或解释正在讨论的内容;我只会问从语法符号本身来看,在这种情况下,最终源代码中的空格是否很明显在标记之间是可选的。)
我怀疑这些评论——“很明显,所以它必须是这样”——是因为我选择的例子是如此明显。这正是我选择这个例子的原因。