Ticket #5108: unicode-subsupscripts.patch

File unicode-subsupscripts.patch, 5.4 KB (added by mikhail.vorozhtsov, 3 years ago)
  • compiler/parser/Lexer.x

    From bde0f0e695ea28148c823c6cdc3fd19cc9e5c469 Mon Sep 17 00:00:00 2001
    From: Mikhail Vorozhtsov <[email protected]>
    Date: Tue, 12 Apr 2011 20:04:14 +0700
    Subject: [PATCH] Allow sub/superscript symbols in identifiers and operators.
    
    ---
     compiler/parser/Lexer.x |   69 ++++++++++++++++++++++++++++++++++++++--------
     1 files changed, 57 insertions(+), 12 deletions(-)
    
    diff --git a/compiler/parser/Lexer.x b/compiler/parser/Lexer.x
    index 9ae312c..7ea10d2 100644
    a b $ascsmall = [a-z] 
    108108$small     = [$ascsmall $unismall \_] 
    109109 
    110110$unigraphic = \x06 -- Trick Alex into handling Unicode. See alexGetChar. 
    111 $graphic   = [$small $large $symbol $digit $special $unigraphic \:\"\'] 
     111$subsup    = \x0E -- Trick Alex into handling Unicode. See alexGetChar. 
     112$graphic   = [$small $large $symbol $digit $special $unigraphic $subsup 
     113              \:\"\'] 
    112114 
    113115$octit     = 0-7 
    114116$hexit     = [$decdigit A-F a-f] 
    115 $symchar   = [$symbol \:] 
     117$symchar   = [$symbol $subsup \:] 
    116118$nl        = [\n\r] 
    117 $idchar    = [$small $large $digit \'] 
     119$idchar    = [$small $large $digit $subsup \'] 
    118120 
    119121$pragmachar = [$small $large $digit] 
    120122 
    alexGetByte (AI loc s) 
    16081610        symbol          = '\x4' 
    16091611        space           = '\x5' 
    16101612        other_graphic   = '\x6' 
     1613        subsup          = '\xE' 
    16111614 
    16121615        adj_c 
    1613           | c <= '\x06' = non_graphic 
     1616          | c <= '\x06' || c == '\x0E' = non_graphic 
    16141617          | c <= '\x7f' = c 
    16151618          -- Alex doesn't handle Unicode, so when Unicode 
    16161619          -- character is encountered we output these values 
    alexGetByte (AI loc s) 
    16181621          | otherwise = 
    16191622                case generalCategory c of 
    16201623                  UppercaseLetter       -> upper 
    1621                   LowercaseLetter       -> lower 
     1624                  LowercaseLetter       -> 
     1625                    if c == '\xAA' || c == '\xBA' || 
     1626                       (c >= '\x1D62' && c <= '\x1D6A') || 
     1627                       c == '\x2C7C' 
     1628                      then subsup 
     1629                      else lower 
    16221630                  TitlecaseLetter       -> upper 
    1623                   ModifierLetter        -> other_graphic 
     1631                  ModifierLetter        -> 
     1632                    if (c >= '\x02B0' && c <= '\x02B8') || 
     1633                       (c >= '\x02E0' && c <= '\x02E4') || 
     1634                       c == '\x10FC' || 
     1635                       (c >= '\x1D2C' && c <= '\x1D2E') || 
     1636                       (c >= '\x1D30' && c <= '\x1D3A') || 
     1637                       (c >= '\x1D3C' && c <= '\x1D4D') || 
     1638                       (c >= '\x1D4F' && c <= '\x1D61') || 
     1639                       c == '\x1D78' || 
     1640                       (c >= '\x1D9B' && c <= '\x1DBF') || 
     1641                       c == '\x2071' || c == '\x207F' || 
     1642                       (c >= '\x2090' && c <= '\x209C') || 
     1643                       c == '\x2C7D' || c == '\x2D6F' || c == '\xA770' 
     1644                      then subsup 
     1645                      else other_graphic 
    16241646                  OtherLetter           -> lower -- see #1103 
    16251647                  NonSpacingMark        -> other_graphic 
    16261648                  SpacingCombiningMark  -> other_graphic 
    16271649                  EnclosingMark         -> other_graphic 
    16281650                  DecimalNumber         -> digit 
    16291651                  LetterNumber          -> other_graphic 
    1630                   OtherNumber           -> digit -- see #4373 
     1652                  OtherNumber           -> 
     1653                    if c == '\xB2' || c == '\xB3' || c == '\xB9' || 
     1654                       (c >= '\x2070' && c <= '\x2079') || 
     1655                       (c >= '\x2080' && c <= '\x2089') || 
     1656                       (c >= '\x3192' && c <= '\x3195') 
     1657                      then subsup 
     1658                      else digit 
    16311659                  ConnectorPunctuation  -> symbol 
    16321660                  DashPunctuation       -> symbol 
    1633                   OpenPunctuation       -> other_graphic 
    1634                   ClosePunctuation      -> other_graphic 
     1661                  OpenPunctuation       -> 
     1662                    if c == '\x207D' || c == '\x208D' 
     1663                      then subsup 
     1664                      else other_graphic 
     1665                  ClosePunctuation      -> 
     1666                    if c == '\x207E' || c == '\x208E' 
     1667                      then subsup 
     1668                      else other_graphic 
    16351669                  InitialQuote          -> other_graphic 
    16361670                  FinalQuote            -> other_graphic 
    1637                   OtherPunctuation      -> symbol 
    1638                   MathSymbol            -> symbol 
     1671                  OtherPunctuation      -> 
     1672                    if (c >= '\x2032' && c <= '\x2034') || c == '\x2057' 
     1673                      then subsup 
     1674                      else symbol 
     1675                  MathSymbol            -> 
     1676                    if (c >= '\x207A' && c <= '\x207C') || 
     1677                       (c >= '\x208A' && c <= '\x208C') 
     1678                      then subsup 
     1679                      else symbol 
    16391680                  CurrencySymbol        -> symbol 
    16401681                  ModifierSymbol        -> symbol 
    1641                   OtherSymbol           -> symbol 
     1682                  OtherSymbol           -> 
     1683                    if c == '\x2120' || c == '\x2122' || 
     1684                       (c >= '\x3196' && c <= '\x319F') 
     1685                      then subsup 
     1686                      else symbol 
    16421687                  Space                 -> space 
    16431688                  _other                -> non_graphic 
    16441689