Bug 2734 – Ambiguity in tokenizing: _._ as a float literal

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2009-03-15T07:53:00Z
Last change time
2015-06-09T01:21:08Z
Keywords
spec
Assigned to
nobody
Creator
dhasenan
Blocks
3104

Comments

Comment #0 by dhasenan — 2009-03-15T07:53:13Z
http://www.digitalmars.com/d/1.0/lex.html http://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]
Comment #2 by bugzilla — 2010-11-09T20:12:47Z