我假设C ++令牌类型(根据2.7 Tokens [lex.token]
)不形成交叉集(即int
被认为仅属于keyword
令牌类型,而不是两者{ {1}}和keyword
令牌类型)。考虑到这一点,出现了以下问题。
C ++ 11引用:
2.2翻译阶段[lex.phases]
分隔标记的7个空格字符不再重要。每个预处理令牌都转换为令牌。 (2.7)。由此产生的标记在语法和语义上进行分析并翻译为翻译单元。
因此,C ++文本的语法和语义分析是在文本溢出到令牌之后进行的。
另一个C ++ 11引用:
2.7令牌[lex.token]
令牌:
identi音响ER
关键字
字面
操作者
标点
在标准中我没有找到identifier
和operator
语法非终端的定义。无论如何,根据punctuator
和2.12 Keywords
,令牌2.13 Operators and punctuators
可以是new
或keyword
令牌。在执行代码的语法和语义分析之前,C ++编译器如何才能确定operator
标记的类型?
答案 0 :(得分:2)
new
和delete
是可重载的运算符,其名称由单个标记组成。
制作 preprocessing-op-or-punc ( [lex.operators] / 1)和 operator 之间的差异( [over.oper] / 1)删除了标点符号和预处理运算符{ } [ ] # ## ( ) ; : ...
,有向图替换标记<: :>
等,不可重载的运算符. .* :: ?
,词汇关键字替换标记and and_eq
等,以及多字符操作符new[]
,delete[]
,()
和[]
的添加。 运算符中包含new
,delete
,new[]
和delete[]
,以便 operator-function-id (operator new
等)可以遵循其他可重载运算符的规则,而不必重复语言,保持更新,并发明新的生产( dynamic-function-id ?)到处发生发生 operator-function-id 。请注意,名称具有标识符(sizeof
,typeid
等)的词法形式的不可重载运算符不包含在运算符中,因此也不包含在 >预处理-OP-或-PUNC
虽然这会在标识符和预处理-op-or-punc 制作之间引入歧义,但这不会以任何方式影响第3阶段的翻译。对于阶段7,其中歧义在关键字和运算符之间,这也不是问题,因为运算符生产和其他包含令牌new
和delete
例如 new-expression ( [expr.new] )不会引用关键字或运算符作品,而是包含相关的令牌直接。