module Data.BEncode.Lexer where import Data.Char import qualified Data.ByteString.Char8 as BS import Data.ByteString (ByteString) data Token = TDict | TList | TInt | TString ByteString | TNumber Int | TEnd deriving (Show,Eq) lexer :: ByteString -> [Token] lexer fs | BS.null fs = [] lexer fs = case ch of 'd' -> TDict : lexer rest 'l' -> TList : lexer rest 'i' -> TInt : lexer rest 'e' -> TEnd : lexer rest '-' -> let (digits,rest') = BS.span isDigit rest number = read (BS.unpack digits) in TNumber (-number) : lexer rest' _ | isDigit ch -> let (digits,rest') = BS.span isDigit fs number = read (BS.unpack digits) in if BS.null rest' then [TNumber number] else case BS.head rest' of ':' -> let (str, rest'') = BS.splitAt number (BS.tail rest') in TString str : lexer rest'' _ -> TNumber number : lexer rest' | otherwise -> error "Lexer error." where ch = BS.head fs rest = BS.tail fs