{-# LINE 1 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- Alex wrapper code. -- -- This code is in the PUBLIC DOMAIN; you may copy it freely and use -- it for any purpose whatsoever. import Data.Word (Word8) import qualified Data.Char import qualified Data.ByteString as ByteString import qualified Data.ByteString.Internal as ByteString hiding (ByteString) import qualified Data.ByteString.Unsafe as ByteString type Byte = Word8 -- ----------------------------------------------------------------------------- -- The input type data AlexInput = AlexInput { alexChar :: {-# UNPACK #-} !Char, alexStr :: {-# UNPACK #-} !ByteString.ByteString, alexBytePos :: {-# UNPACK #-} !Int} alexInputPrevChar :: AlexInput -> Char alexInputPrevChar = alexChar alexGetByte (AlexInput {alexStr=cs,alexBytePos=n}) = case ByteString.uncons cs of Nothing -> Nothing Just (c, rest) -> Just (c, AlexInput { alexChar = ByteString.w2c c, alexStr = rest, alexBytePos = n+1}) -- ----------------------------------------------------------------------------- -- Token positions -- `Posn' records the location of a token in the input text. It has three -- fields: the address (number of chacaters preceding the token), line number -- and column of a token within the file. `start_pos' gives the position of the -- start of the file and `eof_pos' a standard encoding for the end of file. -- `move_pos' calculates the new position after traversing a given character, -- assuming the usual eight character tab stops. -- ----------------------------------------------------------------------------- -- Monad (default and with ByteString input) -- ----------------------------------------------------------------------------- -- Basic wrapper -- ----------------------------------------------------------------------------- -- Basic wrapper, ByteString version -- alexScanTokens :: ByteString.ByteString -> [token] alexScanTokens str = go (AlexInput '\n' str 0) where go inp__ = case alexScan inp__ 0 of AlexEOF -> [] AlexError _ -> error "lexical error" AlexSkip inp__' _len -> go inp__' AlexToken inp__' _ act -> let len = alexBytePos inp__' - alexBytePos inp__ in act (ByteString.take len (alexStr inp__)) : go inp__' -- ----------------------------------------------------------------------------- -- Posn wrapper -- Adds text positions to the basic model. -- ----------------------------------------------------------------------------- -- Posn wrapper, ByteString version -- ----------------------------------------------------------------------------- -- GScan wrapper -- For compatibility with previous versions of Alex, and because we can.