c++ - 为什么预处理器区分数字和字符标记?

标签 c++ c compilation token c-preprocessor

根据语言规范,词法元素是这样定义的:

token:
    keyword
    identifier

    constant

    string-literal
    operator
    punctuator

preprocessing-token:
    header-name
    identifier

    pp-number
    character-constant

    string-literal
    operator
    punctuator

    each non-white-space character that cannot be one of the above

为什么在预处理token层面有数字和字符之分,而在token层面只有常量?我看不出这种区别有什么好处。

最佳答案

C 文法中非终结符的名称不规范;它们只是为了描述而存在。正确描述行为很重要。语法本身不足以描述语言;它需要与文本一起阅读,这对格式良好的程序施加了进一步的限制。

预处理器标记和程序标记之间没有一对一的关系。存在重叠:预处理器 identifier 可能是关键字,也可能是各种可定义的符号类型之一(包括一些常量和 typedef-names)。 pp-number 可能是整数或浮点常量,但也可能是无效的。词法产生式并不都是相互排斥的,词法范畴对程序子串的实际应用需要标准文本中描述的过程,而不是形式语法中描述的过程。

字符常量直接从预处理器传递到程序语法中而无需修改(尽管它们随后被归入常量类别)。如果有关于预处理器数字的单个评论(例如,如果它们在预处理器中存活,则它们必须可以转换为实数值常量文字这一事实)是拥有该类别的充分理由。

另外,在 pp-number 的定义中包含 character-constant 会增加什么?您仍然需要这两个产品来描述语言。

关于c++ - 为什么预处理器区分数字和字符标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727000/

相关文章:

c++ - 为什么 unsigned char 不能正确显示十六进制值

c - 返回指向静态定义的结构数组的指针

iphone - pjsip在xcode4.2上的编译问题

c++ - ZMQ经销商-路由器-经销商模式

c++ - 试图使矩阵类工作

c++ - undefined reference (但 nm 说该函数存在)

c - 如何在 Castalia 3.3 模拟器的命令行中更改配置 GTson(即对于具有不同 GTS 请求的各个节点)?

c - 如何在C中选择一个字符串数组?

c++ - 如何修复 GCC 编译中的 const char * 构造函数转换链错误

java - 找不到符号错误,拼写错误和参数均不正确