diff options
| -rw-r--r-- | src/Parser.hs | 31 | 
1 files changed, 26 insertions, 5 deletions
| diff --git a/src/Parser.hs b/src/Parser.hs index 2b6f14d..4b98dde 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -80,15 +80,36 @@ procName = label "process name" $ lexeme $ do  quotedString :: TestParser Text  quotedString = label "string" $ lexeme $ do      symbol "\"" -    str <- takeWhileP Nothing (/='"') -    symbol "\"" -    return $ TL.toStrict str +    let inner = choice +            [ char '"' >> return [] +            , takeWhile1P Nothing (`notElem` "\"\\") >>= \s -> (s:) <$> inner +            ,do void $ char '\\' +                c <- choice +                    [ char '\\' >> return '\\' +                    , char '"' >> return '"' +                    , char '$' >> return '$' +                    , char 'n' >> return '\n' +                    , char 'r' >> return '\r' +                    , char 't' >> return '\t' +                    ] +                (TL.singleton c:) <$> inner +            ] +    TL.toStrict . TL.concat <$> inner  regex :: TestParser (Regex, Text)  regex = label "regular expression" $ lexeme $ do      symbol "/" -    pat <- takeWhileP Nothing (/='/') -    symbol "/" +    let inner = choice +            [ char '/' >> return [] +            , takeWhile1P Nothing (`notElem` "/\\") >>= \s -> (s:) <$> inner +            ,do void $ char '\\' +                s <- choice +                    [ char '/' >> return (TL.singleton '/') +                    , anySingle >>= \c -> return (TL.pack ['\\', c]) +                    ] +                (s:) <$> inner +            ] +    pat <- TL.concat <$> inner      case compile defaultCompOpt defaultExecOpt ("^" ++ TL.unpack pat ++ "$") of           Left err -> fail err           Right re -> return (re, TL.toStrict pat) |