{-# OPTIONS_GHC -cpp -O #-} module HsLexUtils(module HsLexUtils,Token(..),isSymbol) where import HsTokens import qualified Data.Char as C gotEOF [] = [] gotEOF as = [(GotEOF, reverse as)] gotError as is = (ErrorToken, reverse as): if null is then [(GotEOF,[])] else [(TheRest,is{-reverse (take 80 is)-})] -- Inlining the call to output does not make a big difference. --output token as cont = (token, reverse as):cont -- Not reversing the token string seems to save about 10% of the time with HBC. -- The difference in speed seems insignificant with ghc-6.0.1 -O. output token as cont = (token,reverse as):cont -- This avoids constructing a closure for the call to reverse. -- This saves about 10% too. {- output token as cont = rev as [] where rev [] as' = (token,as'):cont rev (a:as) as' = rev as (a:as') --} #if __GLASGOW_HASKELL__>=606 isSymbol c = C.isSymbol c || C.isPunctuation c #else isSymbol _ = False #endif nestedComment as is next = nest 0 as is where nest n as is = case is of '-':'}':is -> if n==0 then next gotError ('}':'-':as) is else nest (n-1) ('}':'-':as) is '{':'-':is -> nest (n+1) ('-':'{':as) is c:is -> nest n (c:as) is _ -> gotError as is -- EOF inside comment