为什么预处理器区分数字标记和字符标记
Why does the preprocessor distinguish between number and character tokens?
根据语言规范,词法元素定义如下:
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
的定义中会增加什么?你仍然需要两个作品来描述语言。
相关文章:
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何检查一个c++字符串中有多少相同的字符/数字
- 当我输入字符类型的数字时,为什么我无法获得整数?
- scanf() 只取数字作为输入,避免使用其他字符
- 递归形成字符串中所有数字字符的中间和?
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 如何在 getline 中删除/忽略超过特定数字的字符?
- C++输出奇怪的字符而不是数字 (Windows)
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- 如何在C++中有效地将数字值重新分配给字符数组
- 我应该以字符形式存储数字以节省内存吗?
- C++ 从 std::string 中删除所有非数字字符
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- 不反转数字的字符反转
- 如何检查字符串是否包含所有这些:数字、字母和特殊字符
- 如果是数字或字符,请检查输入
- 如何将字符更改为数字?
- 生成随机字符/数字
- 如何将 std::string 中的所有非字母字符(数字和特殊字符)替换为空格
- 字符数字 ['0'.."9'] 需要具有连续的数值吗?