为什么预处理器区分数字标记和字符标记

Why does the preprocessor distinguish between number and character tokens?

本文关键字:字符 数字 预处理 处理器区 为什么      更新时间:2023-10-16

根据语言规范,词法元素定义如下:

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

为什么在预处理令牌级别上数字和字符之间有区别,而在令牌级别上只有常量?我看不出这种区别有什么好处。

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

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

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

此外,将character-constant包括在pp-number的定义中会增加什么?你仍然需要两个作品来描述语言。