X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fparser%2FLexCore.hs;h=936786d9491008266127987380077d86072a2d86;hb=317fc69d18eda68fd65f5ba634feafbe4a3923da;hp=1a545a3e43b79d2998197b031094b5dcb303d540;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/parser/LexCore.hs b/compiler/parser/LexCore.hs index 1a545a3..936786d 100644 --- a/compiler/parser/LexCore.hs +++ b/compiler/parser/LexCore.hs @@ -3,9 +3,10 @@ module LexCore where import ParserCoreUtils import Ratio import Char -import qualified Numeric( readFloat, readDec ) +import Numeric -isNameChar c = isAlpha c || isDigit c || (c == '_') || (c == '\'') +isNameChar c = isAlpha c || isDigit c || (c == '_') || (c == '\'') + || (c == ':') || (c == '$') isKeywordChar c = isAlpha c || (c == '_') lexer :: (Token -> P a) -> P a @@ -35,6 +36,10 @@ lexer cont ('\\':cs) = cont TKlambda cs lexer cont ('@':cs) = cont TKat cs lexer cont ('?':cs) = cont TKquestion cs lexer cont (';':cs) = cont TKsemicolon cs +-- 20060420 GHC spits out constructors with colon in them nowadays. jds +lexer cont (':':cs) = lexName cont TKcname (':':cs) +-- 20060420 Likewise does it create identifiers starting with dollar. jds +lexer cont ('$':cs) = lexName cont TKname ('$':cs) lexer cont (c:cs) = failP "invalid character" [c] @@ -86,45 +91,9 @@ lexKeyword cont cs = ("in",rest) -> cont TKin rest ("case",rest) -> cont TKcase rest ("of",rest) -> cont TKof rest - ("coerce",rest) -> cont TKcoerce rest + ("cast",rest) -> cont TKcast rest ("note",rest) -> cont TKnote rest ("external",rest) -> cont TKexternal rest ("_",rest) -> cont TKwild rest _ -> failP "invalid keyword" ('%':cs) - -#if __GLASGOW_HASKELL__ >= 504 --- The readFloat in the Numeric library will do the job - -readFloat :: (RealFrac a) => ReadS a -readFloat = Numeric.readFloat - -#else --- Haskell 98's Numeric.readFloat used to have a bogusly restricted signature --- so it was incapable of reading a rational. --- So for GHCs that have that old bogus library, here is the code, written out longhand. - -readFloat r = [(fromRational ((n%1)*10^^(k-d)),t) | (n,d,s) <- readFix r, - (k,t) <- readExp s] ++ - [ (0/0, t) | ("NaN",t) <- lex r] ++ - [ (1/0, t) | ("Infinity",t) <- lex r] - where - readFix r = [(read (ds++ds'), length ds', t) - | (ds,d) <- lexDigits r, - (ds',t) <- lexFrac d ] - - lexFrac ('.':ds) = lexDigits ds - lexFrac s = [("",s)] - - readExp (e:s) | e `elem` "eE" = readExp' s - readExp s = [(0,s)] - - readExp' ('-':s) = [(-k,t) | (k,t) <- Numeric.readDec s] - readExp' ('+':s) = Numeric.readDec s - readExp' s = Numeric.readDec s - -lexDigits :: ReadS String -lexDigits s = case span isDigit s of - (cs,s') | not (null cs) -> [(cs,s')] - otherwise -> [] -#endif