c++ - 在C++标准中,它在哪里表示用它代表的源代码替换类别描述的间距协议(protocol)?

标签 c++ c++11 standards

冒着提出一个过于挑剔的问题的风险,我花了很长时间试图证明(作为整个标准在不同上下文中发生的事情的一个例子)以下 integer literal 的定义是合理的。在 C++11 标准的 §2.14.2 中,特别是关于一个细节,即语法符号本身中空格的存在。

(请注意,此示例 - 整数文字的定义 - 不是我的问题的重点。我的问题的重点是询问 C++ 标准本身使用的语法描述符号,特别是关于语法类别名称之间的空格。我在这里给出的例子 - 整数文字的定义 - 之所以特别选择,只是因为它作为一个简单而清晰的例子。)

(为简洁而缩写,来自 §2.14.2):

integer-literal:
    decimal-literal integer-suffix_opt

decimal-literal:
    nonzero-digit
    decimal-literal digit

(如预期的那样,nonzero-digitdigit,[0] 1 ... 9)。 (注:标准中以上文字均为斜体。)

这一切对我来说都是有意义的,假设语法类别描述之间的空格 decimal-literaldigit被理解为不存在于实际的源代码中,而只存在于语法描述本身中,因为它出现在第 2.14.2 节中。

这个约定——在符号内的类别描述之间放置一个空格,可以理解为源代码中不存在空格——在规范的其他地方使用。这里的示例只是一个明确的案例,其中空间显然不应该出现在源代码中。 (有关标准中的反例,请参阅此问题的附录,其中当类别描述被源代码中的实际标记替换时,类别描述之间必须存在空格或其他分隔符,或者这些分隔符是可选的。)

同样,冒着挑剔的风险,我无法在标准中的任何地方找到一个约定声明,即在解释诸如本例中的符号时,源代码中不存在空格。

该标准在 §1.6.1(及其后)中讨论了符号约定。我能找到的唯一相关文本是:

In the syntax notation used in this International Standard, syntactic categories are indicated by italic type, and literal words and characters in constant width type. Alternatives are listed on separate lines except in a few cases where a long set of alternatives is marked by the phrase “one of.”



我不会那么挑剔;然而,我发现标准中使用的符号有点棘手,所以我想清楚所有细节。我感谢任何愿意花时间让我了解这一点的人。

附录 为了回应类似“很明显,最终源代码中不应包含空格的声明,因此标准无需明确说明这一点”的评论:我在这个问题中选择了一个简单的例子,很明显的地方。标准中有很多情况下,如果没有 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

(在这个例子中,为了说明这一点,我不会给出节号或解释正在讨论的内容;我只是问从语法符号本身是否很明显,在这种情况下,最终源代码中的空格在 token 之间是可选的。)

我怀疑这些评论——“这是显而易见的,所以它一定是这样的”——是我选择的例子如此明显的结果。这正是我选择这个例子的原因。

最佳答案

§2.7.1

There are five kinds of tokens: identifiers, keywords, literals, operators, and other separators. Blanks, horizontal and vertical tabs, newlines, formfeeds, and comments (collectively, “white space”), as described below, are ignored except as they serve to separate tokens.



因此,如果文字是标记,并且空格用于分隔标记,则文字数字之间的空格将被解释​​为两个单独的标记,因此不能成为同一文字的一部分。

关于c++ - 在C++标准中,它在哪里表示用它代表的源代码替换类别描述的间距协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754778/

相关文章:

c++ - g++ 在 static_assert 中接受 const 作为 constexpr

C++ OSX 设置 w/Vs 代码还是?

c++ - 属性表 (.prop) : how to refactor its filename and not break VS project?

c++ - 当只能更改一侧时重构紧密耦合的类

c++ - 有没有办法不杀死抛出 std::bad_alloc 的 Qt 应用程序?

css - 为什么 CSS 不支持常量?

regex - 如何表示正则表达式数字范围(例如 1 到 12)?

c++ - 使用 C++ 类成员函数作为 C 回调函数

c++ - 如何在 Linux C++ 应用程序中通过管道传输到 ifstream

c++ - C++ 函数参数中的求值顺序