Skip to content
  • Takenobu Tani's avatar
    Implement underscores in numeric literals (NumericUnderscores extension) · 4a13c5b1
    Takenobu Tani authored and Ben Gamari's avatar Ben Gamari committed
    Implement the proposal of underscores in numeric literals.
    Underscores in numeric literals are simply ignored.
    
    The specification of the feature is available here:
    https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/000
    9-numeric-underscores.rst
    
    For a discussion of the various choices:
    https://github.com/ghc-proposals/ghc-proposals/pull/76
    
    Implementation detail:
    
    * Added dynamic flag
      * `NumericUnderscores` extension flag is added for this feature.
    
    * Alex "Regular expression macros" in Lexer.x
      * Add `@numspc` (numeric spacer) macro to represent multiple
        underscores.
      * Modify `@decimal`, `@decimal`, `@binary`, `@octal`, `@hexadecimal`,
        `@exponent`, and `@bin_exponent` macros to include `@numspc`.
    
    * Alex "Rules" in Lexer.x
      * To be simpler, we have only the definitions with underscores.
        And then we have a separate function (`tok_integral` and `tok_frac`)
        that validates the literals.
    
    * Validation functions in Lexer.x
      * `tok_integral` and `tok_frac` functions validate
        whether contain underscores or not.
        If `NumericUnderscores` extensions are not enabled,
        check that there are no underscores.
      * `tok_frac` function is created by merging `strtoken` and
        `init_strtoken`.
      * `init_strtoken` is deleted. Because it is no longer used.
    
    * Remove underscores from target literal string
      * `parseUnsignedInteger`, `readRational__`, and `readHexRational} use
        the customized `span'` function to remove underscores.
    
    * Added Testcase
      * testcase for NumericUnderscores enabled.
          NumericUnderscores0.hs and NumericUnderscores1.hs
      * testcase for NumericUnderscores disabled.
          NoNumericUnderscores0.hs and NoNumericUnderscores1.hs
      * testcase to invalid pattern for NumericUnderscores enabled.
          NumericUnderscoresFail0.hs and NumericUnderscoresFail1.hs
    
    Test Plan: `validate` including the above testcase
    
    Reviewers: goldfire, bgamari
    
    Reviewed By: bgamari
    
    Subscribers: carter, rwbarton, thomie
    
    GHC Trac Issues: #14473
    
    Differential Revision: https://phabricator.haskell.org/D4235
    4a13c5b1