Предполагая, что грамматика, используемая C ++ для констант с плавающей запятой, такая же, как и для C (что я считаю верным), мы имеем:
Определения некоторых ярлыков, взятых из ANSI C grammar
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
FS (f|F|l|L)
IS (u|U|l|L)*
Теперь f
или F
, которые вы видите в конце чисел с плавающей запятой, определены в FS
выше.
Теперь давайте посмотрим, как грамматика распознает действительныеконстанты с плавающей точкой:
{D}+{E}{FS}?
{D}*"."{D}+({E})?{FS}?
{D}+"."{D}*({E})?{FS}?
Теперь, если вы внимательно посмотрите, нет правила, которое бы идентифицировало 0f
.
Используя правило 1, мы можем получить 0e0f
ИспользуяПравило2 у нас может быть .0f
или 0.0f
Используя правило3, мы можем иметь 0.f
или 0.0f
То, что на самом деле происходит в вашем случае, это 0
из 0f
будет использоваться лексическим анализатором как целочисленная константа D
, а f
будет использоваться как токен FS
.Теперь, когда синтаксический анализ видит D
, за которым следует FS
, для которого нет соответствующего правила, он выдает ошибку:
error: invalid suffix "f" on integer constant