Предполагая, что грамматика, используемая 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
person
codaddict
schedule
19.10.2010