Combined grammar changes for binary literals and underscores in literals
Joe Darcy
joe.darcy at oracle.com
Tue Apr 13 01:05:03 PDT 2010
Welcome back Bruce!
Bruce Chapman wrote:
> Joe, Derek et al,
>
> I am just writing up the combined integer literal omnibus proposal.
>
> A couple of questions about this grammar
>
>
> 1)
>
> considering
>
> DecimalNumeral
> 0
> NonZeroDigit Digits_opt
> NonZeroDigit Underscores Digits // New (1)
>
> Underscores
> _
> Underscores _
>
> Digits:
> Digit
> Digit DigitsAndUnderscores_opt Digit (2)
>
>
> I think we can drop rule (1) above, if rule (2) is changed to
>
> DigitsAndUnderscores_opt Digit
>
> since there is already a leading NonZeroDigit, so we can start a
> "Digits" with an underscore, so we don't need the special rule to allow
> for an underscore immediately after the NonZeroDigit.
>
> Agreed?
>
> If so we can also make corresponding change for Octal rules then drop
> the Underscores production as these are the only places it is used.
>
>
> 2)
>
> I am wondering whether it would enhance grokkability of we renamed the
> productions
>
> HexDigitsAndUnderscores (and other radix friends, and corresponding singular forms)
>
>
> to be (eg)
> HexMidDigits
>
> because it can't be used at either end of the HexDigits, but can be in
> the middle.
>
> - if we did this the hex rules would change from
>
> HexDigits:
> HexDigit
> HexDigit HexDigitsAndUnderscores_opt HexDigit
>
> HexDigitsAndUnderscores:
> HexDigitOrUnderscore
> HexDigitsAndUnderscores HexDigitOrUnderscore
>
> HexDigitOrUnderscore
> HexDigit
> _
>
>
>
> to
>
> HexDigits:
> HexDigit
> HexDigit HexMidDigits_opt HexDigit
>
> HexMidDigits:
> HexMidDigit
> HexMidDigits HexMidDigit (but actually vice versa as previously
> discussed off-list with Alex Buckley)
>
> HexMidDigit
> HexDigit
> _
>
>
>
>
> Comments?
>
>
One advantage of the way I wrote up the grammar is that the other
appearances of Digits and HexDigits, such as in floating-point literals
in section 3.10.2, automatically inherit the underscore policy without
having to having leading digit guard productions in all places. The
current implementation does allow underscores in floating-point literals
too, which is tested for in the regression tests.
-Joe
> Bruce
>
>
>
>
>
>
> Joe Darcy wrote:
>
>> Hello.
>>
>> It has been pointed out to me off-list that the grammar as written below
>> would disallow two-digit numbers, which is not desired. This problem is
>> corrected by changing the productions like
>>
>> Digit DigitsAndUnderscores Digit
>>
>> to be
>>
>> Digit DigitsAndUnderscores_opt Digit
>>
>> -Joe
>>
>> On 07/15/09 02:22 PM, Joseph D. Darcy wrote:
>>
>>
>>> Hello.
>>>
>>> Getting around to some grammatical hacking, below is a grammar I think
>>> properly captures the desired changes for combining the binary
>>> literals and underscores in literals proposals. This grammar does
>>> *not* include support for unsigned literals or autosizing literals.
>>>
>>> The basic approach is to redefine the FooDigits productions to be a
>>> non-empty sequence of Foo digits and underscores starting and ending
>>> with a Foo digit rather than just a non-empty sequence Foo digits.
>>> Each FooDigits nonterminal has two rules, one for a single digit and
>>> one for two or more digits. The rules for two or more digits force a
>>> true digit, rather than an underscore, as the first and last character.
>>>
>>> Changing the FooDigits definitions allows underscores in both integer
>>> and floating-point literals. In more detail:
>>>
>>> * Replace the productions Digits, HexDigits, OctalDigits, and in
>>> JLSv3 3.10.1 as shown below
>>> * Add productions for BinaryDigits
>>> * Add rules for FooDigitsAndUnderscores and FooDigitOrUnderscore
>>> * Add productions to DecimalNumeral and OctalNumeral:
>>> * Add a rule for Underscores
>>>
>>> IntegerLiteral:
>>> DecimalIntegerLiteral
>>> HexIntegerLiteral
>>> OctalIntegerLiteral
>>> BinaryIntegerLiteral // New
>>>
>>> BinaryIntegerLiteral:
>>> BinaryNumeral IntegerTypeSuffix_opt
>>>
>>> BinaryNumeral:
>>> 0 b BinaryDigits
>>> 0 B BinaryDigits
>>>
>>>
>>> DecimalNumeral
>>> 0
>>> NonZeroDigit Digits_opt
>>> NonZeroDigit Underscores Digits // New
>>>
>>> Underscores
>>> _
>>> Underscores _
>>>
>>> Digits:
>>> Digit
>>> Digit DigitsAndUnderscores Digit
>>>
>>> DigitsAndUnderscores:
>>> DigitOrUnderscore
>>> DigitsAndUnderscores DigitOrUnderscore
>>>
>>> DigitOrUnderscore
>>> Digit
>>> _
>>>
>>>
>>> HexDigits:
>>> HexDigit
>>> HexDigit HexDigitsAndUnderscores HexDigit
>>>
>>> HexDigitsAndUnderscores:
>>> HexDigitOrUnderscore
>>> HexDigitsAndUnderscores HexDigitOrUnderscore
>>>
>>> HexDigitOrUnderscore
>>> HexDigit
>>> _
>>>
>>> OctalNumeral:
>>> 0 OctalDigits
>>> 0 Underscores OctalDigits // New
>>>
>>> OctalDigits:
>>> OctalDigit
>>> OctalDigit OctalDigitsAndUnderscores OctalDigit
>>>
>>> OctalDigitsAndUnderscores:
>>> OctalDigitOrUnderscore
>>> OctalDigitsAndUnderscores OctalDigitOrUnderscore
>>>
>>> OctalDigitOrUnderscore
>>> OctalDigit
>>> _
>>>
>>> BinaryDigits:
>>> BinaryDigit
>>> BinaryDigit BinaryDigitsAndUnderscores BinaryDigit
>>>
>>> BinaryDigitsAndUnderscores:
>>> BinaryDigitOrUnderscore
>>> BinaryDigitsAndUnderscores BinaryDigitOrUnderscore
>>>
>>> BinaryDigitOrUnderscore
>>> BinaryDigit
>>> _
>>>
>>> BinaryDigit: one of
>>> 0 1
>>>
>>> -Joe
>>>
>>>
>>
>>
>>
>
>
>
More information about the coin-dev
mailing list