http://www.digitalmars.com/d/1.0/lex.htmlhttp://www.digitalmars.com/d/2.0/lex.html
Under "Floating Literals", the spec says:
DecimalFloat -> DecimalDigits
DecimalFloat -> DecimalDigits . DecimalDigits
DecimalFloat -> . DecimalDigits
etc
DecimalDigits is defined as:
DecimalDigits -> DecimalDigit
DecimalDigits -> DecimalDigit DecimalDigits
DecimalDigit -> [0123456789_]
From this, we can derive:
DecimalFloat -> DecimalDigits . DecimalDigits
-> DecimalDigit . DecimalDigit
-> _ . _
To resolve the ambiguity, _ cannot be allowed as the first character in a float, and it cannot be allowed as the first character after the decimal point.
Comment #1 by bugs-d — 2009-03-29T22:20:05Z
It appears DMD 2.026 already works as you suggest; _1.0 is not recognized as a valid float.
However, 1_._1 is, which doesn't seem ambiguous to me. Once you're after the . and in a FloatLiteral, any characters in [_0-9] should be eaten to finish the float literal.
The spec just needs to be corrected with a new rule that defines 0, NonZeroDigit, and then a repeating of those with DecimalDigits (Decimal is almost fine except its handling of octals.)
-[Unknown]