Changeset 7 for src/Lexer.hs
- Timestamp:
- 02/09/05 06:00:26 (4 years ago)
- svk:copy_cache_prev:
- 1041
- Files:
-
- 1 modified
-
src/Lexer.hs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Lexer.hs
r5 r7 19 19 , P.commentLine = "#" 20 20 , P.nestedComments = False 21 , P.identStart = letter <|> oneOf "_:$@%&"22 , P.identLetter = alphaNum <|> oneOf "_ :"21 , P.identStart = letter <|> char '_' 22 , P.identLetter = alphaNum <|> oneOf "_" 23 23 , P.reservedNames = words $ 24 24 "if then else do while skip" … … 46 46 float = P.float perl6Lexer 47 47 lexeme = P.lexeme perl6Lexer 48 identifier = P.identifier perl6Lexer 49 braces = P.braces perl6Lexer 50 brackets = P.brackets perl6Lexer 48 51 stringLiteral = choice 49 52 [ P.stringLiteral perl6Lexer … … 51 54 ] 52 55 53 naturalOrFloat = lexeme (natFloat) <?> "number" 56 naturalOrRat = do 57 b <- lexeme sign 58 n <- lexeme natRat 59 return $ if b 60 then n 61 else case n of 62 Left x -> Left $ -x 63 Right y -> Right $ -y 64 <?> "number" 54 65 where 55 nat Float = do{ char '0'56 ; zeroNumFloat57 }58 <|> decimalFloat66 natRat = do 67 char '0' 68 zeroNumRat 69 <|> decimalRat 59 70 60 zeroNum Float = do{ n <- hexadecimal <|> octal <|> binary61 ; return (Left n)62 }63 <|> decimalFloat64 <|> fractFloat 065 <|> return (Left 0)71 zeroNumRat = do 72 n <- hexadecimal <|> octal <|> binary 73 return (Left n) 74 <|> decimalRat 75 <|> fractRat 0 76 <|> return (Left 0) 66 77 67 decimalFloat = do{ n <- decimal 68 ; option (Left n) 69 (try $ fractFloat n) 70 } 78 decimalRat = do 79 n <- decimal 80 option (Left n) (try $ fractRat n) 71 81 72 fractFloat n = do{ f <- fractExponent n 73 ; return (Right f) 74 } 75 76 fractExponent n = do{ fract <- fraction 77 ; expo <- option 1.0 exponent' 78 ; return ((fromInteger n + fract)*expo) 79 } 80 <|> 81 do{ expo <- exponent' 82 ; return ((fromInteger n)*expo) 83 } 82 fractRat n = do 83 fract <- try fraction 84 expo <- option (1%1) expo 85 return (Right $ ((n % 1) + fract) * expo) -- Right is Rat 86 <|> do 87 expo <- expo 88 if expo < 1 89 then return (Left $ n * numerator expo) 90 else return (Right $ (n % 1) * expo) 84 91 85 fraction = do{ char '.' 86 ; digits <- many digit <?> "fraction" 87 ; return (foldr op 0.0 digits) 88 } 89 <?> "fraction" 90 where 91 op d f = (f + fromIntegral (digitToInt d))/10.0 92 93 exponent' = do{ oneOf "eE" 94 ; f <- sign 95 ; e <- decimal <?> "exponent" 96 ; return (power (f e)) 97 } 98 <?> "exponent" 99 where 100 power e | e < 0 = 1.0/power(-e) 101 | otherwise = fromInteger (10^e) 92 fraction = do 93 char '.' 94 try $ do { char '.'; unexpected "dotdot" } <|> return () 95 digits <- many digit <?> "fraction" 96 return (digitsToRat digits) 97 <?> "fraction" 98 where 99 digitsToRat d = digitsNum d % (10 ^ length d) 100 digitsNum d = foldl (\x y -> x * 10 + (toInteger $ digitToInt y)) 0 d 102 101 102 expo :: GenParser Char st Rational 103 expo = do 104 oneOf "eE" 105 f <- sign 106 e <- decimal <?> "exponent" 107 return (power (if f then e else -e)) 108 <?> "exponent" 109 where 110 power e | e < 0 = 1 % (10^e) 111 | otherwise = (10^e) % 1 103 112 104 -- integers and naturals105 int = do{ f <- lexeme sign106 ; n <- nat107 ; return (f n)108 }109 110 113 -- sign :: CharParser st (Integer -> Integer) 111 sign = (char '-' >> return negate)112 <|> (char '+' >> return id)113 <|> return id114 sign = (char '-' >> return False) 115 <|> (char '+' >> return True) 116 <|> return True 114 117 115 118 nat = zeroNumber <|> decimal
