【发布时间】:2021-09-30 21:23:51
【问题描述】:
我目前正在实现 C11 编译器,我的目标是将预处理器集成到其余编译器中,而不是将其作为独立组件。因此,预处理器可以安全地假设其输出将在以下阶段有效。
阅读有关预处理数字令牌的信息,似乎它只是为了简化独立预处理器的实现而存在。简化数字的格式,它不必处理数字表达式的全部复杂性。引用GCC docs:
这个不寻常的定义的目的是将预处理器与数字常量的全部复杂性隔离开来。它不必区分词法有效和无效的浮点数,这很复杂。
由于预处理器将集成到编译器框架的其余部分,这对我来说不是问题。
在第 6.4.8.4 节[预处理数字;语义] C11 标准,它声称
预处理数字没有类型或值;它在成功转换(作为转换阶段 7 的一部分)到浮点常量令牌或整数常量令牌后获取两者。
因此,似乎每个预处理数字都会在稍后的编译过程中转换为浮点或整数常量。我在标准中找不到任何其他对预处理编号的引用,所以这似乎是他们唯一的目的,但我可能错了。
我的问题是,预处理器将预处理数字限制为仅有效的整数和浮点常量是否有效?或者是否存在这样的限制会导致其他有效程序失败的情况?
【问题讨论】:
-
哪些 PP 数字不是有效的整数或浮点常量?
-
this ?
The program fragment 1Ex is parsed as a preprocessing number token (one that is not a valid floating or integer constant token),但这很奇怪,因为在pp-numbersyntax 中,符号 not 是可选的。 -
@Barmar
0x2x3和34.2.8是有效的 pp 数字,但不是有效的整数或浮点常量。 pp-numbers 要轻松得多。 -
@KamilCuk 我猜“1Ex”可以解析为
<digit> <identifier-nondigit> <identifier-nondigit>,因为预处理数字可能包含非数字标识符。但是,我认为1Ex的示例并没有真正回答这个问题,如果预处理器将其解析为1(整数常量)Ex(标识符),那么结果在后面的阶段(整数不能紧跟标识符)。 -
是的。所以关键是,如果“预处理器将预处理数字限制为仅有效的整数和浮点常量是有效的”,那么
1Ex将被不正确地解析。
标签: c syntax c-preprocessor standards