module Language.JavaScript.Parser.LexerUtils (
StartCode
, symbolToken
, mkString
, commentToken
, wsToken
, regExToken
, decimalToken
, endOfFileToken
, assignToken
, hexIntegerToken
, octalToken
, stringToken
) where
import Language.JavaScript.Parser.Token as Token
import Language.JavaScript.Parser.SrcLocation
import Prelude hiding (span)
type StartCode = Int
symbolToken :: Monad m => (TokenPosn -> [CommentAnnotation] -> Token) -> TokenPosn -> Int -> String -> m Token
symbolToken mkToken location _ _ = return (mkToken location [])
endOfFileToken :: Token
endOfFileToken = EOFToken tokenPosnEmpty []
mkString
:: (Monad m) => (TokenPosn -> String -> Token) -> TokenPosn -> Int -> String -> m Token
mkString toToken loc len str = do return (toToken loc (take len str))
decimalToken :: TokenPosn -> String -> Token
decimalToken loc str = DecimalToken loc str []
hexIntegerToken :: TokenPosn -> String -> Token
hexIntegerToken loc str = HexIntegerToken loc str []
octalToken :: TokenPosn -> String -> Token
octalToken loc str = OctalToken loc str []
assignToken :: TokenPosn -> String -> Token
assignToken loc str = AssignToken loc str []
regExToken :: TokenPosn -> String -> Token
regExToken loc str = RegExToken loc str []
stringToken :: TokenPosn -> String -> Token
stringToken loc str = StringToken loc str1 delimiter []
where
str1 = init $ tail str
delimiter = head str
commentToken :: TokenPosn -> String -> Token
commentToken loc str = CommentToken loc str []
wsToken :: TokenPosn -> String -> Token
wsToken loc str = WsToken loc str []
stripLineContinuations :: String -> String
stripLineContinuations xs = doStripLineContinuations [] [] xs
doStripLineContinuations :: String -> String -> String -> String
doStripLineContinuations acc matched xs
| xs == [] = acc
| matched == [] = if (head xs == '\\')
then doStripLineContinuations acc ['\\'] (tail xs)
else doStripLineContinuations (acc ++ [head xs]) [] (tail xs)
| otherwise = if ((head xs == '\n') || (head xs == '\r') || (head xs == '\x2028') || (head xs == '\x2029'))
then doStripLineContinuations acc (matched++[head xs]) (tail xs)
else (if (matched == ['\\'])
then doStripLineContinuations (acc++matched ++ [head xs]) [] (tail xs)
else doStripLineContinuations (acc++[head xs]) [] (tail xs))