{-#Language QuasiQuotes#-} module Text.Alex.AlexTemplate where import AbsSyn -- import Text.Alex.Verbatim {- alexTemplate GhcTarget = [verbatim| -- ----------------------------------------------------------------------------- -- ALEX TEMPLATE -- -- This code is in the PUBLIC DOMAIN; you may copy it freely and use -- it for any purpose whatsoever. -- ----------------------------------------------------------------------------- -- INTERNALS and main scanner engine {-# LINE 37 "templates\\GenericTemplate.hs" #-} {-# LINE 47 "templates\\GenericTemplate.hs" #-} data AlexAddr = AlexA# Addr# -- Never happens -- #if __GLASGOW_HASKELL__ < 503 -- uncheckedShiftL# = shiftL# -- #endif {-# INLINE alexIndexInt16OffAddr #-} alexIndexInt16OffAddr (AlexA# arr) off = |] ++ #ifdef WORDS_BIGENDIAN [verbatim| narrow16Int# i where i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low) high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#))) low = int2Word# (ord# (indexCharOffAddr# arr off')) off' = off *# 2# |] #else [verbatim| indexInt16OffAddr# arr off |] #endif ++ [verbatim| {-# INLINE alexIndexInt32OffAddr #-} alexIndexInt32OffAddr (AlexA# arr) off = |] ++ #ifdef WORDS_BIGENDIAN [verbatim| narrow32Int# i where !i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#` (b2 `uncheckedShiftL#` 16#) `or#` (b1 `uncheckedShiftL#` 8#) `or#` b0) !b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#))) !b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#))) !b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#))) !b0 = int2Word# (ord# (indexCharOffAddr# arr off')) !off' = off *# 4# |] #else [verbatim| indexInt32OffAddr# arr off |] #endif ++ [verbatim| -- Never happens -- #if __GLASGOW_HASKELL__ < 503 -- quickIndex arr i = arr ! i -- #else -- GHC >= 503, unsafeAt is available from Data.Array.Base. quickIndex = unsafeAt -- #endif -- ----------------------------------------------------------------------------- -- Main lexing routines data AlexReturn a = AlexEOF | AlexError !AlexInput | AlexSkip !AlexInput !Int | AlexToken !AlexInput !Int a -- alexScan :: AlexInput -> StartCode -> AlexReturn a alexScan input (I# (sc)) = alexScanUser undefined input (I# (sc)) alexScanUser user input (I# (sc)) = case alex_scan_tkn user input 0# input sc AlexNone of (AlexNone, input') -> case alexGetByte input of Nothing -> AlexEOF Just _ -> AlexError input' (AlexLastSkip input'' len, _) -> AlexSkip input'' len (AlexLastAcc k input''' len, _) -> AlexToken input''' len k -- Push the input through the DFA, remembering the most recent accepting -- state it encountered. alex_scan_tkn user orig_input len input s last_acc = input `seq` -- strict in the input let new_acc = (check_accs (alex_accept `quickIndex` (I# (s)))) in new_acc `seq` case alexGetByte input of Nothing -> (new_acc, input) Just (c, new_input) -> let (base) = alexIndexInt32OffAddr alex_base s ((I# (ord_c))) = fromIntegral c (offset) = (base +# ord_c) (check) = alexIndexInt16OffAddr alex_check offset (new_s) = if (offset >=# 0#) && (check ==# ord_c) then alexIndexInt16OffAddr alex_table offset else alexIndexInt16OffAddr alex_deflt s in case new_s of -1# -> (new_acc, input) -- on an error, we want to keep the input *before* the -- character that failed, not after. _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len) -- note that the length is increased ONLY if this is the 1st byte in a char encoding) new_input new_s new_acc where check_accs [] = last_acc check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len)) check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len)) check_accs (AlexAccPred a predx : rest) | predx user orig_input (I# (len)) input = AlexLastAcc a input (I# (len)) check_accs (AlexAccSkipPred predx : rest) | predx user orig_input (I# (len)) input = AlexLastSkip input (I# (len)) check_accs (_ : rest) = check_accs rest data AlexLastAcc a = AlexNone | AlexLastAcc a !AlexInput !Int | AlexLastSkip !AlexInput !Int instance Functor AlexLastAcc where fmap f AlexNone = AlexNone fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z fmap f (AlexLastSkip x y) = AlexLastSkip x y data AlexAcc a user = AlexAcc a | AlexAccSkip | AlexAccPred a (AlexAccPred user) | AlexAccSkipPred (AlexAccPred user) type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool -- ----------------------------------------------------------------------------- -- Predicates on a rule alexAndPred p1 p2 user in1 len in2 = p1 user in1 len in2 && p2 user in1 len in2 --alexPrevCharIsPred :: Char -> AlexAccPred _ alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input alexPrevCharMatches f _ input _ _ = f (alexInputPrevChar input) --alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input --alexRightContext :: Int -> AlexAccPred _ alexRightContext (I# (sc)) user _ _ input = case alex_scan_tkn user input 0# input sc AlexNone of (AlexNone, _) -> False _ -> True -- TODO: there's no need to find the longest -- match when checking the right context, just -- the first match will do. -- used by wrappers iUnbox (I# (i)) = i |] -} -- This code is in the PUBLIC DOMAIN; you may copy it freely and use -- it for any purpose whatsoever. alexTemplate :: p -> String alexTemplate p _ = [String] -> String unlines[ String "alexIndexInt16OffAddr arr off = arr ! off", String "alexIndexInt32OffAddr arr off = arr ! off", String "quickIndex arr i = arr ! i", String "-- -----------------------------------------------------------------------------", String "-- Main lexing routines", String "", String "data AlexReturn a", String " = AlexEOF", String " | AlexError !AlexInput", String " | AlexSkip !AlexInput !Int", String " | AlexToken !AlexInput !Int a", String "", String "-- alexScan :: AlexInput -> StartCode -> AlexReturn a", String "alexScan input (sc)", String " = alexScanUser undefined input (sc)", String "", String "alexScanUser user input (sc)", String " = case alex_scan_tkn user input (0) input sc AlexNone of", String "\t(AlexNone, input') ->", String "\t\tcase alexGetByte input of", String "\t\t\tNothing -> ", String "", String "", String "", String "\t\t\t\t AlexEOF", String "\t\t\tJust _ ->", String "", String "", String "", String "\t\t\t\t AlexError input'", String "", String "\t(AlexLastSkip input'' len, _) ->", String "", String "", String "", String "\t\tAlexSkip input'' len", String "", String "\t(AlexLastAcc k input''' len, _) ->", String "", String "", String "", String "\t\tAlexToken input''' len k", String "", String "", String "-- Push the input through the DFA, remembering the most recent accepting", String "-- state it encountered.", String "", String "alex_scan_tkn user orig_input len input s last_acc =", String " input `seq` -- strict in the input", String " let ", String "\tnew_acc = (check_accs (alex_accept `quickIndex` (s)))", String " in", String " new_acc `seq`", String " case alexGetByte input of", String " Nothing -> (new_acc, input)", String " Just (c, new_input) -> ", String "", String "", String "", String "\tlet", String "\t\t(base) = alexIndexInt32OffAddr alex_base s", String "\t\t((ord_c)) = fromIntegral c", String "\t\t(offset) = (base + ord_c)", String "\t\t(check) = alexIndexInt16OffAddr alex_check offset", String "\t\t", String "\t\t(new_s) = if (offset >= (0)) && (check == ord_c)", String "\t\t\t then alexIndexInt16OffAddr alex_table offset", String "\t\t\t else alexIndexInt16OffAddr alex_deflt s", String "\tin", String "\tcase new_s of ", String "\t (-1) -> (new_acc, input)", String "\t\t-- on an error, we want to keep the input *before* the", String "\t\t-- character that failed, not after.", String " \t _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len + (1)) else len)", String " -- note that the length is increased ONLY if this is the 1st byte in a char encoding)", String "\t\t\tnew_input new_s new_acc", String "", String " where", String "\tcheck_accs [] = last_acc", String "\tcheck_accs (AlexAcc a : _) = AlexLastAcc a input (len)", String "\tcheck_accs (AlexAccSkip : _) = AlexLastSkip input (len)", String "\tcheck_accs (AlexAccPred a predx : rest)", String "\t | predx user orig_input (len) input", String "\t = AlexLastAcc a input (len)", String "\tcheck_accs (AlexAccSkipPred predx : rest)", String "\t | predx user orig_input (len) input", String "\t = AlexLastSkip input (len)", String "\tcheck_accs (_ : rest) = check_accs rest", String "", String "data AlexLastAcc a", String " = AlexNone", String " | AlexLastAcc a !AlexInput !Int", String " | AlexLastSkip !AlexInput !Int", String "", String "instance Functor AlexLastAcc where", String " fmap f AlexNone = AlexNone", String " fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z", String " fmap f (AlexLastSkip x y) = AlexLastSkip x y", String "", String "data AlexAcc a user", String " = AlexAcc a", String " | AlexAccSkip", String " | AlexAccPred a (AlexAccPred user)", String " | AlexAccSkipPred (AlexAccPred user)", String "", String "type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool", String "", String "-- -----------------------------------------------------------------------------", String "-- Predicates on a rule", String "", String "alexAndPred p1 p2 user in1 len in2", String " = p1 user in1 len in2 && p2 user in1 len in2", String "", String "--alexPrevCharIsPred :: Char -> AlexAccPred _ ", String "alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input", String "", String "alexPrevCharMatches f _ input _ _ = f (alexInputPrevChar input)", String "", String "--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ ", String "alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input", String "", String "--alexRightContext :: Int -> AlexAccPred _", String "alexRightContext (sc) user _ _ input = ", String " case alex_scan_tkn user input (0) input sc AlexNone of", String "\t (AlexNone, _) -> False", String "\t _ -> True", String "\t-- TODO: there's no need to find the longest", String "\t-- match when checking the right context, just", String "\t-- the first match will do.", String "", String "-- used by wrappers", String "iUnbox (i) = i" ]