{-# LINE 1 "templates/wrappers.hs" #-} {-# LINE 1 "templates/wrappers.hs" #-} {-# LINE 1 "" #-} {-# 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 Control.Applicative (Applicative (..)) import Data.Word (Word8) import qualified Data.Char import qualified Data.ByteString as ByteString import qualified Data.ByteString.Internal as ByteString import qualified Data.ByteString.Unsafe as ByteString {-# LINE 48 "templates/wrappers.hs" #-} type Byte = Word8 -- ----------------------------------------------------------------------------- -- The input type {-# LINE 73 "templates/wrappers.hs" #-} {-# LINE 93 "templates/wrappers.hs" #-} {-# LINE 107 "templates/wrappers.hs" #-} data AlexInput = AlexInput { alexChar :: {-# UNPACK #-}!Char , alexStr :: {-# UNPACK #-}!ByteString.ByteString } alexInputPrevChar :: AlexInput -> Char alexInputPrevChar = alexChar alexGetByte (AlexInput _ cs) | ByteString.null cs = Nothing | otherwise = Just $! (ByteString.head cs, AlexInput c cs') where (c,cs') = (ByteString.w2c (ByteString.unsafeHead cs) , ByteString.unsafeTail cs) -- ----------------------------------------------------------------------------- -- 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. {-# LINE 145 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- Default monad {-# LINE 256 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- Monad (with ByteString input) {-# LINE 347 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- Basic wrapper {-# LINE 374 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- Basic wrapper, ByteString version {-# LINE 392 "templates/wrappers.hs" #-} -- alexScanTokens :: String -> [token] alexScanTokens str = go (AlexInput '\n' str) where go inp@(AlexInput _ str) = case alexScan inp 0 of AlexEOF -> [] AlexError _ -> error "lexical error" AlexSkip inp' len -> go inp' AlexToken inp'@(AlexInput _ str') _ act -> act (ByteString.unsafeTake len str) : go inp' where len = ByteString.length str - ByteString.length str' -- ----------------------------------------------------------------------------- -- Posn wrapper -- Adds text positions to the basic model. {-# LINE 423 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- Posn wrapper, ByteString version {-# LINE 438 "templates/wrappers.hs" #-} -- ----------------------------------------------------------------------------- -- GScan wrapper -- For compatibility with previous versions of Alex, and because we can.