Advertisement
Guest User

Untitled

a guest
Apr 21st, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. module Regex.Parse (regexFromString) where
  2.  
  3. import Text.ParserCombinators.Parsec
  4. import Text.ParserCombinators.Parsec.Combinator
  5. import Data.List
  6. import Regex.Types
  7.  
  8.  
  9. parseRegex :: Parser Rx
  10. parseRegex = choice [ try parsePipes, try parseConcat, try parseStar, try parseParens, try parseAlphaNum ]
  11.  
  12. parsePipes :: Parser Rx
  13. parsePipes = do
  14. r1 <- parseRegex'
  15. char '|'
  16. r2 <- parseRegex
  17. return $ Union r1 r2
  18. where parseRegex' = choice [ try parseConcat, try parseStar, try parseParens, try parseAlphaNum ]
  19.  
  20. parseConcat :: Parser Rx
  21. parseConcat = do
  22. r1 <- parseRegex'
  23. r2 <- parseRegex''
  24. return $ Concat r1 r2
  25. where parseRegex' = choice [ try parseStar, try parseParens, try parseAlphaNum ]
  26. parseRegex'' = choice [ try parseConcat, try parseStar, try parseParens, try parseAlphaNum ]
  27.  
  28. parseStar :: Parser Rx
  29. parseStar = do
  30. r <- parseRegex'
  31. char '*'
  32. return $ Star r
  33. where parseRegex' = choice [ try parseParens, try parseAlphaNum ]
  34.  
  35. parseParens :: Parser Rx
  36. parseParens = do
  37. char '('
  38. a <- parseRegex
  39. char ')'
  40. return a
  41.  
  42. parseAlphaNum :: Parser Rx
  43. parseAlphaNum = do
  44. c <- alphaNum
  45. return $ Single c
  46.  
  47. regexFromString :: String -> Maybe Rx
  48. regexFromString str = case (parse parseRegex "Failed to parse regex." str) of
  49. Right s -> Just s
  50. otherwise -> Nothing
  51.  
  52. -- main = print $ regexFromString "a(b)*|(cd|e*f*)*"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement