LexUtil.hs

-- $Id: LexUtil.hs,v 1.1 2001/11/16 22:35:52 hallgren Exp $

module LexUtil (isIdent,isLower_,  -- Char -> Bool
		isSymbol,      -- Char -> Bool
		readInteger,   -- String -> Integer
		readNumber,    -- Integer -> String -> Integer
		readRational)  -- String -> Rational

where

import HsName(isSymbol)
import Char(isDigit, isOctDigit, isHexDigit, digitToInt, isAlpha, isLower)
import Ratio

isIdent  c = isAlpha c || isDigit c || c == '\'' || c == '_'
isLower_ c = isLower c || c == '_'

readInteger :: String -> Integer
readInteger ('0':'o':ds) = readInteger2  8 isOctDigit ds
readInteger ('0':'O':ds) = readInteger2  8 isOctDigit ds
readInteger ('0':'x':ds) = readInteger2 16 isHexDigit ds
readInteger ('0':'X':ds) = readInteger2 16 isHexDigit ds
readInteger          ds  = readInteger2 10 isDigit    ds

readNumber :: Integer -> String -> Integer
readNumber radix ds = readInteger2 radix (const True) ds

readInteger2 :: Integer -> (Char -> Bool) -> String -> Integer
readInteger2 radix isDig ds 
  = foldl1 (\n d -> n * radix + d) (map (fromIntegral . digitToInt) 
				    (takeWhile isDig ds))

readRational :: String -> Rational
readRational xs
    = (readInteger (i ++ m))%1 * 10^^((case e of
				       ""       -> 0
				       ('+':e2) -> read e2
				       _        -> read e) - length m)
      where (i, r1) = span isDigit xs
	    (m, r2) = span isDigit (dropWhile (== '.') r1)
	    e       = dropWhile (== 'e') r2


Plain-text version of LexUtil.hs | Valid HTML?