【发布时间】:2023-03-12 04:24:01
【问题描述】:
我假设 C++ 令牌类型(根据 2.7 Tokens [lex.token])不形成相交集(即 int 被认为仅属于 keyword 令牌类型,而不是 keyword 和 identifier令牌类型)。考虑到这一点,就会出现以下问题。
C++11 引用:
2.2 翻译阶段 [lex.phases]
7 分隔标记的空白字符不再重要。每个预处理令牌都被转换为一个令牌。 (2.7)。生成的标记在句法和语义上进行分析,并作为翻译单元进行翻译。
因此,C++ 文本的句法和语义分析是在文本溢出到标记之后执行的。
另一个 C++11 引用:
2.7 令牌 [lex.token]
令牌:
标识符
关键字
文字
运算符
标点符号
在标准中我找不到operator 和punctuator 语法非终结符的定义。无论如何,根据2.12 Keywords 和2.13 Operators and punctuators,令牌new 可以是keyword 或operator 令牌。 C++ 编译器如何在对代码进行句法和语义分析之前确定new 标记的类型?
【问题讨论】:
-
当标准显示
new和delete标记出现在多个集合中时,为什么你会假设标记类型不会形成相交集? -
@Sneftel 如果我们假设相交集,那么根据我对 2.2 的引用,
new将永远不会同时进入keyword和operator(仅限keyword),那么有什么意义使集合相交? -
运算符和标点符号在 2.13 中定义(尽管它没有指定哪些是运算符,哪些是标点符号)。我认为这个问题的答案只是“它不能”,但我不是编译器专家。
-
@PowerGamer 编译器不需要在那个阶段(或者永远,真的)对令牌进行分类。这些类别只是为了简化标准中的描述。因为
new是关键字,也可以是运算符,所以必须在两个组中。 -
@PowerGamer:当然可以将代码拆分成token。它只是无法在没有上下文分析的情况下确定标记的类型,这使得该语言的编译比使用上下文无关语法的语言更复杂。
标签: c++ token language-lawyer