C ++令牌类型

时间:2014-09-01 12:23:14

标签: c++ token language-lawyer

我假设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
关键字
字面
操作者
标点

在标准中我没有找到identifieroperator语法非终端的定义。无论如何,根据punctuator2.12 Keywords,令牌2.13 Operators and punctuators可以是newkeyword令牌。在执行代码的语法和语义分析之前,C ++编译器如何才能确定operator标记的类型?

1 个答案:

答案 0 :(得分:2)

newdelete是可重载的运算符,其名称由单个标记组成。

制作 preprocessing-op-or-punc [lex.operators] / 1)和 operator 之间的差异( [over.oper] / 1)删除了标点符号和预处理运算符{ } [ ] # ## ( ) ; : ...,有向图替换标记<: :>等,不可重载的运算符. .* :: ? ,词汇关键字替换标记and and_eq等,以及多字符操作符new[]delete[]()[]的添加。 运算符中包含newdeletenew[]delete[],以便 operator-function-id operator new等)可以遵循其他可重载运算符的规则,而不必重复语言,保持更新,并发明新的生产( dynamic-function-id ?)到处发生发生 operator-function-id 。请注意,名称具有标识符(sizeoftypeid等)的词法形式的不可重载运算符不包含在运算符中,因此也不包含在 >预处理-OP-或-PUNC

虽然这会在标识符预处理-op-or-punc 制作之间引入歧义,但这不会以任何方式影响第3阶段的翻译。对于阶段7,其中歧义在关键字运算符之间,这也不是问题,因为运算符生产和其他包含令牌newdelete例如 new-expression [expr.new] )不会引用关键字运算符作品,而是包含相关的令牌直接。