Alan Zimmerman pushed to branch wip/az/ghc-cpp at Glasgow Haskell Compiler / GHC

Commits:

9 changed files:

Changes:

  • compiler/GHC/Parser/PreProcess/Lexer.x
    ... ... @@ -22,6 +22,8 @@ words :-
    22 22
         <0> $white+             ;
    
    23 23
     ---------------------------------------
    
    24 24
     
    
    25
    +    <0>         "//" .*              { mkTv TComment }
    
    26
    +    <0>         "/*" .* "*/"         { mkTv TComment }
    
    25 27
         <0>         "{"                  { mkTv TOpenBrace }
    
    26 28
         <0>         "}"                  { mkTv TCloseBrace }
    
    27 29
         <0>         "["                  { mkTv TOpenBracket }
    

  • compiler/GHC/Parser/PreProcess/ParsePP.hs
    ... ... @@ -27,7 +27,7 @@ parseDirective s =
    27 27
         case cppLex True s of
    
    28 28
             Left e -> Left e
    
    29 29
             Right toks ->
    
    30
    -            case toks of
    
    30
    +            case map deComment toks of
    
    31 31
                     (THash "#" : TIdentifier "define" : ts) -> cppDefine ts
    
    32 32
                     (THash "#" : TIdentifier "undef" : ts) -> Right $ cppUndef (map t_str ts)
    
    33 33
                     (THash "#" : TIdentifier "include" : ts) -> Right $ cppInclude (map t_str ts)
    
    ... ... @@ -112,6 +112,13 @@ cppLex sd s = case lexCppTokenStream s (init_state {scanning_directive = sd}) of
    112 112
         Left err -> Left err
    
    113 113
         Right (_inp, _st, toks) -> Right toks
    
    114 114
     
    
    115
    +-- Each comment is replaced with a space
    
    116
    +-- https://timsong-cpp.github.io/cppwp/n4140/lex#phases-1.3
    
    117
    +deComment :: Token -> Token
    
    118
    +deComment (TComment _) = TComment " "
    
    119
    +deComment t = t
    
    120
    +
    
    121
    +
    
    115 122
     -- ---------------------------------------------------------------------
    
    116 123
     
    
    117 124
     doATest :: String -> Either String CppDirective
    

  • compiler/GHC/Parser/PreProcess/ParserM.hs
    ... ... @@ -91,6 +91,8 @@ init_state =
    91 91
     
    
    92 92
     data Token
    
    93 93
         = TEOF {t_str :: String}
    
    94
    +    | -- https://timsong-cpp.github.io/cppwp/n4140/lex.comment
    
    95
    +      TComment {t_str :: String}
    
    94 96
         | TIdentifier {t_str :: String}
    
    95 97
         | TIdentifierLParen {t_str :: String}
    
    96 98
         | TInteger {t_str :: String}
    

  • testsuite/tests/ghc-cpp/GhcCpp01.hs
    ... ... @@ -18,13 +18,13 @@ y = 1
    18 18
     #endif
    
    19 19
     
    
    20 20
     #undef FOO
    
    21
    -#ifdef FOO
    
    21
    +#ifdef FOO /* Check for FOO */
    
    22 22
     complete junk!
    
    23 23
     #endif
    
    24 24
     
    
    25 25
     -- nested undef
    
    26 26
     #define AA
    
    27
    -#if 0
    
    27
    +#if /* hard code for now */ 0
    
    28 28
     #undef AA
    
    29 29
     #endif
    
    30 30
     
    

  • testsuite/tests/ghc-cpp/GhcCpp01.stderr
    ... ... @@ -217,13 +217,13 @@
    217 217
     - |#endif
    
    218 218
     
    
    219 219
     - |#undef FOO
    
    220
    -- |#ifdef FOO
    
    220
    +- |#ifdef FOO /* Check for FOO */
    
    221 221
     - |complete junk!
    
    222 222
     - |#endif
    
    223 223
     
    
    224 224
     - |-- nested undef
    
    225 225
     - |#define AA
    
    226
    -- |#if 0
    
    226
    +- |#if /* hard code for now */ 0
    
    227 227
     - |#undef AA
    
    228 228
     - |#endif
    
    229 229
     
    

  • utils/check-cpp/Lexer.x
    ... ... @@ -21,6 +21,8 @@ words :-
    21 21
         <0> $white+             ;
    
    22 22
     ---------------------------------------
    
    23 23
     
    
    24
    +    <0>         "//" .*              { mkTv TComment }
    
    25
    +    <0>         "/*" .* "*/"         { mkTv TComment }
    
    24 26
         <0>         "{"                  { mkTv TOpenBrace }
    
    25 27
         <0>         "}"                  { mkTv TCloseBrace }
    
    26 28
         <0>         "["                  { mkTv TOpenBracket }
    

  • utils/check-cpp/Main.hs
    ... ... @@ -838,3 +838,18 @@ t36 = do
    838 838
             , "#endif"
    
    839 839
             , ""
    
    840 840
             ]
    
    841
    +
    
    842
    +t37 :: IO ()
    
    843
    +t37 = do
    
    844
    +    dump
    
    845
    +        [ "{-# LANGUAGE GHC_CPP #-}"
    
    846
    +        , "module Example14 where"
    
    847
    +        , ""
    
    848
    +        , "foo ="
    
    849
    +        , "#if 1 /* and a comment */"
    
    850
    +        , "  'a'"
    
    851
    +        , "#else"
    
    852
    +        , "  'b'"
    
    853
    +        , "#endif"
    
    854
    +        , ""
    
    855
    +        ]

  • utils/check-cpp/ParsePP.hs
    ... ... @@ -27,7 +27,7 @@ parseDirective s =
    27 27
         case cppLex True s of
    
    28 28
             Left e -> Left e
    
    29 29
             Right toks ->
    
    30
    -            case toks of
    
    30
    +            case map deComment toks of
    
    31 31
                     (THash "#" : TIdentifier "define" : ts) -> cppDefine ts
    
    32 32
                     (THash "#" : TIdentifier "undef" : ts) -> Right $ cppUndef (map t_str ts)
    
    33 33
                     (THash "#" : TIdentifier "include" : ts) -> Right $ cppInclude (map t_str ts)
    
    ... ... @@ -112,6 +112,13 @@ cppLex sd s = case lexCppTokenStream s (init_state {scanning_directive = sd}) of
    112 112
         Left err -> Left err
    
    113 113
         Right (_inp, _st, toks) -> Right toks
    
    114 114
     
    
    115
    +-- Each comment is replaced with a space
    
    116
    +-- https://timsong-cpp.github.io/cppwp/n4140/lex#phases-1.3
    
    117
    +deComment :: Token -> Token
    
    118
    +deComment (TComment _) = TComment " "
    
    119
    +deComment t = t
    
    120
    +
    
    121
    +
    
    115 122
     -- ---------------------------------------------------------------------
    
    116 123
     
    
    117 124
     doATest :: String -> Either String CppDirective
    

  • utils/check-cpp/ParserM.hs
    ... ... @@ -91,6 +91,8 @@ init_state =
    91 91
     
    
    92 92
     data Token
    
    93 93
         = TEOF {t_str :: String}
    
    94
    +    | -- https://timsong-cpp.github.io/cppwp/n4140/lex.comment
    
    95
    +      TComment {t_str :: String}
    
    94 96
         | TIdentifier {t_str :: String}
    
    95 97
         | TIdentifierLParen {t_str :: String}
    
    96 98
         | TInteger {t_str :: String}